我正在尝试使用lucene拼写检查器编写一个拼写纠正器。我想给它一个带有博客文本内容的文本文件。问题是它只有在我的字典文件中每行给出一个句子/单词时才有效。此外,建议API返回结果,而不对任何出现次数赋予任何权重。以下是源代码
public class SpellCorrector {
SpellChecker spellChecker = null;
public SpellCorrector() {
try {
File file = new File("/home/ubuntu/spellCheckIndex");
Directory directory = FSDirectory.open(file);
spellChecker = new SpellChecker(directory);
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
spellChecker.indexDictionary(
new PlainTextDictionary(new File("/home/ubuntu/main.dictionary")), config, true);
//Should I format this file with one sentence/word per line?
} catch (IOException e) {
}
}
public String correct(String query) {
if (spellChecker != null) {
try {
String[] suggestions = spellChecker.suggestSimilar(query, 5);
// This returns the suggestion not based on occurence but based on when it occured
if (suggestions != null) {
if (suggestions.length != 0) {
return suggestions[0];
}
}
} catch (IOException e) {
return null;
}
}
return null;
}
}
我是否需要进行一些更改?
答案 0 :(得分:2)
关于您的第一个问题,听起来像PlainTextDictionary API中预期的,记录的字典格式。如果您想要传入任意文本,您可能需要将其编入索引并使用LuceneDictionary代替,或者使用HighFrequencyDictionary,具体取决于您的需求。
在任何其他问题出现之前,拼写检查会根据单词之间的相似性(基于Levenstein Distance)建议替换。如果您希望仅推荐更受欢迎的字词作为建议,则应将SuggestMode传递给SpellChecker.suggestSimilar。这可以确保建议的匹配至少与它们要替换的单词一样强大,流行。
如果您必须覆盖Lucene决定最佳匹配的方式,您可以使用SpellChecker.setComparator执行此操作,在SuggestWord上创建自己的比较器。由于SuggestWord向您公开freq
,因此应该很容易按人气排列找到的匹配项。