1.MMSeg分词算法原理
MMSeg是Chih-Hao Tsai提出的基于字符串匹配(亦称基于词典)的中文分词算法,mmseg4j是MMSeg的Java实现的中文分词器,并实现lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中使用。
MMSeg的字符串匹配算法分为两种:
- Simple,简单的正向最大匹配,即按能匹配上的最长词做切分
- Complex,在正向最大匹配的基础上,考虑相邻词的词长,设计了四个去歧义规则(Ambiguity Resolution Rules)指导分词。主要思想是每次从一个完整的句子里,按照从左向右的顺序,识别出多种不同的三个词作为词块(chunk),然后根据下面的4条消歧规则,确定最佳的备选词组合:
1.备选词块的长度最大(Maximum matching),即三个词的词长之和最大;
2.备选词块的平均词长最大(Largest average word length),即要求词长分布尽可能均匀;
3.备选词块的词长变化最小(Smallest variance of word lengths );
4.备选词块中(若有)单字的出现词频率统计值最高(Largest sum of degree of morphemic freedom of one-character words)。
2.MMSeg4j分词过程
2.1 下载Solr
Solr 是基于Lucene的全文搜索服务器,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
接下来通过solr(可视化界面)整合mmseg4j中文分词包来进行分词,solr历史版本下载地址:http://archive.apache.org/dist/lucene/solr/。这里我选择下载solr6.5.1版本。
下载之后解压缩包,然后通过cmd启动solr:
启动solr启动之后在浏览器输入:http://localhost:8983/solr/#/
可以在本地打开solr。
2.2 下载mmseg4j
能够和solr完美集成的中文分词器包括Mmseg4j、IkAnalyzer、ICTCLAS等。以Mmeseg4j为例,介绍中文分词器的使用。
mmseg4j支持三种分词方法:
- MaxWord
- Simple
- Complex
下载mmseg4j的相关jar包,所有有关的包可以到Maven Repository下载。这里我下载的版本是:
windows系统cmd中运行mmseg4j(这里还不需要用到solr):
检查Java环境
运行mmseg4j-core-1.10.0.jar,用哪种分词方法就写哪种+ 所要分词的字符串,例如:
java -cp mmseg4j-core-1.10.0.jar com.chenlb.mmseg4j.example.MaxWord 字符串
我使用的文本:
近一百多年来,总有一些公司很幸运地、有意识或者无意识地站在技术革命的浪尖之上。一旦处在了那个位置,即使不做任何事,也可以随着波浪顺顺当当地向前漂个十年甚至更长的时间。在这十几年间,它们代表着科技的浪潮,直到下一波浪潮的来临。从一百年前算起,AT&T公司、IBM公司、苹果(Apple)公司 、英特尔(Intel) 公司、微软(Microsoft) 公司、和谷歌(Google)公司都先后被幸运地推到了浪尖。虽然,它们来自不同的领域,中间有些已经衰落或者正在衰落,但是它们都极度辉煌过。这些公司里的人,无论职位高低,在外人看来,都是时代的幸运儿。因为,虽然对一个公司来说,赶上一次浪潮不能保证其长盛不衰;但是,对一个人来说,一生赶上一次这样的浪潮就足够了。一个弄潮的年轻人,最幸运的,莫过于赶上一波大潮。
- MaxWord方法:
- Simple方法:
- Complex方法:
分词效果比较:
可以看出三个方法虽然分词结果不尽相同,但都去掉了标点符号且英文仍可分出来,归纳出三种方法的不一样处及正确分词方法.
正确分法 | MaxWord | Simple | Complex |
---|---|---|---|
有意识 | 有意|意识 | 有意识 | 有意识 |
顺顺当当 | 顺|顺当|当当 | 顺顺当当 | 顺顺当当 |
波|浪潮 | 波浪|潮 | 波浪|潮 | 波浪|潮 |
英特尔 | 英特|尔 | 英特|尔 | 英特|尔 |
谷歌 | 谷|歌 | 谷|歌 | 谷|歌 |
职位|高低 | 职位|高低 | 职位高|低 | 职位|高低 |
年轻人 | 年轻|人 | 年轻人 | 年轻人 |
综上所述可以看出,三种分词方法存在着一些同样的错误,比如名词“英特尔“和”谷歌“都没有识别出来。综合比较Complex的分词方法准确率最高。
2.3 Sol集成mmseg4j
将刚才下载的3个mmseg4j的jar包放到D:\Program Files\solr-6.5.1\server\solr-webapp\webapp\WEB-INF\lib
目录下。
创建一个core:test
进入创建的test项目下的conf目录(比如我的是D:\Program Files\solr-6.5.1\server\solr\test\conf),修改managed-schema文件,添加以下代码(注意dicPath的值要修改为自己目录下相应的值):
<!-- mmseg4j-->
<field name="mmseg4j_complex_name" type="text_mmseg4j_complex" indexed="true" stored="true"/>
<field name="mmseg4j_maxword_name" type="text_mmseg4j_maxword" indexed="true" stored="true"/>
<field name="mmseg4j_simple_name" type="text_mmseg4j_simple" indexed="true" stored="true"/>
<fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="D:/Program Files/solr-6.5.1/server/solr/test/conf"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
</analyzer>
</fieldType>
<fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="D:/Program Files/solr-6.5.1/server/solr/test/conf"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
</analyzer>
</fieldType>
<fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="D:/Program Files/solr-6.5.1/server/solr/test/conf"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
</analyzer>
</fieldType>
<!-- mmseg4j-->
重启Solr
即可在新创建的test这个core的Analysis中看到mmseg4j新增的field:
这是使用Simple模式分词的结果:
simple可以发现和之前通过命令行使用mmseg4j包分词的效果是一样的,仍然存在专有名词无法识别的错误。
2.4 添加自定义词典进行分词
要减少分词错误,可以通过优化算法、自定义词库两种方法来提高分词正确率,在这里尝试加载自定义词库。
修改managed-schema配置,添加下列内容
<requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler">
<lst name="defaults">
<str name="dicPath">D:\Program Files\solr-6.5.1\server\solr\test\conf</str>
<str name="check">true</str>
<str name="reload">true</str>
</lst>
</requestHandler>
在/test/conf
目录下新建词库文件,文件名必须以 words
开头,dic
结尾,如words-test.dic。
编辑文件,定义需要被识别的词
英特尔
谷歌
保存为第一行为空行或为无 BOM 格式的 utf-8 文件。重启solr,可以看到自己定义的词典被加载进去了:
可以看到加载自定义词典后,特有的名词就被分出来了:
分析结果3.MMSeg4j分词包算法学习
4.词云分析分词结果
个性化词云是依赖语料和抽取语料关键词呈现的,需要有标签关键词和关键词词频两个数据,关键词词频数量决定关键词的显示大小。
自带中文分词的词云制作工具:图悦 - 在线词频分析工具。在图悦中,可以直接将需要分析的文本输入,它可以自己进行中文分析,然后直接输出词云,形式比较单一。
网友评论