现实世界的拼写错误统计?
我在哪里可以找到一些真实的拼写错误统计数据?
我正在尝试将人们输入的文本与内部对象匹配,但人们往往会犯拼写错误。
错误主要有两种类型:
拼写错误
- 比如把 "Hello" 错写成 "Helllo",把 "Saturday" 错写成 "Satudray" 等等。拼写
- 比如把 "Chicago" 错写成 "Shikago"。
我使用 Damerau-Levenshtein 距离 来处理拼写错误,使用 Double Metaphone 来处理拼写(Python 实现可以在 这里 和 这里 找到)。
我想专注于 Damerau-Levenshtein(或者简单称为 编辑距离
)。教科书中的实现总是将删除、插入、替换和调换的权重设为 '1'。虽然这样简单,算法也很好,但这并不符合“现实”或“真实世界的概率”。
举几个例子:
- 我相信 "Helllo"("Hello")的可能性比 "Helzlo" 更高,尽管它们的编辑距离都是 1。
- 在 QWERTY 键盘上,"Gello" 离 "Hello" 更近,而不是 "Qello"。
- Unicode 转写: "München" 和 "Munchen" 之间的“真实”距离是多少?
那么,删除、插入、替换和调换的“真实世界”权重应该是多少呢?
即使是 Norvig 的拼写纠正器 也使用了没有权重的编辑距离。
顺便说一下,我相信这些权重需要是函数,而不仅仅是简单的浮点数(根据上面的例子)……
我可以调整算法,但我在哪里可以“学习”这些权重呢?我没有访问 谷歌规模的数据……
我应该随便猜测吗?
编辑 - 尝试回答用户问题:
- 我当前的无权重算法在面对拼写错误时经常失败,原因如上所述。“Return on Tursday”:每个“真实的人”都能轻易判断 Thursday 比 Tuesday 更可能,但它们的编辑距离都是 1! (是的,我确实记录并测量我的性能)。
- 我正在开发一个自然语言处理的旅行搜索引擎,所以我的字典包含大约 25,000 个目的地(预计会增长到 100,000),时间表达式大约 200(预计 1,000),人名表达式大约 100(预计 300),货币表达式大约 100(预计 500),“连接逻辑词”(如“从”、“美丽”、“公寓”)大约 2,000(预计 10,000)等等……
- 编辑距离在每个词组中的使用是不同的。我尝试在明显的情况下“自动纠正”,例如与字典中仅有一个其他单词的编辑距离为 1。我有很多其他手动调整的规则,例如 Double Metaphone 修正,它与字典中长度大于 4 的单词的编辑距离不超过 2……规则列表随着我从现实输入中学习而不断增长。
- “在你的阈值内有多少对字典条目?”:这取决于“复杂的加权系统”和现实世界(未来)的输入,不是吗?无论如何,我有广泛的单元测试,以确保我对系统所做的每一次更改都能使其变得更好(当然是基于过去的输入)。大多数小于 6 个字母的单词与另一个字典条目之间的编辑距离都是 1。
- 今天,当有两个字典条目与输入的距离相同时,我尝试应用各种统计方法来更好地猜测用户的意思(例如,巴黎,法国在我的搜索中比 Pārīz,伊朗更可能出现)。
- 选择错误单词的代价是向最终用户返回半随机(通常荒谬)的结果,并可能失去客户。而不理解的代价稍微低一些:用户会被要求重新表述。
- 复杂性的代价值得吗?是的,我相信是值得的。你不会相信人们向系统输入了多少拼写错误,并期望它能理解,而我确实需要在 精确度和召回率 上有所提升。
5 个回答
5
Church和Gale的论文《拼写纠正的概率评分》可能会对你有帮助。在这篇论文中,作者把打字错误看作是作者和计算机之间的一个“嘈杂通道”。附录里有一些表格,列出了在美联社出版物中出现的打字错误。每种类型的打字错误都有一个表格,具体包括:
- 删除错误
- 插入错误
- 替换错误
- 调换错误
举个例子,看看插入错误的表格,我们可以看到字母l在另一个l后面被错误地插入了128次(这是这一列中最高的数字)。利用这些表格,你可以生成你需要的概率数据。
14