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 );
});
但它似乎没有用。
答案 0 :(得分:0)
如果你仔细阅读Norvig的spellchecker
,你会发现error model
他使用错误拼写单词edit distance
1和2处的单词。因此,如果您想使用文件Platic
作为字典更正big.text
,则可以找到位于编辑距离2的单词Elastic
作为候选正确单词。
现在,使用修改后的代码,短语Plastic box
甚至距离单词Platic
不在2个编辑距离内,甚至不会被视为错误模型中的候选,这就是为什么它不起作用。
例如,编辑它们之间的距离为5,然后您必须实现函数edit3
,edit4
和edit5
才能使其正常工作,这需要考虑数百万字和会效率很低。
相反,我认为您可以考虑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
错误模型到位(或者你有数据可以学习)。