我需要梳理大量数据并寻找一些特定的名称 它们可能会在文本中出现语法错误 我应该采用什么解决方案?
常见语法错误:
答案 0 :(得分:3)
这些是拼写错误。正则表达式不适用于此类任务,您应该查看Soundex。有一个CPAN模块:
http://metacpan.org/pod/Text::Soundex
它在美式英语中广泛地根据语音(在说话时发出的声音)找到匹配的单词。
答案 1 :(得分:2)
您可以查看近似的正则表达式匹配,例如在TRE库。{使用具有不同容错值的TRE工具tre-agrep
,我可以匹配所有变体:
$ cat > test.txt
ernst hmngi
Hurnest Huminguee
Ersnet Henimgway
$ tre-agrep -4 -i "ernest hemingway" test.txt
Ersnet Henimgway
$ tre-agrep -5 -i "ernest hemingway" test.txt
Hurnest Huminguee
Ersnet Henimgway
$ tre-agrep -6 -i "ernest hemingway" test.txt
ernst hmngi
Hurnest Huminguee
Ersnet Henimgway
答案 2 :(得分:2)
鉴于此
以下方法应该运作良好:
实现近似字符串匹配有几种可能的策略(我建议首先尝试(E)):
A)在查找之前将字符串和所有字典条目减少为规范表单的方法。 Soundex 就是这样一种方法。这些方法的主要一般问题是它们不提供按字符串相似性排名,因此您可能会得到许多不同的候选人,但不知道哪一个最匹配。此外,规范形式基于特定语言的发音规则(例如英语的Soundex),这对于名称,尤其是非英语名称不利。这也是有问题的,因为您正在处理的错误可能是由错误输入引起的,而不是错误地发音。例如。使用'q'而不是'w'可能是您经常遇到的问题,因为'q'和'w'位于键盘上彼此相邻,而他们的发音完全不同
B)使用搜索trie 来实现字典的方法。在trie中查找期间,您可以允许一个或两个不匹配,从而找到略有拼写错误的候选者。这里的主要问题是,只要允许超过2个字符的不匹配,查找通常会变得非常慢,特别是在字符串开头允许不匹配时。但是,有一些方法可以优化性能。有关一些想法,请参阅here。
C)基于 n-gram 查找的方法。在这里,您可以使用哈希表进行字典实现,但不是直接将名称放入哈希,而是将每个名称拆分为其字符n-gram(对于预定义的n,通常为2或3)并将n-gram放入词典。例如。对于
hemingway
你会把
hem
emi
min
ing
ngw
gwa
way
进入哈希。在查找期间,您对候选字符串执行相同操作,查找其所有n-gram并接受与输入具有最大n-gram数量的名称。例如,如果输入为hemmgway
,您会发现它与字典条目{3}共有三个n-gram(hem
,gwa
,way
){ {1}}。
如果您的字符串相当长并且此处和那里只有少量错误,则此方法相对较好。在你的情况下也许不是最优的,但你可能想尝试一下。
D)使用Levenshtein自动机实现字典的方法。这是一种相对复杂的方法,当您想要允许大量错误时也会出现问题。详细描述见Schulz和Mihov的this paper。我不确定是否有可立即使用的开源实现。
E) 结合 Levenshtein编辑距离功能的实现与指标树的方法。鉴于你的描述,我相信这对你最有效,我在类似的情况下自己也使用过这种方法。您可以在this SO question的答案中找到更多参考资料,并在this SO question中找到指向实施的链接(我没有尝试过)。