Lucene+分词器精确提取用户自定义关键词(Lucene版本3.6)

此篇博客的Lucene版本是3.6.0,若您的Lucene版本为5.X可以移步到此博文http://blog.csdn.net/echoyy/article/details/78468225


在分词的过程中,有时候需要只提取词典里自定义好的关键词,而传统的分词工具如(IKanalyzer)好像并不支持此功能


CSDN论坛里有人给出解决方法,是采用Lucene的TermQuery方法来进行索引的检索功能


然而我自己在调用TermQuery时候反而什么都检索不出来


最后发现是索引的建立问题


最开始使用的是流的方式读词典文件就像酱样doc.add(new Field("contents",new FileReader(files)));


然后使用TermQuery就gg了,因此唯结果论话推测这种方式在建立索引的时候应该是对文本进行了拆解,也就是说比如词典里存的是“你好”,这种方式在建立索引时将“你好”拆成了“你”和“好”,导致TermQuery在对“你好”进行检索的过程中检索不到值。


解决方案是先用BufferReader来读取词典中的文本,将其存到一个List<String> content中,后续循环取List中的值调用doc.add(new Field("contents",content,Field.Store.YES, Field.Index.NOT_ANALYZED));方法


注意这里的域索引选项(Field.Index.*)使用的是Index.NOT_ANALYZED参数,这是由于该参数实际上将域值作为单一语汇单元并使之能被搜索。适用于索引那些不能被分解的域值比如URL、文件路径、日期、人名、电话号码等。


然后,搞定


最后是索引和检索的代码

1、建立索引

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;/*** 类简介: ①简单的向文档里写索引; ②在根据索引读取文档; ③运用路径来找被索引的文档,找到返回结果*/
public class Indexer {// 写索引的实例到指定目录下private IndexWriter writer;/*** 构造方法:为了实例化IndexWriter*/public Indexer(String indexDir) throws Exception {// 得到索引所在目录的路径Directory dir = FSDirectory.open(new File(indexDir));// 实例化分析器Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);// 实例化IndexWriterConfigIndexWriterConfig con = new IndexWriterConfig(Version.LUCENE_35, analyzer);// 实例化IndexWriterwriter = new IndexWriter(dir, con);}/*** 关闭写索引* * @throws Exception*/public void close() throws Exception {writer.close();}/*** 索引指定目录的所有文件* * @throws Exception*/public int index(String dataDir) throws Exception {// 定义文件数组,循环得出要加索引的文件File[] file = new File(dataDir).listFiles();for (File files : file) {// 从这开始,对每个文件加索引indexFile(files);}// 返回索引了多少个文件,有几个文件返回几个return writer.numDocs();}/*** 索引指定文件* * @throws Exception*/private void indexFile(File files) throws Exception {System.out.println("索引文件:" + files.getCanonicalPath());// 索引要一行一行的找,,在数据中为文档,所以要得到所有行,即文档Document document = getDocument(files);// 开始写入,就把文档写进了索引文件里去了;writer.addDocument(document);}/*** 获得文档,在文档里在设置三个字段* * 获得文档,相当于数据库里的一行* * @throws Exception*/private Document getDocument(File files) throws Exception {// 实例化DocumentDocument doc = new Document();// add():把设置好的索引加到Document里,以便在确定被索引文档。List<String> contents = this.getContent(files);for (String content : contents) {doc.add(new Field("contents", content, Field.Store.YES, Field.Index.NOT_ANALYZED));}// 返回documentreturn doc;}private List<String> getContent(File files) {List<String> strList = new ArrayList<String>();try {InputStream stream = new FileInputStream(files);String code = "UTF-8";BufferedReader br = new BufferedReader(new InputStreamReader(stream, code));String str = br.readLine();while (str != null) {strList.add(str);str = br.readLine();}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return strList;}// 开始测试写入索引public static void main(String[] args) {// 索引指定的文档路径String indexDir = "./Index/Keyword";// 被索引数据的路径File dataDir = new File("D:\\workspace\\IKTest\\src\\ext.dic");// 写索引Indexer indexer = null;try {// 通过索引指定的路径,得到indexerindexer = new Indexer(indexDir);// 将要索引的数据路径(int:因为这是要索引的数据,有多少就返回多少数量的索引文件)indexer.indexFile(dataDir);} catch (Exception e) {e.printStackTrace();} finally {try {indexer.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}


2、搜索关键字

import java.io.File;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;/*** * 通过索引字段来读取文档**/
public class SearchKeyword {private  static final String indexDir = "./Index/Keyword";public boolean search(String keyword)throws Exception{//得到读取索引文件的路径Directory dir=FSDirectory.open(new File(indexDir));//通过dir得到的路径下的所有的文件IndexReader reader=IndexReader.open(dir);//建立索引查询器IndexSearcher is=new IndexSearcher(reader);//实例化分析器Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_35); //建立查询解析器/*** 第一个参数是要查询的字段;* 第二个参数是分析器Analyzer* */QueryParser parser=new QueryParser(Version.LUCENE_35, "contents", analyzer);//根据传进来的p查找
//		Query query=parser.parse(keyword);TermQuery query = new TermQuery(new Term("contents",keyword));//开始查询/*** 第一个参数是通过传过来的参数来查找得到的query;* 第二个参数是要出查询的行数* */TopDocs hits=is.search(query, 10);boolean flag = false;if(hits.totalHits>0) {flag = true;}reader.close();return flag;}
}


3、main函数
import java.io.StringReader;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;public class Main {public static void main(String[] args) {String keyWord = "这是一整个关键词德玛西亚";IKAnalyzer analyzer = new IKAnalyzer(true);try {printAnalysisResult(analyzer, keyWord);} catch (Exception e) {e.printStackTrace();}}/*** 打印出给定分词器的分词结果* * @param analyzer*            分词器* @param keyWord*            关键词* @throws Exception*/private static void printAnalysisResult(Analyzer analyzer, String keyWord)throws Exception {System.out.println("["+keyWord+"]分词效果如下");TokenStream tokenStream = analyzer.tokenStream("content",new StringReader(keyWord));tokenStream.addAttribute(CharTermAttribute.class);SearchKeyword sk = new SearchKeyword();while (tokenStream.incrementToken()) {CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);if(sk.search(charTermAttribute.toString())==true) {System.out.println(charTermAttribute.toString());}}}
}


4、用户自定义关键词



5、运行结果


可以看到“这是一整个关键词”被精确索引出来了,

而“德玛西亚”关键词由于在字典中存储的是“*德玛西亚*”,不满足精确搜索所以并没有被切分出来


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

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

相关文章

英语提升利器之沙拉查词,Anki

学好英语对程序员的重要性不言而喻。而对于已经工作的程序员来说,专门花时间去背英语单词显然性价比不高。在日常工作的场景中,大多数程序员只要能够熟练阅读英文官方文档和技术文章就足够了。在这篇文章中,我将为大家介绍两个提升英语阅读的利器—沙拉查词,Anki。 学习场…

14行代码教你制作自己的有道词典单词本(python)

本来一直在用金山词霸&#xff0c;但是发现自己制作出来的txt格式单词本导入金山词霸后汉语意思会自动给我更改&#xff0c;这让我很不爽(因为高频单词考点意思就那一两个&#xff0c;我不需要把所有单词意思都知道)&#xff0c;尝试各种方法&#xff0c;but…it didn’t work&…

推荐一款十分好用的本地查词软件——MDict

对于外语学习者来说词典是必不可少的&#xff0c;或许你用的是网页版的词典&#xff0c;但是在接触更好的词典之前你永远也想不到查词会如此便捷&#xff0c;单词会如此好查、好记。最近发现了一款免费的本地词典——MDict&#xff0c;使用后我觉得非常好用&#xff0c;适合各类…

欧路词典高阶使用指南-扩充词典/ 如何在Mac原生字典中加入牛津高阶第八版(三指取词)

欧路词典高阶指南 一、欧路词典1.1 mac端1.2 ios&#xff08;iphone和ipad端&#xff09; 二、具体方法和资料链接汇总安装详细教程完整&#xff08;20多本&#xff09;字典文件资源 三、毕坑指南3.1 ios(iphone和ipad&#xff09;&#xff08;如果是用wifi上传最好不要分批上传…

英译汉在线翻译器如何实现英文语音翻译中文

英译汉在线翻译器如何实现英文语音翻译中文&#xff1f;对于出国游玩的朋友来说&#xff0c;首先要解决的就是语言沟通问题&#xff0c;否则即使去了国外&#xff0c;面对语言障碍&#xff0c;恐怕也没有游玩的心情。今天小编将要为大家分享一个英文翻译中文的好方法&#xff0…

使用baidu的api完成汉译英功能

1使用baidu的api完成汉译英功能 1.1 初步完成 import urllib.request #baidu翻译的地址 urlhttp://fanyi.baidu.com/v2transapi param{ "from":"zh", "to":"en", "query":"中国", "transtype":"t…

汉译英在线翻译怎样实现

汉译英怎样实现呢&#xff1f;喜欢参加英文演讲比赛的小伙伴&#xff0c;应该会经常碰到这样的问题吧。因为很多时候演说稿都是先用中文写好&#xff0c;然后再翻译成英文的&#xff0c;那么我们遇到这种汉译英的问题我们应该怎样去实现呢&#xff1f;下面我们就一起来看一下吧…

【已解决】Something went wrong. If this issue persists please contact us through our help center at help.

openai在使用chatgpt对话时频繁出现&#xff1a; Something went wrong. If this issue persists please contact us through our help center at help.openai.com. 解决方法&#xff1a; 安装KeepChatGPT插件 https://github.com/xcanwin/KeepChatGPT 操作步骤&#xff1a; …

学会这几招,能找到90%以上的资源

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 如何才能高效快速地在网络上找到自己想要的资源呢&#xff1f; 这里国民哥给大家分享一些经验&#xff0c;希望能给大家带来启发。 网盘资源 现在要学习资料也多…

poe(一个集成了多个ai聊天机器人的平台)web排版修改,方便查看

chatgpt不好用&#xff0c;封ip 替代品&#xff1a;https://poe.com/ 油猴脚本 // UserScript // name Poe.com Layout Adjuster // namespace http://tampermonkey.net/ // version 0.1 // description Adjust the layout on Poe.com // author gpt …

怎样音频转文字?用这些音频转文字免费版就可以啦

当我们需要记录会议内容但是被要求内容要完整的时候&#xff0c;可能会选择先录音&#xff0c;等会议结束再进行转换&#xff0c;但是自己一字一句地转的话&#xff0c;一个小时的会议时长&#xff0c;我们转文字可能得耗费三四个小时&#xff0c;工作效率实在是太低了。那么我…

视频语音转文字怎么操作更快速?这个方法大家都在用

网课想必大家已经接触过一段时间了吧&#xff0c;打开电脑&#xff0c;隔着屏幕听着老师讲课&#xff0c;有时候听着听着就神游了&#xff0c;错过了需要做笔记的地方。打开视频回放&#xff0c;发现老师讲的听不清楚&#xff0c;面对这样的情况&#xff0c;相信大部分人都作罢…

超简单!一部手机就能提取视频中的语音转换成文字

当我们工作中去整理一些视频资料时&#xff0c;有时候需要对视频中所讲的内容进行整理&#xff0c;这时候很多办公小白会采用传统的方法&#xff0c;就是需要一遍又一遍地看&#xff0c;并记录其中的内容。实际上我们可以提取视频中的语言&#xff0c;将相应的语音内容转换成文…

怎么语音转文字?快来看看这些方法

为了能够方便会议记录的制作&#xff0c;我们通常都会将会议记录的内容录制下来&#xff0c;后期再根据录音的内容进行整理。但是很多小伙伴在后期整理的时候&#xff0c;都会感觉比较痛苦&#xff0c;这是因为需要一次次不断的重复听音频的内容才能完成整理的工作。其实我们只…

视频转文字怎么转,3个办法教你将视频里的语音转文字

我在刷短视频时&#xff0c;总有那么几个心灵鸡汤的视频&#xff0c;让我热血沸腾&#xff0c;当场就想要把视频里那段让我热血沸腾的话写下来&#xff0c;贴在床头&#xff0c;以此激励自己。在场的小伙伴有没有跟我做同样的事情呢&#xff1f;有这样干的小伙伴们知道视频里的…

视频怎么转文字?快把这些方法收好

如今短视频让知识传播变得越来越简单&#xff0c;我们可以很轻松的就通过短视频了解到大量的知识要点。但是当我们想要回温知识点的时候&#xff0c;需要重新观看视频&#xff0c;这就有些不太便利。其实我们可以通过将视频转成文字&#xff0c;这样子就容易归纳知识点了。那你…

语音/视频转文字的工具选择它-不仅仅是好用还免费

语音/视频转文字是现在比较常用的一个功能&#xff0c;用途也还是比较广泛的&#xff0c;我想很多人应该都有过这样的需求&#xff0c;把语音或者视频的信息写成文本&#xff0c;这不仅仅是工作中&#xff0c;生活以及很多方面都可能涉及到这点&#xff0c;语音/视频转文字可以…

分享这几个在线语音转文字的方法,快快收藏好

我们日常工作中&#xff0c;语音转文字的需求还是很多的&#xff0c;比如开会的时候&#xff0c;将领导的发言录音下来&#xff0c;会后进行总结。那我们录音下来之后&#xff0c;应该如何语音转文字呢&#xff1f;下面我就来分享几个语音转文字的方法&#xff0c;一起来看看吧…

什么软件可以支持图片转语音?

大家对图片转语音的操作不陌生吧&#xff0c;很多时候&#xff0c;我们为了方便整理记录&#xff0c;会将带有文字信息的图片保存下来&#xff0c;后期再通过一些软件来将文字提取出来转成语音。那你们知道图片转语音软件哪个好吗&#xff1f;下面我就来介绍一下几个宝藏转换软…

视频语音怎么转换成文字?分享2个视频语音转文字的方法

日常工作学习中&#xff0c;我们需要把视频中的台词提取出来&#xff0c;或者把音频中的语音内容提取出来&#xff0c;其本质上就是语音转文字&#xff0c;那语音该怎么转成文字呢&#xff1f;下面给大家分享2个视频语音转文字的方法&#xff0c;可以简单快速将语音转成文字。 …