在哪里可以找到一些现实世界的拼写错误统计数据?
我正在尝试将人们的输入文本与内部对象匹配,人们往往会犯拼写错误。
有两种类型的错误:
typos
– 例如,“Helllo”而不是“Hello” / “Satudray”而不是“Saturday”等。Spelling
– 例如,“Shikago”而不是“Chicago”。
我使用Damerau-Levenshtein距离来处理拼写错误,使用Double Metaphone来处理拼写(Python实现在这里和在这里)。
我想专注于Damerau-Levenshtein(或简称edit-distance
)。教科书上的实现总是将删除、插入、替换和转置的权重设为‘1’。虽然这简单且有利于实现优雅的算法,但它并不符合“现实”/“现实世界的概率”。
例如:
- 我确信“Helllo”(“Hello”)的可能性大于“Helzlo”,但它们都只有一次编辑距离。
- 在QWERTY键盘上,“Gello”比“Qello”更接近“Hello”。
- Unicode音译: “München”和“Munchen”之间的“真实”距离是多少?
删除、插入、替换和转置的“现实世界”权重应该是什么?
即使是Norvig非常酷的拼写校正器也使用非加权的编辑距离。
顺便说一句,我确信这些权重需要是函数而不是简单的浮点数(如上例所示)…
我可以调整算法,但我在哪里可以“学习”这些权重?我没有访问Google规模的数据…
我应该只是猜测它们吗?
编辑 – 尝试回答用户问题:
- 我当前的非加权算法在面对拼写错误时经常失败,原因如上所述。“周四返回”:每个“真实的人”都能轻易看出Thursday比Tuesday更有可能,但它们都只有一次编辑距离!(是的,我确实记录并测量我的表现)。
- 我正在开发一个NLP旅行搜索引擎,因此我的词典包含大约25K个目的地(预计增长到100K),时间表达大约200个(预计1K),人物表达大约100个(预计300),货币表达大约100个(预计500),“粘合逻辑词”(如“from”, “beautiful”, “apartment”)大约2K(预计10K)等等…
- 编辑距离在上述各词组中的使用方式不同。我尝试在明显的情况下“自动更正”,例如,仅与词典中的另一个词有一次编辑距离。我有许多其他手动调整的规则,例如,Double Metaphone修复,该修复与词典中的一个词的编辑距离不超过2,且长度大于4…随着我从现实世界的输入中学习,规则列表还在继续增长。
- “词典条目中有多少对在你的阈值内?”:嗯,这取决于“花哨的加权系统”和现实世界(未来的)输入,不是吗?无论如何,我有广泛的单元测试,因此我对系统所做的每一次更改都只会使其更好(当然是基于过去的输入)。大多数少于6个字母的词都与另一个词典条目有一次编辑距离,而该词又与另一个词典条目有一次编辑距离。
- 当有两个词典条目与输入的距离相同时,我会尝试应用各种统计数据来更好地猜测用户的意思(例如,法国的Paris比伊朗的Pārīz更有可能出现在我的搜索中)。
- 选择错误词的成本是向最终用户返回半随机(通常是荒谬的)结果,并可能失去一个客户。不理解的成本稍微低一些:用户将被要求重新表述。
- 复杂性的成本是否值得?是的,我确信是值得的。你不会相信人们向系统输入的拼写错误数量,并期望它能理解,我确实需要提升精确度和召回率。
回答:
现实世界拼写错误统计数据的可能来源是维基百科的完整编辑历史。
http://download.wikimedia.org/
另外,你可能对AWB的RegExTypoFix感兴趣