hankcs / HanLP

中文分词 词性标注 命名实体识别 依存句法分析 成分句法分析 语义依存分析 语义角色标注 指代消解 风格转换 语义相似度 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁转换 自然语言处理
https://hanlp.hankcs.com/
Apache License 2.0
33.84k stars 10.12k forks source link

bugfix: 修复 bintrie 树全分词时 提前跳出循环 bug #1775

Closed carl10086 closed 2 years ago

carl10086 commented 2 years ago

bintrie 不能完全分词

Description

使用 BinTrie 的代码某些场景不能进行有效的完全切词

下面是 bug 演示:

import com.hankcs.hanlp.collection.AhoCorasick.AhoCorasickDoubleArrayTrie;
import org.junit.Before;
import org.junit.Test;

public class BinTrieParseTextTest {

    private BinTrie<Integer> trie;

    @Before
    public void setup() {
        this.trie = new BinTrie<Integer>();
        String[] words = new String[]{"溜", "儿", "溜儿", "一溜儿", "一溜"};
        /*构建一个简单的词典, 从 core dict 文件中扣出的一部分*/
        for (int i = 0; i < words.length; i++) {
            this.trie.put(words[i], i);
        }
    }

    @Test
    public void justForShowBugs() {
        showParseText("一溜儿");

        /*我们在 一溜儿后面随便+一个字符,这里我们加一个空格 会完全不同*/
        showParseText("一溜儿" + " ");

    }

    private void showParseText(final String text) {
        System.out.printf("========进行完全切词%s的演示======\n", text);
        this.trie.parseText(text, new AhoCorasickDoubleArrayTrie.IHit<Integer>() {
            @Override
            public void hit(int begin, int end, Integer value) {
                System.out.println(text.substring(begin, end));
            }
        });

        System.out.println("===========================");

    }
}

输出结果如下:

========进行完全切词一溜儿的演示======
一溜
一溜儿
===========================
========进行完全切词一溜儿 的演示======
一溜
一溜儿
溜
溜儿
儿
===========================

How Has This Been Tested?

测试代码见 com.hankcs.hanlp.collection.trie.bintrie.BinTrieParseTextTest.java

hankcs commented 2 years ago

感谢指正!