垂直化搜索引擎二之分词器

垂直化搜索引擎二之分词器简介分词是把全文本拆分成一系列单词的过程 分词器是用来实现分词的 分词由三部分组成 字符过滤器 分词器和 Token 过滤器 字符过滤器 对原始文本进行过滤 分词器 按照一定规则进行分词 Token 过滤器 对分词进行处理 转小写 移除停用词 添

欢迎大家来到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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信