0

我正在尝试使用 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;
        }
}

我需要做一些改变吗?

4

1 回答 1

2

关于您的第一个问题,听起来像是PlainTextDictionary API中预期的、记录在案的字典格式。如果你想传入任意文本,你可能想索引它并使用LuceneDictionary代替,或者可能是HighFrequencyDictionary,这取决于你的需要。

拼写检查器会根据单词之间的相似性(基于Levenstein 距离)建议替换,然后再考虑其他问题。如果您希望它只推荐更流行的术语作为建议,您应该将SuggestMode传递给SpellChecker.suggestSimilar。这确保了建议的匹配至少与它们打算替换的词一样强大、受欢迎。

如果您必须覆盖 Lucene 决定最佳匹配的方式,您可以使用 SpellChecker.setComparator 来实现,在 SuggestWord创建您自己的 Comparator 。由于 SuggestWord向您展示,应该很容易按受欢迎程度排列找到的匹配项。freq

于 2013-03-15T15:36:29.567 回答