前言:最近由于Java开发小组内人手不够,被放进了这个小组。于是乎,走上了工程型开发的道路。嗯,道阻且长,道阻且长。
现整理归纳一下开发心得(温和、虔诚、坚持)和技术收获:
一:批量读写数据(mapper 和 xml文件之间的配合)
DimValXXX这个是我的自定义实体类名。现需要将其批量的数据写入数据库,mapper文件如下:
boolean batchInsertDimValTag(@Param(value="list") List<DimValTagNewQaDB> list);
xml文件如下:
<insert id="batchInsertDimValTag">
insert all
<foreach collection="list" item="item" separator="" open="" close="" index="i">
into dim_val_tag_new_QA(dim_value_id,dim_tag_id,v) values (#{item.dim_value_id},#{item.dim_tag_id},#{item.v})
</foreach>
select 1 from dual
</insert>
二:数据库的左连接右连接。(这个之前专门写过介绍SQL的帖子。)
三:Hanlp分词与词频统计,以及可以替换自定义用户词典。
其中content表示待分词的文本字符串,topNum表示期望输出的前X个高频词语。
public List segment(String content, int topNum) {
String filterStr = "`~!@#$^&*()=|{}':;',\[\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ";
System.out.println("首次编译运行时,HanLP会自动构建词典缓存,请稍候……
");
//第一次运行会有文件找不到的错误但不影响运行,缓存完成后就不会再有了
System.out.println("标准分词:");
System.out.println("
");
//Map<String, WordLabe> extractLabelMap = new HashMap<String, WordLabe>(16);
Map<String ,Integer> word_Fren = new HashMap<String, Integer>(16);
List<Term> termList = HanLP.segment(content);
List<String> list = termList.stream().map(a -> a.word).filter(s -> !filterStr.contains(s)).collect(Collectors.toList());
//计算词频并封装在ExtractLaabelDto
for (String word : list){
if(word == null || word.equals("null")){
continue;
}
//判断不存在则新增(去重)
if(word_Fren.get(word) == null){
//计算获取词频(获取Word在list中重复的次数)
// int count = Collections.frequency(list,word);
word_Fren.put(word, 1);
}
else{
int count = word_Fren.get(word);
word_Fren.put(word,count+1);
}
}
System.out.println("统计完词频的结果:");
System.out.println(word_Fren);
//map转list
List<Map.Entry<String,Integer>> word_Fren_list = new ArrayList<>(word_Fren.entrySet());
System.out.println("转化为list之后的结果:");
System.out.println(word_Fren_list);
//对list进行排序,并通过Comparator传入自定义的排序规则
Collections.sort(word_Fren_list,new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue()); //重写排序规则,降序排列。o1和o2替换位置的话,为升序排列。
}
});
System.out.println("排序之后的结果:");
System.out.println(word_Fren_list);
List<String> result = new ArrayList<String>();
int size = word_Fren_list.size()-1;
//输出前topNum个词语。
for(int i=0;i<=topNum;i++){
String key = word_Fren_list.get(i).getKey();
result.add(key);
}
return result;
}