真实世界的错字统计?

我在哪里可以find一些现实世界的错字统计?

我试图将人们的input文本与内部对象相匹配,而且人们往往会犯拼写错误。
有两种错误:

  1. typos – “Helllo”,而不是“星期六”,而不是“你好”/“Satudray”等。
  2. Spelling – “芝加哥”而不是“芝加哥”

我使用Damerau-Levenshtein距离作为拼写错误( 双倍的Metaphone拼写)(Python实现在这里和这里 )。

我想关注Damerau-Levenshtein(或简单的edit-distance )。 教科书的实现总是使用“1”来表示删除,插入replace和换位的权重。 虽然这很简单并且考虑到很好的algorithm,但它不符合“现实”/“真实世界的概率”。

例子:

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

“现实世界”权重应该是删除,插入,replace和换位?

即使Norvig非常酷的拼写纠正器使用非加权编辑距离。

顺便说一句,我敢肯定,重量需要是function,而不是简单的浮动(按照上面的例子)…

我可以调整algorithm,但是我可以在哪里“学习”这些权重? 我无法访问Google规模的数据 …

我应该猜他们吗?

编辑 – 试图回答用户的问题:

  • 由于上述原因,我目前的非加权algorithm在遇到错字时经常失败。 “星期四回归”:每个“真实的人”都可以很容易地告诉周四比周二更有可能,但它们都是一个编辑距离! (是的,我做logging和衡量我的performance)。
  • 我正在开发一个NLP旅游search引擎,所以我的字典包含25K目的地(预计将增长到100K),时间expression〜200(预期1K),人物expression〜100(预计300),货币expression〜100(预期500 ),“胶合逻辑词”(“from”,“beautiful”,“apartment”)〜2K(预计10K)等等…
  • 编辑距离的使用对于每个上述单词组是不同的。 我试图“明显的时候自动校正”,例如,距离字典中的另外一个单词只有1个编辑距离。 我还有许多其他的手工调整的规则,例如,距离长度大于4的字典单词距离不超过2个编辑距离的双倍音位修正…当我从现实世界的input中学习时,规则列表不断增加。
  • “有多less对词典在你的门槛内?”:那么,这取决于“花哨的权重系统”和现实世界(未来)的input,不是吗? 无论如何,我有广泛的unit testing,以便我对系统做出的每一个改变只会使它变得更好(当然基于过去的input)。 大多数小于6个字母的单词距离距离另一个字典条目1个编辑距离的单词的编辑距离在1个编辑距离内。
  • 今天当有两个字典条目与input距离相同时,我尝试应用各种统计数据来更好地猜测用户的意思(例如,法国巴黎更有可能出现在我的search中,而不是伊朗的帕里兹)。
  • select一个错误的单词的成本是向最终用户返回半随机(通常是荒谬的)结果,并可能失去一个客户。 不理解的代价稍微便宜一些:用户会被要求重新修改。
  • 复杂性的代价是否值得呢? 是的,我确定它是。 你不会相信大量的错别字的人扔在系统,并期望它的理解,我可以肯定使用精确度和召回提高。

现实世界的打字错误统计的可能来源将在维基百科的完整编辑历史

http://download.wikimedia.org/

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

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

我会build议你检查三字节algorithm 。 在我看来,它更好地find错别字,然后编辑距离algorithm。 它应该工作得更快,如果你在postgres数据库中保存字典,你可以使用索引。

您可能会发现有用的关于谷歌的stackoverflow 主题 “你的意思是”

教堂和大风拼写纠正的概率评分可能会有所帮助。 在那篇文章中,作者将错别字作为作者与计算机之间的嘈杂声道build模。 附录中列出了美联社出版物中出现的拼写错误。 以下每种错别字都有一个表格:

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

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

如果研究是你的兴趣,我认为继续这个algorithm,试图find体面的权重将是成果丰硕的。

我不能帮你打字错误统计,但我想你也应该玩python的difflib。 具体来说,SequenceMatcher的ratio()方法。 它使用docs http://docs.python.org/library/difflib.html声明非常适合匹配那个“看起来正确”的algorithm,并且可能有助于增强或testing你在做什么。;

对于python程序员只是寻找错别字,这是一个很好的开始。 我的一个同事已经使用了Levenshtein编辑距离和SequenceMatcher的比率(),并从比率()得到更好的结果。

对你有些问题,以帮助你确定你是否应该问你“我在哪里find现实世界的权重”的问题:

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

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

你怎么实际使用编辑距离,例如John / Joan,Marmaduke / Marmeduke,Featherstonehaugh / Featherstonhaugh:是“全部1错误”,还是25%/ 11.1%/ 5.9%的差异? 你使用了什么样的门槛?

在你的门槛内有多less对字典条目(如约翰vs琼,琼和胡安等)? 如果你引入了一个奇特的加权系统,那么有多less对字典条目会从(a)门槛内迁移到(b)门户?

如果John和Juan都在你的字典中,并且用户input了Joan,你会怎么做?

(1)select错误的字典单词(不是用户意思的单词)的处罚/成本是什么?(2)不能识别用户的input?

引入一个复杂的加权系统实际上是否会有足够的余量来降低上述两种误差types的概率,使复杂度和速度变慢值得呢?

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

更新:

“”我现在的非加权algorithm出于上述原因经常遇到拼写错误。“”星期四返回“:每个”真实的人“都可以很容易的告诉星期四比星期二更可能,但是他们都是1编辑距离(是的,我logging和衡量我的performance)。“”“

是,星期四 – >星期四通过省略“h”,星期二 – >星期四用“r”代替“e”。 E和R在qwERty和azERty键盘上相邻。 每个“真实的人”都可以轻易地猜出周四比周二更可能。 即使统计数字和猜测指出星期四比星期二更有可能(可能省略了0.5的成本,而e-> r的成本是0.75),那么这个差距(也许是0.25)是否足够重要,总是会select星期四呢? 您的系统可以/将会问“您的意思是星期二吗?” 或者是否会在周四前进?

Interesting Posts