龙空技术网

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

自在的一只羊 93

前言:

而今姐妹们对“分词搜索引擎”可能比较看重,兄弟们都想要分析一些“分词搜索引擎”的相关文章。那么小编在网上汇集了一些关于“分词搜索引擎””的相关资讯,希望大家能喜欢,小伙伴们一起来学习一下吧!

简介

分词是把全文本拆分成一系列单词的过程。

分词器是用来实现分词的,分词由三部分组成:字符过滤器、分词器和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);        }    }}

输出结果:

由此可以得知,StandardAnalyzer采用的是一元分词,即字符串以一个字为单位进行切割。

CJKAnalyzer分词器

按两个字进行切分,把相邻的两个字组成词分解出来,效率也比较低。并且不少状况下分的词不对。如:“我是一个中国人”,效果:“我是”、“是一”、“一个”、“个中”、“中国”、“国人”。通过分词结果可以看到,CJKAnalyzer 采用的是二元分词,即字符串以两个字为单位进行切割。

@Testpublic 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。尝试使用中文文本分割成单词作为标记。如:“我是一个中国人”,效果:“我”、“是”、“一个”、“中国”、“人”。

@Testpublic 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分词器

按某种算法构造词,而后去匹配已建好的词库集合,若是匹配到就切分出来成为词语。一般词库分词被认为是最理想的中文分词算法。如:“我是一个中国人”,效果:“一个中国”、“一个”、“个中”、“中国人”、“中国”、“国人”。可以看到,分词效果比单纯的一元或者二元分词要好很多。

@Testpublic 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

一个中国

一个

个中

中国人

中国

国人

标签: #分词搜索引擎