Peter Norvig用于多字匹配的拼写检查

时间:2017-02-01 19:16:49

标签: 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  );
        });

但它似乎没有用。

1 个答案:

答案 0 :(得分:0)

如果你仔细阅读Norvig的spellchecker,你会发现error model他使用错误拼写单词edit distance 1和2处的单词。因此,如果您想使用文件Platic作为字典更正big.text,则可以找到位于编辑距离2的单词Elastic作为候选正确单词。

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

例如,编辑它们之间的距离为5,然后您必须实现函数edit3edit4edit5才能使其正常工作,这需要考虑数百万字和会效率很低。

相反,我认为您可以考虑bigram language model,尽管为拼写错误的单词返回单个可能的候选词,但您可以返回最可能的bigram phrase,具体取决于{probability of occurrence 1}}在字典中,language model P(Plastic box)= P(Plastic)* P(box | Plastic)和候选短语概率a P(Plastic box)* P(Platic | Plastic Box)with贝叶斯formula, if you have an错误模型到位(或者你有数据可以学习)。