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的背景图片(一般采用颜色比较浅的)。另一张是进度条的图片(一般采用颜色比较深的图片)。进度在滚动时:进度图片逐步显示,背景图片逐…

汇编小记16/3/27

最后更新2016-03-27 21:05:06 [address]与[bx] [address] 在debug中mov ax,[0] 等价于mov ax,ds:[0] [0]表示内存偏移地址 但是在masm汇编解释器中,mov ax,[0] 等价于mov ax,0 [0]表示常量0 [bx] mov ax,[bx] 表示 bx存放的数据为一个偏移地址,段…

ConcurrentLinkedHashMap v 1.0.1发布

大家好,我们发布了并发LinkedHashMap实现的1.0.1版本。 在最新版本中,已进行了一些较小的修改,以在多个线程遍历映射的元素时提高性能。 最新版本还引入了可插拔驱逐策略。 当然,您可以实现自定义逐出策略,也可以将它…

BOMbing The System

roy g bivFebruary 2011 [Back to index] [Comments (0)] What is a BOM? Why should we care? Great, can we do that? Okay, lets do it! Unicode in files Greets to friendly people (A-Z) What is a BOM? Its not the thing that explodes. Thats a BOMB. Heh. BO…

鸟哥的linux私房菜学习笔记 ---第7章-2

1,文件内容查阅的命令: cat ,tac nl,more, less,head,tail ,od 文件的查阅参数,显示行号如何显示行号 nl 中的所有参数都是关于如何显示行号的 这里面less的功能更多,更灵活 :空格 下一页 pageup上一页 pagedown 下一页 /string 字符串查询 ?string 反向字符串查询 man的命…

HDU - 4497 GCD and LCM

题意:给出三个数的gcd,lcm,求这三个数的全部的可能 思路 :设x,y,z的gcd为d,那么设xd*a,yd*b,zd*c。a,b。c肯定是互质的。那么lcmd*a*b*c,所以我们能够得到a*b*clcm/gcdans,将ans分解因数后&…

Java Lambda语法替代

关于lambda-dev邮件列表的讨论已经开始解决lambdas /函数文字的Java语言语法应该是什么样的问题。 让我们看一个稍微平凡的例子,然后尝试弄清楚问题。 Perl的人有一个很好的例子,说明以某种功能性的方式使用函数引用–他们称其为Schwartzian变换&#xf…

浅析SMC技术

今天让我们来看Win32ASM里面的高级一点的技术——SMC(当当当当……)!!!SMC是什么意思?它的英文名叫“Self Modifying Code”,顾名思义,就是“代码自修改”(?&…

JAVA基础--程序是顺序执行的

class Testa {public static void main(String[] args) {String aa"aaa";String bb"bbb"aa;aa"cccc";System.out.println(bb);} } 输出的是 “bbbaaa class Testa {public static void main(String[] args) {String aa"aaa";String …

Spring MVC拦截器示例

我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具。 Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截,或者相反,在其…

Android 调用系统的分享[完美实现同一时候分享图片和文字]

android 系统的分享功能 private void share(String content, Uri uri){Intent shareIntent new Intent(Intent.ACTION_SEND); if(uri!null){//uri 是图片的地址shareIntent.putExtra(Intent.EXTRA_STREAM, uri);shareIntent.setType("image/*"); //当用户选择短信时…

团队行为守则—如果你们由我来领导

如果你是在我领导的团队里,有几个额外的事情我要告诉你。我深信这些行为守则是一个高效团队的润滑剂,我并不只是要求别人这样做,我自己也严格恪守。 只有三样事: 问:如果你对任务不清楚&#…

做短,但做对!

编写简洁,优雅,清晰的代码一直是开发人员的艰巨任务。 您的同事不仅会感谢您,而且您会惊讶地发现,不断期待着重构解决方案以更少的代码完成更多(或至少相同)的工作是多么令人兴奋。 曾经有人说好的程序员是…

math

莫比乌斯反演: $F(n) \sum\limits_{d|n} {f(d)} \Leftrightarrow \sum\limits_{d|n} {\mu (d)F(\frac{n}{d})} $ 其中 ${\mu (d)}$为莫比乌斯函数: 若$d$等于0 , 则${\mu (d)}$1 若$d {p_1}{p_2}{p_3}...{p_k}$ , ${p_i}$为互异质数,则${\mu (d)}$${( …

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

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

Java Swing –日期选择器对话框

房子里有Swing开发人员吗? 对于使用Swing的用户来说,这是一个GUI组件,可能会对您的UI编码工作有所帮助。 我们的JCG合作伙伴之一提供了日期选择器小部件。 一探究竟: Java Swing –日期选择器对话框以选择日期 翻译自: https://…

Casperjs中fill提交表单遇到的问题

1.if you access internet with proxy please add --ignore-ssl-errorstrue --ssl-protocolany 2.casper.then* and casper.wait* 都是异步执行的 他们的调用,都是按堆栈中的顺序来执行;也就是说,其他同步执行的函数,…

Xuggler视频处理简介

注意:这是我们的“ Xuggler开发教程 ”系列的一部分。 随着互联网上视频的爆炸式增长,开发人员经常需要在其应用程序中操纵视频内容。 Xuggler是Java开发人员的免费开放源代码库,可用于实时解压缩,处理和压缩录制的视频或实时视频…

软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

转:软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别 举个例子吧 if A and B then Action1 if C or D then Action2 语句覆盖最弱,只需要让程序中的语句都执行一遍即可 …

Spring_讲解

http://s,i,s,h,u,o,k.com/forum/blogPost/list/6174.html转载于:https://www.cnblogs.com/gisblogs/p/4579162.html