美文网首页分词算法@IT·互联网
mmseg4j中文分词包使用报告

mmseg4j中文分词包使用报告

作者: 㭍葉 | 来源:发表于2017-05-22 16:36 被阅读356次
    目录
    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
    
    java环境

    运行mmseg4j-core-1.10.0.jar

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

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

    chars.dic
    words.dic
    units.dic
    

    分词结果如下

    分词结果

    2. 分词方法与效果分析

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

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

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

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

    Complex方法

    complex方法

    Simple方法

    simple方法

    MaxWord方法

    maxword方法

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

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

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

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

    没有适当分析的特殊词

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

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

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

    自定义词库并打包成jar

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

    搜狗细胞词库 自定义

    编译项目并测试

    mvn clean
    mvn compile
    mvn test-compile
    mvn test
    
    mvn test success

    打包成jar

    mvn jar:jar
    
    mvn jar success

    运行jar包,成功

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

    3. 分词算法学习

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

    匹配算法分类:
    • Simple
      在一串字符串中从开头匹配子串,找到所有可能的匹配。举例:
    中国
    中国人
    中国人的
    
    • Complex
      在一串字符中,找到所有可能的三字块开始匹配,寻找最大长度的字块。举例:
    研_究_生
    研_究_生命
    研究生_命_起源
    研究_生命_起源
    
    消除歧义的规则:
    • 最大匹配。 简单的最大匹配:选择这个词的最大长度。 复杂最大匹配:选择第一个词块的最大长度。
    • 最大平均单词长度
    • 单词长度的最小方差
    • 最大的语素和自由的单字单词

    4. 分词结果提交

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


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

    分词结果1 分词结果2

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


    编写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.txt
                    bw.write(words);
                    
                }catch(IOException e){
                    e.printStackTrace();
                }
                
            }
            br.close();
            bw.close();
    
        }
        
    }
    

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

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

    图悦在线词云制作

    词频统计 词云

    相关文章

      网友评论

        本文标题:mmseg4j中文分词包使用报告

        本文链接:https://www.haomeiwen.com/subject/abfmxxtx.html