上篇文章已经实现了luncene的基础功能,满足正常需要,可是有时间很多情况下我们不需要语义分词那么精确,比如一些人名,什么的,,我们并不想拆分,所以就需要停用词和扩展词这些功能进行满足:
IK的两个重要词典
扩展词典:为的是让需要切分的字符串的词语 根据扩展词典里的词,不要切分开来。
例如:扩展词典中有:中国的台湾 。那么原本会切分成:中国 的 台湾 在 东海 。会切分成:中国的台湾 在 东海
停止词典:对比停止词典,直接删掉停止词典中出现的词语
1.首先对自己的停用词和扩展词进行整理写入文档,
2.扩展词的含义就是,比如“我叫杨小倩” 正常语义拆分会拆成:“我”,“叫”,“我叫”,“杨”,“小”,“倩”,等多种结果,可是如果扩展词文档里面配置了“杨小倩”,拆分的时候会当成整体“我”,“叫”,“杨小倩”等
3.同样停用词的含义就是,不用查询的有些词,比如量词“个”等等,不需要查询的词语,导致搜索结果匹配太多
4.进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<entry key="ext_dict">extend.dic</entry>
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
5,进行测试:
IKAnalyzerSupport
package com.yunqi.cms.common;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import com.alibaba.druid.util.StringUtils;
import com.beust.jcommander.internal.Lists;
public class IKAnalyzerSupport {
/**
* IK分词测试
* @param target
* @return
*/
public static List<String> iKSegmenterToList(String target) throws Exception {
if (StringUtils.isEmpty(target)){
return Lists.newArrayList();
}
List<String> result = new ArrayList<>();
StringReader sr = new StringReader(target);
// 关闭智能分词 (对分词的精度影响较大)
IKSegmenter ik = new IKSegmenter(sr, false);
Lexeme lex;
while((lex=ik.next())!=null) {
String lexemeText = lex.getLexemeText();
result.add(lexemeText);
}
//LOGGER.info("company:{}, iKSegmenterToList:{}", target, JSON.toJSON(result));
return result;
}
public static void main(String[] args) throws Exception {
String str="江一平";
//String str="http://www.relaxheart.cn 是王琦同学的个人兴趣分享网站";
System.out.println(iKSegmenterToList(str));
}
}
网友评论