Java 整个单词的文本匹配?
我正在使用Aho-Corasick文本匹配,不知道是否可以将其更改为匹配术语而不是字符。换句话说,我希望术语是匹配的基础,而不是字符。例如: 搜索查询:“他” “你好,世界”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
阿霍·科拉西克将把“他”和以索引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”并忽略“/”
有两件事需要补充:
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])
将生成一个集合,其中考虑字母和数字以及-和=
单词字符,但不是
你说的“术语”是什么意思?你能举个例子吗?