真实世界的错字统计?

时间:2010-08-05 21:38:19

标签: python machine-learning fuzzy-search spelling

我在哪里可以找到一些真实的拼写错误统计数据?

我正在尝试将人们的输入文本与内部对象进行匹配,人们往往会犯拼写错误 有两种错误:

  1. typos - “Helllo”而不是“Hello”/“Satudray”而不是“Saturday”等。
  2. Spelling - “Shikago”而非“芝加哥”
  3. 我使用Damerau-Levenshtein distance进行拼写错误,使用Double Metaphone进行拼写(Python实现herehere)。

    我想专注于Damerau-Levenshtein(或简称edit-distance)。教科书实现总是使用'​​1'来表示删除,插入替换和转置的权重。虽然这很简单并且允许很好的算法但它与“现实”/“真实世界概率”不匹配。

    示例:

    • 我确定“Helllo”(“你好”)的可能性大于“Helzlo”,但它们距离都是1个编辑距离。
    • “Gello”在QWERTY键盘上比“Qello”更接近“Hello”。
    • Unicode音译:“慕尼黑”和“慕尼黑”之间的“真实”距离是多少?

    “真实世界”权重应该用于删除,插入,替换和转置?

    即使Norvig's very cool spell corrector使用非加权编辑距离。

    BTW-我确定权重需要是函数而不是简单的浮点数(按照上面的说法) 示例)...

    我可以调整算法,但在哪里可以“学习”这些权重?我无法访问Google-scale data ...

    我应该猜猜他们吗?

    编辑 - 尝试回答用户提问:

    • 由于上述原因,我目前的非加权算法在遇到拼写错误时经常失败。 “星期四回归”:每个“真人”都可以很容易地告诉周四比周二更有可能,但他们都是1编辑距离! (是的,我会记录并衡量我的表现)。
    • 我正在开发一个NLP旅行搜索引擎,因此我的词典包含~25K目的地(预计会增长到100K),时间表达式~200(预期1K),人物表达式~100(预期300),货币表达式~100 (预计500),“胶水逻辑词”(“来自”,“美丽”,“公寓”)~2K(预计10K)等......
    • 对于上述每个单词组,编辑距离的使用是不同的。我尝试“明显时自动纠正”,例如1编辑距离字典中的另一个单词的距离。我有许多其他手动调整的规则,例如双重Metaphone修复,其与长度> 1的字典单词的编辑距离不超过2。 4 ......当我从现实世界的输入中学习时,规则列表继续增长。
    • “你的门槛中有多少对字典条目?”:嗯,这取决于“花式加权系统”和现实世界(未来)输入,不是吗?无论如何,我进行了大量的单元测试,因此我对系统所做的每一项更改都只会使其更好(当然,基于过去的输入)。大多数6个字母的单词距离距离另一个词典条目1个编辑距离的单词的编辑距离不超过1个。
    • 今天当有2个字典条目与输入相同的距离时,我尝试应用各种统计数据来更好地猜测用户的意思(例如,巴黎,法国更有可能出现在我的搜索中,而不是Pārīz,伊朗)。
    • 选择错误单词的成本是将半随机(通常是荒谬的)结果返回给最终用户并可能导致客户流失。不理解的成本稍微低一些:用户将被要求改写。
    • 复杂性的代价是否值得?是的,我确定是的。你不会相信人们在系统中投入的拼写错误并希望它能够理解,我确信可以使用Precision and Recall中的提升。

5 个答案:

答案 0 :(得分:14)

现实世界拼写错误统计信息的可能来源是维基百科的完整编辑历史记录

http://download.wikimedia.org/

另外,您可能对AWB的RegExTypoFix感兴趣

http://en.wikipedia.org/wiki/Wikipedia:AWB/T

答案 1 :(得分:8)

我建议你查看trigram alogrithm。在我看来,它更适合找到拼写错误然后编辑距离算法。它应该更快地工作,如果你在postgres数据库中保存字典,你可以使用索引。

你可能会发现有用的stackoverflow topic关于google“你的意思是”

答案 2 :(得分:5)

Church和Gale的{p> Probability Scoring for Spelling Correction可能有所帮助。在那篇论文中,作者将拼写错误描述为作者与计算机之间的嘈杂通道。附录中有关于在美联社出版物中看到的拼写错误的表格。每种拼写错误都有一个表格:

  • 缺失
  • 插入
  • 取代
  • 换位

例如,检查插入表,我们可以看到在 l 128次之后 l 被错误地插入(该列中的最高数字)。使用这些表格,您可以生成您正在寻找的概率。

答案 3 :(得分:2)

如果研究是您的兴趣,我认为继续使用该算法,尝试找到合适的权重将是富有成效的。

我无法帮助你处理拼写错误,但我认为你也应该使用python的difflib。具体来说,SequenceMatcher的ratio()方法。它使用的文档http://docs.python.org/library/difflib.html声称非常适合匹配“看起来正确”,并且可能有助于增强或测试您正在做的事情。

对于只是寻找拼写错误的python程序员来说,这是一个很好的起点。我的一位同事使用了Levenshtein编辑距离和SequenceMatcher的比率(),并从比率()得到了更好的结果。

答案 4 :(得分:1)

有些问题可以帮助您确定是否应该询问“我在哪里可以找到真实世界的重量”问题:

您是否真的测量了统一加权实施的有效性?怎么样?

你有多少不同的“内部对象” - 即字典的大小是多少?

你如何实际使用编辑距离,例如John / Joan,Marmaduke / Marmeduke,Featherstonehaugh / Featherstonhaugh:是“所有1个错误”还是25%/ 11.1%/ 5.9%的差异?您使用的是什么门槛?

你的门槛中有多少对字典条目(例如John vs Joan,Joan vs Juan等)?如果你引入了一个花哨的加权系统,那么会有多少对字典条目从阈值内部迁移到外部(b),反之亦然?

如果John和Juan都在您的字典中并且用户键入Joan?

,您会怎么做?

(1)选择错误的词典单词(不是用户的意思)(2)未能识别用户输入的惩罚/成本是什么?

引入复杂的加权系统是否会实际上减少上述两种错误类型的概率,以便使复杂化和速度更慢更有价值?

顺便说一句,你怎么知道用户使用的键盘?

更新

“”“由于上述原因,我当前的非加权算法经常因为拼写错误而失败。”星期四回归“:每个”真人“很容易告诉周四比周二更容易,但他们都是1-编辑距离!(是的,我记录并测量我的表现)。“”“

是的,星期四 - >通过省略“h”,但周二 - >用“r”代替“e”代替Tursday。 E和R在qwERty和azERty键盘上彼此相邻。每个“真人”都可以轻易地猜测周四比周二更有可能。即使统计数据和猜测指向周四比周二更有可能(也许省略h将花费0.5并且e-> r将花费0.75),差异(可能是0.25)是否足够重要以至于总是选择周四?你的系统可以/你会问“你的意思是周二吗?”或者/它会在周四推进吗?