我在哪里可以找到一些真实世界的错字统计?
我试图将人们的输入文本与内部对象相匹配,而人们往往会犯拼写错误。
有2种错误:
typos
- “你好”而不是“你好”/“星期六”而不是“星期六”等。Spelling
- “Shikago”而不是“Chicago”
我将 Damerau-Levenshtein 距离用于拼写错误,使用Double Metaphone进行拼写(此处和此处的 Python 实现)。
我想专注于 Damerau-Levenshtein(或简单地说edit-distance
)。教科书的实现总是使用“1”作为删除、插入替换和转置的权重。虽然这很简单并且允许使用很好的算法,但它与“现实”/“现实世界的概率”不匹配。
例子:
- 我确信“Hello”(“Hello”)的可能性大于“Helzlo”,但它们都在 1 个编辑距离之外。
- 在 QWERTY 键盘上,“Gello”比“Qello”更接近“Hello”。
- Unicode 音译:“München”和“Munchen”之间的“真实”距离是多少?
删除、插入、替换和转座的“真实世界”权重应该是多少?
即使是Norvig 非常酷的拼写校正器也使用非加权编辑距离。
顺便说一句-我确定权重需要是函数而不是简单的浮点数(根据上面的示例)...
我可以调整算法,但我在哪里可以“学习”这些权重?我无权访问Google 规模的数据...
我应该猜他们吗?
编辑 - 试图回答用户问题:
- 由于上述原因,我当前的非加权算法在遇到拼写错误时经常失败。“周四回归”:每个“真人”都可以轻松判断周四比周二更有可能,但他们都在 1 编辑距离之内!(是的,我会记录并衡量我的表现)。
- 我正在开发一个 NLP 旅行搜索引擎,所以我的字典包含 ~25K 目的地(预计增长到 100K)、时间表达式 ~200(预计 1K)、人物表达式 ~100(预计 300)、金钱表达式 ~100(预计 500 )、“粘合逻辑词”(“from”、“beautiful”、“apartment”)~2K(预计10K)等等……
- 对于上述每个词组,编辑距离的使用是不同的。我尝试“在明显时自动更正”,例如与字典中仅 1 个其他单词相距 1 个编辑距离。我还有许多其他手动调整的规则,例如 Double Metaphone 修复,它与长度 > 4 的字典单词的编辑距离不超过 2...随着我从现实世界的输入中学习,规则列表继续增长。
- “你的阈值内有多少对字典条目?”:嗯,这取决于“花式加权系统”和现实世界(未来)的输入,不是吗?无论如何,我进行了大量的单元测试,因此我对系统所做的每一次更改都只会让它变得更好(当然,基于过去的输入)。大多数低于 6 个字母的单词与一个单词的编辑距离在 1 个编辑距离之内,而该单词与另一个字典条目的编辑距离为 1 个编辑距离。
- 今天,当有 2 个字典条目与输入的距离相同时,我尝试应用各种统计数据来更好地猜测用户的意思(例如,法国巴黎比伊朗巴黎更可能出现在我的搜索中)。
- 选择错误单词的代价是向最终用户返回半随机(通常是荒谬的)结果,并可能失去客户。不理解的成本略低:将要求用户重新措辞。
- 复杂性的代价值得吗?是的,我敢肯定。您不会相信人们向系统抛出的拼写错误数量并期望它能够理解,而且我肯定可以使用Precision 和 Recall的提升。