Google的“您是不是要”功能
在上一篇文章中对Lucene进行了介绍之后 ,现在是时候提高它,创建一个更复杂的应用程序了。 您肯定最熟悉Google的“您是不是要”功能(其他搜索引擎也支持此功能)。 这是一个例子:
Lucene SpellChecker子项目
可以使用Lucene项目在Java中实现此功能,本教程将向您展示如何使用。 该实现将基于Lucene的子项目之一,即SpellChecker(请参阅拼写检查器API )。 这篇文章的灵感来自于我在InfoQ上读到的一篇最近的文章,名为“ 在Java中实现Google的“您的意思”功能 ”。 作者简短描述了所使用的编辑距离算法,然后提供了一个简单的代码示例。 我还找到了一篇类似的文章,标题为“ 您的意思是:Lucene吗? ”,但这是在2005年写的,所以我想它现在已经过时了。 首先查看这些内容,然后再采取一些措施是一个好主意。
寻找基础字典
在本教程中,将使用英语词典文本文件。 您可以对此进行简单搜索 ,也可以直接下载此压缩文件 。 该文件非常简单,仅包含用行分隔的单词。 提取的文件名为“ fulldictionary00.txt”。
使用Lucene SpellChecker API
让我们开始创建一个新的Eclipse项目(可能名为“ LuceneSuggestionsProject”),然后导入必要的JAR文件。 除了主要的JAR lucene-core-3.0.1.jar外,我们还需要lucene-spellchecker-3.0.1.jar。 这可以在解压缩的tarball文件夹“ lucene-3.0.1 \ contrib \ spellchecker”中找到。 如果您不知道如何查找发行版以及如何开始该项目,请查看我以前的文章( 全文搜索Apache Lucene简介 )。 创建一个名为“ SimpleSuggestionService”的新类,并确保包含一个主要方法。 此类的源代码如下:
package com.javacodegeeks.lucene.spellcheck;import java.io.File;import org.apache.lucene.search.spell.PlainTextDictionary;
import org.apache.lucene.search.spell.SpellChecker;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;public class SimpleSuggestionService {public static void main(String[] args) throws Exception {File dir = new File("c:/spellchecker/");Directory directory = FSDirectory.open(dir);SpellChecker spellChecker = new SpellChecker(directory);spellChecker.indexDictionary(new PlainTextDictionary(new File("c:/fulldictionary00.txt")));String wordForSuggestions = "hwllo";int suggestionsNumber = 5;String[] suggestions = spellChecker.suggestSimilar(wordForSuggestions, suggestionsNumber);if (suggestions!=null && suggestions.length>0) {for (String word : suggestions) {System.out.println("Did you mean:" + word);}}else {System.out.println("No suggestions found for word:"+wordForSuggestions);}}}
是的,就是这么简单。 如果运行应用程序(使用“ hwllo”作为输入字),将出现以下输出:
解释SpellChecker API
该代码非常简单,但是我将详细介绍一些类。 首先,您需要一个Directory ,它是文件的平面列表。 此类是抽象的,因此我们将FSDirectory用作实际实现。 FSDirectory将索引文件存储在文件系统中(为了评估访问速度更快的RAMDirectory ,它是驻留在内存中的实现,应该进行评估)。 下一步是创建一个SpellChecker实例,这是我们应用程序的核心。 请注意,默认的StringDistance是LevensteinDistance 。 如果您希望使用其他算法( JaroWinklerDistance或NGramDistance ),则可以使用setStringDistance方法。 接下来,我们实例化一个PlainTextDictionary ,它指向我们下载的文本文件。 将字典编入索引,然后使用SpellChecker对象检索拼写错误的单词的建议单词。
我想您现在准备创建下一个大型搜索引擎。 您可以在此处找到相关的Eclipse项目。
请享用!
- 全文搜索Apache Lucene简介
- 使用Spring AspectJ和Maven进行面向方面的编程
- 调度Java应用程序中的主体
- 依赖注入–手动方式
翻译自: https://www.javacodegeeks.com/2010/05/did-you-mean-feature-lucene-spell.html