java - Peter Norvig 的多词匹配拼写检查器

标签 java algorithm pattern-matching spell-checking match-phrase

Peter Norvig 的著名作品 spellchecker (Java 8 版本 here )能够纠正单个单词,如果训练数据中出现与该单词接近的内容。但是我该如何调整它来处理整个短语。例如,如果我有一个文件,其中每个短语都用换行符分隔:

Plastic box
Pencils and sketch
Romeo and Juliet
.
.
.

如果我告诉算法更正 'Platic',它应该返回 'Plastic box'。同样,如果我告诉它更正 'Pencils',它应该返回 'Pencils and sketch'

我尝试更改上面代码的以下几行(Java 版本):

Stream.of(new String(Files.readAllBytes( dictionaryFile )).toLowerCase().replaceAll("[^a-z ]","").split(" ")).forEach( (word) ->{
            dict.compute( word, (k,v) -> v == null ? 1 : v + 1  );
        });

 Stream.of(new String(Files.readAllBytes( dictionaryFile )).toLowerCase().split("\n")).forEach( (word) ->{
            dict.compute( word, (k,v) -> v == null ? 1 : v + 1  );
        });

但似乎没有用。

最佳答案

如果你仔细查看 Norvig 的拼写检查器,你会发现作为错误模型,他使用了 edit distance 1 和 2 处的单词拼错的单词因此,如果您想使用文件 big.text 作为字典来更正 Platic,它可以找到编辑距离为 2 的单词 Elastic作为候选正确词。

现在,使用您修改后的代码,短语 Plastic box 与单词 Platic 的编辑距离不在 2 以内,它甚至不会被视为候选词错误模型,这就是它不起作用的原因。

例如,它们之间的编辑距离为 5,那么您必须实现函数 edit3edit4edit5 才能使其工作,这将需要考虑数百万个单词并且效率很低。

相反,我认为你可以考虑 bigram language model 并且尽管为拼错的单词返回一个可能的候选词,你可以返回最有可能的 bigram短语,取决于字典中的出现概率,使用语言模型 P(塑料盒)=P(Plastic)*P(box|Plastic) 和候选短语的概率a P(Plastic box)*P( Platic|Plastic Box)Bayes公式,如果您有一个错误模型`到位(或者您有数据可以学习)。

关于java - Peter Norvig 的多词匹配拼写检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987840/

相关文章:

java - 多代理框架 SACI 未找到错误

java - Spring 和GAE : ExceptionInInitializerError

java - 如何忽略大小写并考虑字母数字字符

c++ - 如何在存储指针的容器中查找整数?

algorithm - 从 python 中的序列列表中提取特定对象

list - Haskell - 列出多个参数的模式匹配? (不能构造无限类型)

Haskell 模式匹配字符串中的字符

Java 正则表达式 : Case insensitive matching for non English characters

java - 如何获取 HTMLEditor、JavaFX 中的节点 ID

java - 如何根据(使用)选定的随机数找到选择限制?