我如何使用欧内斯特·海明威找到所有名字的正则表达式,但拼写错误?

时间:2012-03-01 15:53:06

标签: regex parsing nlp string-matching

我需要梳理大量数据并寻找一些特定的名称 它们可能会在文本中出现语法错误 我应该采用什么解决方案?

常见语法错误:

  1. ernst hmngi
  2. Hurnest Huminguee
  3. Ersnet Henimgway

3 个答案:

答案 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)

鉴于此

  • 您有一个您正在寻找的特定名称的字典(即列表)
  • 你这样做是为了英语,可以相对直接的方式标记化(例如使用空格和标点作为标记边界)

以下方法应该运作良好:

  1. 准备列表中的姓名字典
  2. 标记文字
  3. 考虑a)每个标记,b)每对连续标记,c)连续标记的每个三元组作为候选名称,并使用近似字符串匹配技术在字典中查找
  4. 实现近似字符串匹配有几种可能的策略(我建议首先尝试(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(hemgwaway){ {1}}。

    如果您的字符串相当长并且此处和那里只有少量错误,则此方法相对较好。在你的情况下也许不是最优的,但你可能想尝试一下。

    D)使用Levenshtein自动机实现字典的方法。这是一种相对复杂的方法,当您想要允许大量错误时也会出现问题。详细描述见Schulz和Mihov的this paper。我不确定是否有可立即使用的开源实现。

    E) 结合 Levenshtein编辑距离功能的实现与指标树的方法。鉴于你的描述,我相信这对你最有效,我在类似的情况下自己也使用过这种方法。您可以在this SO question的答案中找到更多参考资料,并在this SO question中找到指向实施的链接(我没有尝试过)。