我正在使用Aho-Corasick文本匹配,并想知道是否可以更改它以匹配条款而不是字符。换句话说,我希望条款成为匹配而不是字符的基础。举个例子:
搜索查询:“他”,
句子:“Hello world”,
Aho-Corasick将“he”与句号2的句子“hello world”匹配,但我宁愿没有匹配。所以,我的意思是“术语”而不是字符。
答案 0 :(得分:6)
这样做的一种方法是像往常一样使用Aho-Corasick,然后进行过滤步骤,消除所有误报。例如,每次找到匹配项时,都可以确认输入中的下一个和前一个字符是空格或标点符号等非字母字符。这样,您就可以获得Aho-Corasick查找的速度,但只考虑在文本中显示为整个单词的匹配。
希望这有帮助!
答案 1 :(得分:6)
一种可能性是在搜索词中包含空格字符,可能在预处理输入后将各种空格(空格,换行符,回车符,制表符...)转换为相同的空格字符
另一种可能性是,就Aho-Corasick而言,将字母表中的字符视为单词。 Aho-Corasick将使用大小为2 ^ 32的字母快速(如果不是更快)工作,其中输入文本中看到的每个单词都被编码为单个字符,因为它将使用大小为2 ^ 8的字母表,其中a像往常一样,字符只是一个字节。
在任何一种情况下,您都必须决定预处理对标点符号的作用。
答案 2 :(得分:0)
晚会很晚,但是另一种选择是在树突中插入一些代表单词开头和结尾的符号。然后,在匹配阶段,它们必须进行相应的匹配。我要亲自尝试这种方法。
答案 3 :(得分:0)
如果您使用onlyWholewords()方法,则上面的示例应该没有结果。 例如:
Trie trie = Trie.builder()
.onlyWholeWords()
.addKeyword("He")
.build();
Collection<Emit> emits = trie.parseText("Hello World");
在这种情况下的发射将为空。
仅会得出完整的单词“ he”。
尽管要提防不是[a-z A-Z]的字符。例如,如果您:
"He//Is"
它将拾取“ He”,而忽略“ //”
要添加的两件事:
如果要声明单词边界,可以使用:
onlyWholeWordsWhiteSpaceSeparated() 代替
onlyWholeWords()
如果要“白名单”某些字符,此read可能会有所帮助:
所使用的单词字符是默认的,由这些字符修改 提供的布尔标志指示打开字符的位置,并且 关。当您只想关闭特定的 默认字符集中的字符。例如:
所使用的单词字符是默认的,由这些字符修改 提供的布尔标志指示打开字符的位置,并且 关。当您只想关闭特定的 默认字符集中的字符。例如:
new WholeWordMatchSet(关键字,true,['_','='],[false,true])
将产生一个集合,其中考虑字母和数字以及-和= 字字符,但不是_。