真实世界的错字统计? [关闭]
Posted
技术标签:
【中文标题】真实世界的错字统计? [关闭]【英文标题】:Real world typo statistics? [closed] 【发布时间】:2011-03-26 01:35:48 【问题描述】:我在哪里可以找到一些真实世界的拼写错误统计信息?
我试图将人们的输入文本与内部对象相匹配,但人们往往会犯拼写错误。 有2种错误:
typos
- “Hello”而不是“Hello”/“Satudray”而不是“Saturday”等。
Spelling
- “Shikago”而不是“Chicago”
我将Damerau-Levenshtein distance 用于拼写错误,Double Metaphone 用于拼写(Python 实现here 和here)。
我想专注于 Damerau-Levenshtein(或简称为 edit-distance
)。教科书的实现总是使用“1”作为删除、插入替换和转置的权重。虽然这很简单并且允许使用很好的算法,但它与“现实”/“现实世界的概率”不匹配。
例子:
我确信“Hello”(“Hello”)的可能性大于“Helzlo”,但它们都在 1 个编辑距离之外。 在 QWERTY 键盘上,“Gello”比“Qello”更接近“Hello”。 Unicode 音译:“München”和“Munchen”之间的“真实”距离是多少?删除、插入、替换和转置的“真实世界”权重应该是多少?
即使Norvig's very cool spell corrector 使用非加权编辑距离。
顺便说一句-我确定权重需要是函数而不是简单的浮点数(根据上述 例子)...
我可以调整算法,但我在哪里可以“学习”这些权重?我无权访问Google-scale data...
我应该猜他们吗?
编辑 - 尝试回答用户问题:
由于上述原因,我当前的非加权算法在遇到拼写错误时经常失败。 “周四回归”:每个“真人”都可以轻松判断周四比周二更有可能,但他们都在 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 and Recall 中的提升。【问题讨论】:
也许 MS 已经进行了一项研究(虽然 Word 的拼写校正没有那么智能,但实际上我认为它实际上只是根据常见错误列表检查每个拼写)。此外,谷歌非常致力于开源开发,如果你问得好,也许他们会给你这样的数据? Google 规模的数据很有趣。它是一个可以访问和查询的东西,还是只是一个示例页面? 如果您在权重中以某种方式考虑到关键接近度可能会有所帮助。键入 Hellp 比 Hellz 更有可能发生,因为 q 键接近“正确”的 o 键(假设 QWERTY...) 虽然我同意错字频率会很有用,但很难找到频率数据,因为它本质上是主观的。 “真实世界”概率的问题在于“真实世界”是一个非常大的地方。小学生的错误频率分布与从事应收账款工作的中年女性截然不同,这反过来又与大学英语教授不同。找到适合您的问题领域的“平均值”绝非易事。 除非你在推特上,否则是伟大的均衡器。 【参考方案1】:现实世界中错字统计的可能来源是***的完整编辑历史。
http://download.wikimedia.org/
另外,您可能对 AWB 的 RegExTypoFix 感兴趣
http://en.wikipedia.org/wiki/Wikipedia:AWB/T
【讨论】:
+1 非常非常有趣!我一定会调查这个的! 我等了一会儿,到目前为止这是最好的答案。谢谢!【参考方案2】:我建议您查看trigram alogrithm。在我看来,它更适合查找错别字然后编辑距离算法。它也应该运行得更快,如果你将字典保存在 postgres 数据库中,你可以使用索引。
您可能会发现有用的 *** topic 关于 google “你是说”
【讨论】:
【参考方案3】:Probability Scoring for Spelling Correction Church and Gale 可能会有所帮助。在那篇论文中,作者将拼写错误建模为作者和计算机之间的嘈杂通道。附录包含美联社出版物语料库中出现的拼写错误表格。以下每种错别字都有一个表格:
删除 插入 替换 转座例如,检查插入表,我们可以看到 l 在 l 128 次(该列中的最高数字)之后被错误插入。使用这些表,您可以生成您正在寻找的概率。
【讨论】:
链接是 404ed - 在这里找到它:denizyuret.com/ref/church/published_1991_hand.ps.gz【参考方案4】:如果您对这项研究感兴趣,我认为继续使用该算法,尝试找到合适的权重会很有成效。
我无法帮助您解决拼写错误,但我认为您也应该使用 python 的 difflib。具体来说就是 SequenceMatcher 的 ratio() 方法。它使用了文档http://docs.python.org/library/difflib.html 声称非常适合匹配“看起来正确”的算法,并且可能有助于增强或测试您正在做的事情。
对于只寻找拼写错误的 Python 程序员来说,这是一个很好的起点。我的一位同事同时使用了 Levenshtein 编辑距离和 SequenceMatcher 的 ratio(),并从 ratio() 获得了更好的结果。
【讨论】:
【参考方案5】:向您提出一些问题,以帮助您确定是否应该提出“我在哪里可以找到真实世界的权重”的问题:
您是否实际测量过统一加权实施的有效性?怎么样?
你有多少不同的“内部对象”——即你的字典有多大?
您如何实际使用编辑距离,例如John/Joan、Marmaduke/Marmeduke、Featherstonehaugh/Featherstonhaugh:这是“全 1 错误”还是 25% / 11.1% / 5.9% 的差异?你用的是什么阈值?
有多少对字典条目在您的阈值范围内(例如 John vs Joan、Joan vs Juan 等)?如果你引入了一个花哨的加权系统,有多少对字典条目会迁移(a)从阈值内部迁移到外部(b)反之亦然?
如果 John 和 Juan 在您的字典中并且用户键入 Joan,您会怎么做?
(1) 选择了错误的字典单词(不是用户的意思)(2) 未能识别用户的输入的惩罚/成本是什么?
引入一个复杂的加权系统实际上是否会充分降低上述两种错误类型的概率,以使复杂性和较慢的速度值得?
顺便说一句,你怎么知道用户使用的是什么键盘?
更新:
"""由于上述原因,我当前的非加权算法在遇到拼写错误时经常失败。“周四返回”:每个“真人”都可以很容易地看出周四比周二更有可能,但它们都是 1-编辑距离!(是的,我会记录并衡量我的表现)。"""
是的,星期四 -> 星期四,省略“h”,但星期二 -> 星期四,用“r”代替“e”。 E 和 R 在 qwERty 和 azERty 键盘上彼此相邻。每个“真人”都可以轻松猜测星期四比星期二更有可能。即使统计数据和猜测表明星期四比星期二更有可能(也许省略 h 将花费 0.5 并且 e->r 将花费 0.75),差异(也许 0.25)是否足够显着以总是选择星期四?你的系统可以/会问“你的意思是星期二吗?”还是会在星期四继续前进?
【讨论】:
好问题。我故意省略了一些答案,以使问题更笼统并引起其他用户的兴趣...无论如何,我将编辑问题以尝试回答。 我不知道用户使用的是哪个键盘,但我肯定 QWERTY 变体比 Dvorak 更常见。以上是关于真实世界的错字统计? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章