欢迎大家来到IT世界,在知识的湖畔探索吧!
简介
分词是把全文本拆分成一系列单词的过程。
分词器是用来实现分词的,分词由三部分组成:字符过滤器、分词器和Token过滤器。
字符过滤器:对原始文本进行过滤;
分词器:按照一定规则进行分词;
Token过滤器:对分词进行处理,转小写,移除停用词,添加同义词。
Analyzer 类图
StandardAnalyzer分词
Lucene提供的标准中文分词器 StandardAnalyzer只能进行简单的一元分词,一元分词以一个字为单位进行语义切分,这种本来为西文所设计的分词器,用于中文的分词时经常会出现语义不准确的情况。StandardAnalyzer分词器是按照中文一个字一个字地进行分词,效率比较低。如:“我是一个中国人”,效果:“我”、“是”、“一”、“个”、“中”、“国”、“人”。
不同的Lucene分析器Analyzer,它对TokenStream进行分词的方法是不同的,这需要根据具体的语言来选择。比如英文,一般是通过空格来分割词条,而中文汉字则不能通过这种方式,最简单的方式就是单个汉字作为一个词条。
TokenStream是通过从设备或者其他地方获取数据源而构造的一个流,我们要执行分词的动作,应该对这个TokenStream进行操作。
public class AnalyzerTest { @Test public void standardAnalyzer() throws Exception { String content = "我是一个中国人"; Analyzer analyzer = new StandardAnalyzer(); TokenStream tokenStream = analyzer.tokenStream("content", content); tokenStream.reset(); CharTermAttribute cta = tokenStream.getAttribute(CharTermAttribute.class); while (tokenStream.incrementToken()) { System.out.println(cta); } } }
欢迎大家来到IT世界,在知识的湖畔探索吧!
输出结果:
我
是
一
个
中
国
人
由此可以得知,StandardAnalyzer采用的是一元分词,即字符串以一个字为单位进行切割。
CJKAnalyzer分词器
按两个字进行切分,把相邻的两个字组成词分解出来,效率也比较低。并且不少状况下分的词不对。如:“我是一个中国人”,效果:“我是”、“是一”、“一个”、“个中”、“中国”、“国人”。通过分词结果可以看到,CJKAnalyzer 采用的是二元分词,即字符串以两个字为单位进行切割。
欢迎大家来到IT世界,在知识的湖畔探索吧!@Test public void CJKAnalyzer() throws Exception { Analyzer analyzer = new CJKAnalyzer(); String content = "我是一个中国人"; TokenStream tokenStream = analyzer.tokenStream("content", content); tokenStream.reset(); CharTermAttribute cta = tokenStream.getAttribute(CharTermAttribute.class); while (tokenStream.incrementToken()) { System.out.println(cta); } }
SmartChineseAnalyzer分词器
analyzers-smartcn 是一个用于简体中文索引词的 Analyzer。尝试使用中文文本分割成单词作为标记。如:“我是一个中国人”,效果:“我”、“是”、“一个”、“中国”、“人”。
@Test public void SmartChineseAnalyzer() throws Exception { Analyzer analyzer = new SmartChineseAnalyzer(); String content = "我是一个中国人"; TokenStream tokenStream = analyzer.tokenStream("content", content); tokenStream.reset(); CharTermAttribute cta = tokenStream.getAttribute(CharTermAttribute.class); while (tokenStream.incrementToken()) { System.out.println(cta); } }
IKAnalyzer分词器
按某种算法构造词,而后去匹配已建好的词库集合,若是匹配到就切分出来成为词语。一般词库分词被认为是最理想的中文分词算法。如:“我是一个中国人”,效果:“一个中国”、“一个”、“个中”、“中国人”、“中国”、“国人”。可以看到,分词效果比单纯的一元或者二元分词要好很多。
欢迎大家来到IT世界,在知识的湖畔探索吧!@Test public void ikAnalyzer() throws Exception { IKAnalyzer analyzer = new IKAnalyzer(); String content = "我是一个中国人,我热爱我的国家"; TokenStream tokenStream = analyzer.tokenStream("content", content); tokenStream.reset(); CharTermAttribute cta = tokenStream.getAttribute(CharTermAttribute.class); while (tokenStream.incrementToken()) { System.out.println(cta); } }
输出结果:
加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
一个中国
一个
个中
中国人
中国
国人
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/86607.html