hankcs / AhoCorasickDoubleArrayTrie

An extremely fast implementation of Aho Corasick algorithm based on Double Array Trie.
http://www.hankcs.com/program/algorithm/aho-corasick-double-array-trie.html
948 stars 290 forks source link

子类继承 AhoCorasickDoubleArrayTrie 实现匹配时忽略特定字符 #51

Open XhstormR opened 3 years ago

XhstormR commented 3 years ago

请问子类继承 AhoCorasickDoubleArrayTrie,能否重写某些方法,实现匹配时忽略一些特定字符,例如标点符号?

val acdat = CustomizeAhoCorasickDoubleArrayTrie<String>()
acdat.build(mapOf("hello" to "hello"))

val wordList = acdat.parseText("hel,l.o") // omit , . char, matched
hankcs commented 3 years ago

https://github.com/hankcs/AhoCorasickDoubleArrayTrie/blob/6225461111a0eb710f0787baa15db92989cb7e34/src/main/java/com/hankcs/algorithm/AhoCorasickDoubleArrayTrie.java#L465

这个方法直接return nodePos就可以。

XhstormR commented 3 years ago

试了下直接返回 nodePos 可以匹配成功,但是 Hit 结果中的 begin 不对了,匹配成功的字符串比 keyword 长度要长。

看了下代码匹配成功后保留的信息只有当前 position 和 keyword index,通过 keyword index 从 int[] l 获取长度,然后与 position 相减取得 begin,没有额外信息,无法知道真正的起始点在哪。。

W.or.ld
[2:7]=World
or.ld