热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mmseg4j中文分词包使用报告

目录认识中文分词包(下载、安装及运行)分词方法与效果分析分词算法学习分词结果提交(2017524完善方法2)基于分词结果的词云分析1.认识中文分词包&#
目录
  1. 认识中文分词包(下载、安装及运行)
  2. 分词方法与效果分析
  3. 分词算法学习
  4. 分词结果提交(2017/5/24完善方法2)
  5. 基于分词结果的词云分析

1.认识中文分词包(下载、安装及运行)

1.1 简介

mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。

1.2 下载

mmseg4j的相关jar包已经提交到Maven仓库,可以在mmseg4j的Maven仓库中找到需要的jar包,以及对应的pom文件代码。
下载链接:
mmseg4j-core-1.10.0.jar下载
mmseg4j-analysis-1.9.1.jar下载
mmseg4j-solr-2.4.0.jar下载

1.3 运行(windows系统cmd中)

检查java环境

f:
java -version
javac

img_c1d898267692877b1dee61155484013d.png
java环境

运行mmseg4j-core-1.10.0.jar

java -cp mmseg4j-core-1.10.0.jar com.chenlb.mmseg4j.example.MaxWord 字符串

img_a5e09afae5b07170d961dc34a0ce4c33.png
运行

可以看到,jar包启动之后,系统加载了 ./data 目录下的三个字典文件,分别是

chars.dic
words.dic
units.dic

分词结果如下

img_007aaf0cf662d394a226510e0c84a993.png
分词结果

2. 分词方法与效果分析

mmseg4j分词包提供了三种分词方法

  • Complex方法
  • Simple方法
  • MaxWord方法

分别使用三种方法进行分析下面这段新闻:

2017年5月11日下午,美国亚利桑那州立大学图书馆资深馆员Dan Stanton来访我院,并于三教406教室为我院师生作了题为“美国政府信息服务”的学术报告。出席本次学术报告的有我院信息资源管理专业、图书馆学专业、档案学专业的本科生、研究生,以及李桂华教授、杨峰副教授等教师。本次报告会由李桂华教授主持。 Stanton 先生曾任美国亚利桑那图书馆协会主席,并历任亚利桑那州立大学人文与社会科学服务馆员、政府信息服务馆员、本地文献馆员等职位,对美国研究型图书馆的运营有深刻理解。

Complex方法

img_7eed69bb45fdd1ea61968712d1047403.png
complex方法

Simple方法

img_32072198267e83a2aed9e2612629e11f.png
simple方法

MaxWord方法

img_e67519e11ffe7a67e0b53c96a9cdb4a0.png
maxword方法

对比分析:
Simple方法的分词错误共有两处:

正确分词 错误分词
李/桂/华/教授 李/桂/华教/授
为/我院 为/我院

MaxWord方法的分词错误共有5处

正确分词 错误分词
图书馆 图书/书馆
美国政府 美国/国政/政府
学术报告 学术/报告
本科生 本科/生
研究生 研究/生

没有适当分析的特殊词

亚利桑那州立大学(学校名)
三教(地名)
信息服务(专业术语)
信息资源管理专业(专业名)
图书馆学专业(专业名)
档案学专业(专业名)
李桂华(人名)
杨峰(人名)
研究型(专业术语)

对比可知,分词正确率最高的方法是Complex方法。
提高分词正确率的方法有:增加自定义词库;算法优化。这里主要介绍自定义词库。

友情链接:
搜狗细胞词库
词库scel格式转txt工具(不打广告亲测可用,转换之后需要记事本打开再手动转utf-8,再改成dic)

自定义词库并打包成jar

这里还有其他方法比如配置mmseg4j solr的环境来修改词库等
下载mmseg4j-core源码
我把自定义分词放进了words.dic
加入的自定义词库有:

img_cd5b1a0e2d7339b057436117de1b406a.png
搜狗细胞词库
img_df9a42278aa2f6bfc87777592c77ba44.png
自定义

编译项目并测试

mvn clean
mvn compile
mvn test-compile
mvn test

img_fa30e5b0649aa49ce90259b4962bcf18.png
mvn test success

打包成jar

mvn jar:jar

img_2c7f09f1f32ca705e872139978aedd1b.png
mvn jar success

运行jar包,成功

img_158386dfd8b99fa9ad41522b06dbbf24.png
分词效果

友情链接:
mvn常用命令
maven的安装和配置

3. 分词算法学习

mmseg4j分词包采用的主要算法是MMSEG正向最大匹配算法,基于词典,运行速度快,以正向最大匹配为主,多种消除歧义的规则为辅。

匹配算法分类:
  • Simple
    在一串字符串中从开头匹配子串,找到所有可能的匹配。举例:

中国
中国人
中国人的

  • Complex
    在一串字符中,找到所有可能的三字块开始匹配,寻找最大长度的字块。举例:

研_究_生
研_究_生命
研究生_命_起源
研究_生命_起源

消除歧义的规则:
  • 最大匹配。 简单的最大匹配:选择这个词的最大长度。 复杂最大匹配:选择第一个词块的最大长度。
  • 最大平均单词长度
  • 单词长度的最小方差
  • 最大的语素和自由的单字单词

4. 分词结果提交

由于mmseg4j源码中没有提供把分词结果保存成文件的方法,可以选择自己在源码中修改,然后打包成jar。也可以选择采用其他方法。
需要分词的文件需要自行转换txt纯文本。
------------------------------2017/5/23 15:00完善---------------------------------------
完善后的代码把读取到的文件逐行输入到控制台,进行分词后写入mmseg4j.txt文件中,我放在了c盘下。
修改的代码:

img_beedce444c33562f13af1a2773218d34.png

img_f3f638b1538c2f1a931bfebee33d3021.png

在控制台编译打包,具体方法和之前一样。
运行jar包生成txt文件部分内容如下

img_e9d9b855d1ee6d54a3d8f023ea53e677.png
分词结果1
img_71740c5becc7205daabfa09a8ef476b9.png
分词结果2

-----------------------------------2017/5/24补充方法2-------------------------------------
新建一个java项目,引入mmseg4j-core-1.10.0.jar和tika-app-1.14.jar

img_58831687808303ec780ce31f863cb5df.png

编写test.java

import com.chenlb.mmseg4j.*;
import com.chenlb.mmseg4j.example.*;
import org.apache.tika.*;import java.io.*;public class test {public static void main(String[] args) throws Exception{String fnread = "c:/ggnews.xml";String fnread2 = "c:/change.txt";String fnwrite = "c:/mmseg4j.txt";Complex segW = new Complex();Tika tika = new Tika();//这里是格式转换File fchange = new File(fnread);String filecontent = tika.parseToString(fchange);//读取的文件路径File readf = new File(fnread2);try{if(!fchange.exists()){fchange.createNewFile();}FileWriter fw1 = new FileWriter(readf.getAbsoluteFile());BufferedWriter bw1 = new BufferedWriter(fw1);bw1.write(filecontent);bw1.close();System.out.println("Done");}catch(IOException e){e.printStackTrace();}//这里是分词读写//这里原来读取的是在控制台输入的文本,现在是ggnews.txt文件内的文本BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(readf),"UTF-8"));String inputStr = null;//保存的文件路径File writef =new File(fnwrite);if(!writef.exists()){writef.createNewFile();}FileWriter fw = new FileWriter(writef.getAbsoluteFile());BufferedWriter bw = new BufferedWriter(fw);while((inputStr = br.readLine()) != null) {String words = segW.segWords(inputStr, "|");try{//把逐行读取的文件写入mmseg4j.txtbw.write(words);}catch(IOException e){e.printStackTrace();}}br.close();bw.close();}}

运行后生成change.txt和mmseg4j.txt,分词结果与方法1相同

5. 基于分词结果的词云分析(词频统计+可视化)

图悦在线词云制作

img_04ca5e6b065c5e910a95e99aada1926f.png
词频统计
img_0dd070a9849edc5eaa7885b9af938685.png
词云



推荐阅读
author-avatar
猪猪爱tai旸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有