Apache Lucene拼写检查器的“您是不是要”功能

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android-做个性化的进度条

1.案例效果图 2.准备素材 progress1.png(78*78) progress2.png(78*78) 3.原理 采用一张图片作为ProgressBar的背景图片(一般采用颜色比较浅的)。另一张是进度条的图片(一般采用颜色比较深的图片)。进度在滚动时:进度图片逐步显示,背景图片逐…

(笔试题)二进制1的个数相同的距离最小数

题目: 输入:整数A输出:整数B条件:A和B的二进制1的个数相同,且A和B之间的距离|A-B|最小。思路: 题目没有说明整数类型,这里认为是带符号的整数,即区分正负数。 根据题意,A…

hadoop5--mapreduce设计模式

运行结果附图 本节课程主要内容为学习MapReduc设计模式,并编写java程序对日志文件进行处理。 课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Corre…

jqGrid,REST,AJAX和Spring MVC集成

两年多以前,我写了一篇关于两个如何在Struts2中实现优雅的CRUD的文章。 实际上,我必须就该主题写两篇文章,因为该主题如此广泛。 今天,我采用了一套更为流行的,完善的框架和库,采用了更为轻量级的现代方法。…

Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口

一、概述 1.目标:把Proxy修改成可以代理任意接口及其任意方法 2.思路: (1)代理任意接口:把接口类型作为参数传给Proxy的newProxyInstance(Class interfze) (2)代理任意方法:用interfze.getMethods()取出所有方法,拼接实…

C语言5-7习题

本题要求实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

BC div2补题以及 复习模除 逆元__BestCoder Round #78 (div.2)

第一题没话说 智商欠费 加老柴辅导终于过了 需要在意的是数据范围为2的63次方-1 三个数相加肯定爆了 四边形的定义  任意边小于其余三边之和 换句话说就是  最长边小于其余三边之和 这样的话问题转化为 最长边依次减其余三边的结果是否小于等于0 还有一点是题目出现0边 即最…

习题6-1 分类统计字符个数 (15 分)

本题要求实现一个函数&#xff0c;统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。 函数接口定义&#xff1a; void StringCount( char s[] );其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照 letter 英文字母个数, blank 空格或回车…

Servlet 3.0异步处理可将服务器吞吐量提高十倍

Servlet是Java中处理服务器端逻辑的主要组件&#xff0c;新的3.0规范引入了一些非常有趣的功能&#xff0c;其中异步处理是最重要的功能之一。 可以利用异步处理来开发高度可伸缩的Web应用程序。 使用此功能可以有效地构建Web 2.0站点和AJAX应用程序。 我们的JCG合作伙伴之一To…

使用secureCRT连接VMware-Ubuntukylin虚拟机

使用SecureCRT连接VMware时总是提醒主机拒绝连接。这时可以使用sudo apt-get install openssh-server openssh-client&#xff0c;在主机上安装ssh. 安装成功后&#xff0c;可以连接到主机了。 如果显示远程主机拒绝连接。则可以使用如下方法。 VMware里面装的是Ubuntukylin版本…

国内有哪些好的刷题网站?

http://www.zhihu.com/question/25574458 Luau Lawrence&#xff0c;Data Mining 弱鸡 / PhDNTU 温梦强、石一帆、知乎用户 等人赞同 - Welcome To PKU JudgeOnline 北京大学的Online Judge。POJ上面的题目有点老了&#xff0c;但好处是做的人多&#xff0c;经典算法题多&…

Js 流程控制

流程控制 顺序、分支、循环 顺序结构 代码一行一行从上往下执行并解析 分支结构 if语句 switch语句 if语句 单分支 if(条件表达式){ //语句块 } 含义&#xff1a;当条件表达式为真的时候就执行里面的语句块 示例&#xff1a; 双分支&#xff1a; if(条件表达式){ //语句块1 }el…

SmartGWT入门,提供出色的GWT界面

SmartGWT简介 我最近开始使用SmartGWT &#xff0c;它是一个基于GWT的框架&#xff0c;该框架为您的应用程序UI提供了一个全面的小部件库&#xff0c;并为服务器端的数据管理提供了帮助。 您可以在SmartGWT展示柜上查看其漂亮的功能。 我准备了一个简短的“入门”指南&#xf…

Android OpenGL ES(四)----调整屏幕的宽高比

1.宽高比问题 我们现在相当熟悉这样一个事实&#xff0c;在OpenGL里&#xff0c;我们要渲染的一切物体都要映射到X轴和Y轴上[-1&#xff0c;1]的范围内&#xff0c;对于Z轴也一样。这个范围内的坐标被称为归一化设备坐标&#xff0c;其独立于屏幕实际尺寸或形状。 不幸的是&…

使用Spring Security保护GWT应用程序

在本教程中&#xff0c;我们将看到如何将GWT与Spring的安全模块&#xff08;即Spring Security&#xff09;集成在一起。 我们将看到如何保护GWT入口点&#xff0c;如何检索用户的凭据以及如何记录各种身份验证事件。 此外&#xff0c;我们将实现自定义身份验证提供程序&#x…

Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务-Eclipse和Maven项目

开发Web服务的RESTful方法不断受到越来越多的关注&#xff0c;并且似乎正在将SOAP淘汰。 我不会讨论哪种方法更好&#xff0c;但是我相信我们都同意REST更轻量级。 在本教程中&#xff0c;我将向您展示如何使用RESTeasy开发RESTful服务以及如何将它们部署在Tomcat服务器上。 在…

数据值、列类型和数据字段属性

数据值&#xff1a;数值型、字符型、日期型和空值等。数据列类型 2.1 数值类的数据列类型2.2 字符串类数据列类型 2.3 日期和时间型数据数据列类型 另外&#xff0c;也可以使用整形列类型存储UNIX时间戳&#xff0c;代替日期和时间列类型&#xff0c;这是基于PHP的web项目中常…

全文搜索Apache Lucene简介

在本教程中&#xff0c;我想谈谈Apache Lucene 。 Lucene是一个开源项目&#xff0c;提供基于Java的索引和搜索技术。 使用其API&#xff0c;很容易实现全文搜索 。 我将处理Lucene Java版本 &#xff0c;但请记住&#xff0c;还有一个名为Lucene.NET的.NET端口&#xff0c;以及…

Java中的低GC:使用原语而不是包装器

总览 有两个很好的理由在可能的地方使用原语而不是包装器。 明晰。 通过使用原语&#xff0c;您可以清楚地知道null值是不合适的。 性能。 使用原语通常更快。 清晰度通常比性能更重要&#xff0c;并且是使用它们的最佳理由。 但是&#xff0c;本文讨论了使用包装程序对性能…

Java Secret:使用枚举构建状态机

总览 Java中的枚举比许多其他语言更强大&#xff0c;这可能导致令人惊讶的用途。 在本文中&#xff0c;我概述了Java 枚举的一些单独功能&#xff0c;并将它们组合在一起形成一个状态机。 单例和实用程序类的枚举 您可以非常简单地将枚举用作Singleton或Utility。 enum Si…