Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 整个单词的文本匹配?_Java_Algorithm_Full Text Search_String Matching_Aho Corasick - Fatal编程技术网

Java 整个单词的文本匹配?

Java 整个单词的文本匹配?,java,algorithm,full-text-search,string-matching,aho-corasick,Java,Algorithm,Full Text Search,String Matching,Aho Corasick,我正在使用Aho-Corasick文本匹配,不知道是否可以将其更改为匹配术语而不是字符。换句话说,我希望术语是匹配的基础,而不是字符。例如: 搜索查询:“他” “你好,世界” 阿霍·科拉西克将把“他”和以索引2结尾的句子“你好,世界”匹配起来,但我更希望没有匹配项。所以,我指的是“术语”而不是字符。一种方法是像往常一样使用Aho-Corasick,然后执行过滤步骤,消除所有误报。例如,每次找到匹配项时,都可以确认输入中的下一个和上一个字符是非字母字符,如空格或标点符号。这样,就可以获得Aho C

我正在使用Aho-Corasick文本匹配,不知道是否可以将其更改为匹配术语而不是字符。换句话说,我希望术语是匹配的基础,而不是字符。例如:

搜索查询:“他”

“你好,世界”


阿霍·科拉西克将把“他”和以索引2结尾的句子“你好,世界”匹配起来,但我更希望没有匹配项。所以,我指的是“术语”而不是字符。

一种方法是像往常一样使用Aho-Corasick,然后执行过滤步骤,消除所有误报。例如,每次找到匹配项时,都可以确认输入中的下一个和上一个字符是非字母字符,如空格或标点符号。这样,就可以获得Aho Corasick查找的速度,而只考虑在文本中显示为整字的匹配。


希望这有帮助

一种可能是在搜索词中包含空格字符,可能是在对输入进行预处理后,将各种空格(空格、换行符、回车符、制表符…)转换为相同的空格字符

另一种可能是把字母表中的字符想象成单词,就阿霍·科拉西克而言。对于大小为2^32的字母表,输入文本中的每个单词都被编码为单个字符,Aho Corasick的工作速度与大小为2^8的字母表(字符仅为单个字节)的工作速度一样快(如果不是更快的话)


在任何一种情况下,你都必须决定你的标点符号的预处理功能。

晚会很晚了,但另一种选择是在trie中插入一些代表单词开头和结尾的符号。然后,在匹配阶段,它们必须相应地匹配。我将自己尝试这种方法。

如果您仅使用HoleWords()方法,那么上面的示例将不会有任何结果。 例如:

Trie trie = Trie.builder()
             .onlyWholeWords()
             .addKeyword("He")
             .build();
Collection<Emit> emits = trie.parseText("Hello World");
它将拾取“He”并忽略“/”

有两件事需要补充:

  • 如果要断言单词边界,可以使用:

    仅限HolyWordsWhiteSpaceSeparated() 而不是

    仅限HolyWords()

  • 如果要“白名单”某些字符,这可能会有所帮助:

  • 使用的单词字符是由这些字符修改的默认字符 所提供的和布尔标志表示打开和关闭字符的位置 关当您只想关闭特定的 默认字符集中的字符。例如:

    Trie trie = Trie.builder()
                 .onlyWholeWords()
                 .addKeyword("He")
                 .build();
    Collection<Emit> emits = trie.parseText("Hello World");
    
    使用的单词字符是由这些字符修改的默认字符 所提供的和布尔标志表示打开和关闭字符的位置 关当您只想关闭特定的 默认字符集中的字符。例如:

    Trie trie = Trie.builder()
                 .onlyWholeWords()
                 .addKeyword("He")
                 .build();
    Collection<Emit> emits = trie.parseText("Hello World");
    
    新的WholeWordMatchSet(关键字,true,[''''.'='],[false,true])

    将生成一个集合,其中考虑字母和数字以及-和= 单词字符,但不是

    你说的“术语”是什么意思?你能举个例子吗?