在之前的两篇博文中文分词算法 之 基于词典的正向最大匹配算法和中文分词算法 之 基于词典的逆向最大匹配算法中,我们对分词实现和词典实现都做了优化,本文对词典实现做进一步优化,并和之前的多个实现做一个对比,使用的词典下载地址,使用的测试文本下载地址。
优化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 &
测试结果如下:
参考资料:
1、中文分词十年回顾
相关推荐
3、中文分词算法 之 词典机制性能优化与测试 4、中文分词算法 之 基于词典的正向最小匹配算法 5、中文分词算法 之 基于词典的逆向最小匹配算法 5、Java开源项目cws_evaluation:中文分词器分词效果评估
《中文分词与百度词典:深入理解与应用》 中文分词是自然语言处理(NLP)领域的一项基础任务,对于中文文本的理解至关重要。它涉及到将连续的汉字序列切分成具有语义意义的词语单元,是信息检索、机器翻译、情感...
包含了各种与分词相关的源码,例如"zt_逆向最大匹配分词算法"可能是实现逆向最大匹配算法的具体代码,"秒盘古分词"可能是指快速版本的盘古分词程序,"中文分词"和"英文分词"源码分别针对中文和英文的分词处理,"最新...
在这个“中文分词算法研究整理资料”中,我们可以期待找到关于如何处理中文文本,尤其是如何进行有效分词的各种方法和技术。 中文分词的难度在于汉字的组合方式灵活,一个词组可以由一个或多个汉字组成,而且没有...
通过与其他分词算法(如正向最大匹配法、双向最大匹配法等)进行对比,可以更直观地看出基于逆向匹配的中文分词算法的优势与不足。实验结果表明,RMM算法在处理未登录词方面表现更优,尤其是在处理长难句时能够保持...
Java实现的中文分词算法是自然语言处理领域中的重要技术,尤其在文本挖掘、搜索引擎、信息检索等场景中发挥着关键作用。FMM(Fast Mapping Model)和BMM(Bigram Mapping Model)是两种常见的中文分词算法,它们都是...
6. **评估与优化**:分词算法的性能通常通过准确率、召回率和F1值等指标进行评估。通过对不同测试集的结果比较,可以找出算法的不足并进行优化。 在这个“中文分词算法程序”的毕业设计中,学生可能需要完成以上...
在这个过程中,中文分词算法扮演着至关重要的角色。本文将详细介绍两种主要的中文分词算法:基于统计的贝叶斯算法以及ChineseAnalysis和IKAnalysis这两个开源算法。 首先,让我们探讨基于统计的贝叶斯算法。贝叶斯...
汉语自动分词作为中文信息处理的关键步骤,对于中文文本检索、汉字与汉语语音识别、中文文语转换系统等应用至关重要。其中,分词词典的构建与查询机制直接影响着分词系统的性能与效率。本文聚焦于三种典型分词词典...
每个词都有对应的词频信息,用于指导分词算法进行决策,即在遇到连续的汉字序列时,选择出现频率更高的切分方式。词典的大小和质量直接影响分词效果,通常需要不断更新以适应语言的发展和特定领域的术语。 2. **...
综上所述,该文献提出的中文自动分词算法,通过改进的分词词典机制和结合最大匹配算法与概率算法的方式,有效地解决了中文分词中存在的问题,提高了分词的效率和准确性。这对于推动中文信息处理技术的发展具有重要...
《中英文分词算法详解与应用》 分词是自然语言处理中的基础步骤,它将连续的文本序列切分成有意义的词语单元,为后续的文本分析、信息检索、机器翻译等任务提供支持。本文将深入探讨由KaiToo搜索开发的中英文分词...
- 词典依赖:基于字符串匹配的分词算法高度依赖词典,基于理解的分词算法不需要词典,而基于统计的分词算法词典不是必须的,但语料库是必需的。 - 规则库需求:基于理解的分词算法需要规则库,基于统计的分词算法则...
这种方法是最常见的中文分词方法之一,其核心思想是将待分析的汉字串与预先构建好的“充分大”的词典中的词条进行匹配。具体来说,可以进一步细分为: - **正向最大匹配法**(MM法):从左到右进行匹配,每次尝试...
KNN(K-Nearest Neighbors)中文分词算法是一种基于机器学习的文本处理技术,主要应用于自然语言处理(NLP)领域。在中文文本中,由于词语之间没有明显的分隔符,因此需要通过特定的算法来识别和提取词汇。KNN算法在...
但不管实现如何,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本...
4. **优化性能**:预加载的词典数据可以加速分词过程,减少实时计算量,提高分词速度。 ### 分词词典的类型 根据词典的来源和用途,可以将其分为以下几类: - **通用词典**:覆盖了广泛领域的一般词汇,适用于...