`

中文分词算法 之 词典机制性能优化与测试

阅读更多

在之前的两篇博文中文分词算法 之 基于词典的正向最大匹配算法中文分词算法 之 基于词典的逆向最大匹配算法中,我们对分词实现词典实现都做了优化,本文对词典实现做进一步优化,并和之前的多个实现做一个对比,使用的词典下载地址,使用的测试文本下载地址

 

优化TrieV3的关键在于把虚拟根节点(/)的子节点(词表首字母)提升为多个相互独立的根节点,并对这些根节点建立索引。优化的依据是根节点(词表首字母)的数量庞大,索引查找的速度远远超过二分查找

 

下面看看进一步优化后的TrieV4和之前的TrieV3的对比:



    /**
     * 获取字符对应的根节点
     * 如果节点不存在
     * 则增加根节点后返回新增的节点
     * @param character 字符
     * @return 字符对应的根节点
     */
    private TrieNode getRootNodeIfNotExistThenCreate(char character){
        TrieNode trieNode = getRootNode(character);
        if(trieNode == null){
            trieNode = new TrieNode(character);
            addRootNode(trieNode);
        }
        return trieNode;
    }
    /**
     * 新增一个根节点
     * @param rootNode 根节点
     */
    private void addRootNode(TrieNode rootNode){
        //计算节点的存储索引
        int index = rootNode.getCharacter()%INDEX_LENGTH;
        //检查索引是否和其他节点冲突
        TrieNode existTrieNode = ROOT_NODES_INDEX[index];
        if(existTrieNode != null){
            //有冲突,将冲突节点附加到当前节点之后
            rootNode.setSibling(existTrieNode);
        }
        //新增的节点总是在最前
        ROOT_NODES_INDEX[index] = rootNode;
    }
    /**
     * 获取字符对应的根节点
     * 如果不存在,则返回NULL
     * @param character 字符
     * @return 字符对应的根节点
     */
    private TrieNode getRootNode(char character){
        //计算节点的存储索引
        int index = character%INDEX_LENGTH;
        TrieNode trieNode = ROOT_NODES_INDEX[index];
        while(trieNode != null && character != trieNode.getCharacter()){
            //如果节点和其他节点冲突,则需要链式查找
            trieNode = trieNode.getSibling();
        }
        return trieNode;
    }

 

 不同的字符可能会映射到同一个数组索引(映射冲突),所以需要给TrieNode增加一个引用sibling,当冲突发生的时候,可利用该引用将多个冲突元素链接起来,这样,在一个数组索引中就能存储多个TrieNode。如果冲突大量发生,不但会浪费已经分配的数组空间,而且会引起查找性能的下降,好在这里根节点的每个字符都不一样,冲突发生的情况非常少。我们看看词数目为427451的词典文件的冲突情况:

 

冲突次数为:1 的元素个数:2746
冲突次数为:2 的元素个数:1
冲突次数:2748
总槽数:12000
用槽数:9024
使用率:75.2%
剩槽数:2976

 

 

 



 


 

将词典文件和测试文本解压到当前目录下,使用下面的命令进行测试需要注意的是,这里的-Xmx参数指定的值是相应的词典实现所需要的最小的堆空间,如果再小就无法完成分词

 

nohup java -Ddic.class=org.apdplat.word.dictionary.impl.TrieV4 -Xmx40m  -cp target/word-1.0.jar org.apdplat.word.SegFile &
nohup java -Ddic.class=org.apdplat.word.dictionary.impl.TrieV3 -Xmx40m  -cp target/word-1.0.jar org.apdplat.word.SegFile &
nohup java -Ddic.class=org.apdplat.word.dictionary.impl.TrieV2 -Xmx40m  -cp target/word-1.0.jar org.apdplat.word.SegFile &
nohup java -Ddic.class=org.apdplat.word.dictionary.impl.TrieV1 -Xmx120m  -cp target/word-1.0.jar org.apdplat.word.SegFile &
nohup java -Ddic.class=org.apdplat.word.dictionary.impl.Trie -Xmx200m  -cp target/word-1.0.jar org.apdplat.word.SegFile &
nohup java -Ddic.class=org.apdplat.word.dictionary.impl.HashSet -Xmx50m  -cp target/word-1.0.jar org.apdplat.word.SegFile &

 

测试结果如下:



 



 



 


 

 

代码托管于GITHUB

 

参考资料:

1、中文分词十年回顾

2、中文信息处理中的分词问题

3、汉语自动分词词典机制的实验研究

4、由字构词_中文分词新方法

5、汉语自动分词研究评述

 

 

 

 

 

 

  • 大小: 61.4 KB
  • 大小: 73.9 KB
  • 大小: 41 KB
  • 大小: 30.5 KB
  • 大小: 11.5 KB
  • 大小: 8.4 KB
  • 大小: 7 KB
  • 大小: 6.1 KB
4
2
分享到:
评论

相关推荐

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    3、中文分词算法 之 词典机制性能优化与测试 4、中文分词算法 之 基于词典的正向最小匹配算法 5、中文分词算法 之 基于词典的逆向最小匹配算法 5、Java开源项目cws_evaluation:中文分词器分词效果评估

    baidu.rar_ baidu_dictionary_中文分词_中文分词 词典_分词词典

    《中文分词与百度词典:深入理解与应用》 中文分词是自然语言处理(NLP)领域的一项基础任务,对于中文文本的理解至关重要。它涉及到将连续的汉字序列切分成具有语义意义的词语单元,是信息检索、机器翻译、情感...

    最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码

    包含了各种与分词相关的源码,例如"zt_逆向最大匹配分词算法"可能是实现逆向最大匹配算法的具体代码,"秒盘古分词"可能是指快速版本的盘古分词程序,"中文分词"和"英文分词"源码分别针对中文和英文的分词处理,"最新...

    中文分词算法研究整理资料

    在这个“中文分词算法研究整理资料”中,我们可以期待找到关于如何处理中文文本,尤其是如何进行有效分词的各种方法和技术。 中文分词的难度在于汉字的组合方式灵活,一个词组可以由一个或多个汉字组成,而且没有...

    基于逆向匹配的中文分词算法

    通过与其他分词算法(如正向最大匹配法、双向最大匹配法等)进行对比,可以更直观地看出基于逆向匹配的中文分词算法的优势与不足。实验结果表明,RMM算法在处理未登录词方面表现更优,尤其是在处理长难句时能够保持...

    java 实现的中文分词算法(代码)

    Java实现的中文分词算法是自然语言处理领域中的重要技术,尤其在文本挖掘、搜索引擎、信息检索等场景中发挥着关键作用。FMM(Fast Mapping Model)和BMM(Bigram Mapping Model)是两种常见的中文分词算法,它们都是...

    中文分词算法程序

    6. **评估与优化**:分词算法的性能通常通过准确率、召回率和F1值等指标进行评估。通过对不同测试集的结果比较,可以找出算法的不足并进行优化。 在这个“中文分词算法程序”的毕业设计中,学生可能需要完成以上...

    中文分词的算法实现

    通过深入理解并掌握这些关键技术,我们可以更好地设计和优化中文分词算法,提升自然语言处理系统的整体性能。未来,随着人工智能技术的发展,中文分词算法也将不断进化,为人类社会的信息处理提供更加强大的支持。

    中文分词算法

    在这个过程中,中文分词算法扮演着至关重要的角色。本文将详细介绍两种主要的中文分词算法:基于统计的贝叶斯算法以及ChineseAnalysis和IKAnalysis这两个开源算法。 首先,让我们探讨基于统计的贝叶斯算法。贝叶斯...

    汉语自动分词词典机制的实验研究.pdf

    汉语自动分词作为中文信息处理的关键步骤,对于中文文本检索、汉字与汉语语音识别、中文文语转换系统等应用至关重要。其中,分词词典的构建与查询机制直接影响着分词系统的性能与效率。本文聚焦于三种典型分词词典...

    盘古分词-开源中文分词组件词典-词典

    每个词都有对应的词频信息,用于指导分词算法进行决策,即在遇到连续的汉字序列时,选择出现频率更高的切分方式。词典的大小和质量直接影响分词效果,通常需要不断更新以适应语言的发展和特定领域的术语。 2. **...

    汉语文本自动分词算法

    综上所述,该文献提出的中文自动分词算法,通过改进的分词词典机制和结合最大匹配算法与概率算法的方式,有效地解决了中文分词中存在的问题,提高了分词的效率和准确性。这对于推动中文信息处理技术的发展具有重要...

    中英文分词算法

    《中英文分词算法详解与应用》 分词是自然语言处理中的基础步骤,它将连续的文本序列切分成有意义的词语单元,为后续的文本分析、信息检索、机器翻译等任务提供支持。本文将深入探讨由KaiToo搜索开发的中英文分词...

    三种中文分词算法优劣比较.docx

    - 词典依赖:基于字符串匹配的分词算法高度依赖词典,基于理解的分词算法不需要词典,而基于统计的分词算法词典不是必须的,但语料库是必需的。 - 规则库需求:基于理解的分词算法需要规则库,基于统计的分词算法则...

    几种基于词典的中文分词算法评价

    这种方法是最常见的中文分词方法之一,其核心思想是将待分析的汉字串与预先构建好的“充分大”的词典中的词条进行匹配。具体来说,可以进一步细分为: - **正向最大匹配法**(MM法):从左到右进行匹配,每次尝试...

    KNN中文分词算法

    KNN(K-Nearest Neighbors)中文分词算法是一种基于机器学习的文本处理技术,主要应用于自然语言处理(NLP)领域。在中文文本中,由于词语之间没有明显的分隔符,因此需要通过特定的算法来识别和提取词汇。KNN算法在...

    正向最大匹配中文分词算法

    但不管实现如何,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本...

    一个简单的分词词典,供大家学习测试分词之用。

    4. **优化性能**:预加载的词典数据可以加速分词过程,减少实时计算量,提高分词速度。 ### 分词词典的类型 根据词典的来源和用途,可以将其分为以下几类: - **通用词典**:覆盖了广泛领域的一般词汇,适用于...

Global site tag (gtag.js) - Google Analytics