[计算机]基于Lucene的中文字典分词模块

合集下载

Lucene开发实例:Lucene中文分词(转载)

Lucene开发实例:Lucene中文分词(转载)

Lucene开发实例:Lucene中⽂分词(转载)2、从Oracle数据库中取数据创建索引(使⽤IK分词)1package lucene.util;23import org.apache.lucene.index.IndexWriter;4import org.apache.lucene.index.IndexWriterConfig;5import org.apache.lucene.index.CorruptIndexException;6import org.apache.lucene.store.FSDirectory;7import org.apache.lucene.store.Directory;8import org.apache.lucene.analysis.Analyzer;9import org.apache.lucene.analysis.standard.StandardAnalyzer;10import org.apache.lucene.util.Version;11import org.apache.lucene.document.Document;12import org.apache.lucene.document.Field;13import org.wltea.analyzer.lucene.IKAnalyzer;1415import java.sql.Connection;16import java.io.File;17import java.io.IOException;18import java.util.ArrayList;19import java.util.Date;2021import modules.gk.Gk_info;22import modules.gk.Gk_infoSub;23import web.sys.Globals;24import web.db.DBConnector;25import web.db.ObjectCtl;26import web.util.StringUtil;27//28public class LuceneIndex {29 IndexWriter writer = null;30 FSDirectory dir = null;31boolean create = true;3233public void init() {34long a1 = System.currentTimeMillis();35 System.out.println("[Lucene 开始执⾏:" + new Date() + "]");36 Connection con = DBConnector.getconecttion(); //取得⼀个数据库连接37try {38final File docDir = new File(Globals.SYS_COM_CONFIG.get("sys.index.path").toString());//E:\lucene39if (!docDir.exists()) {40 docDir.mkdirs();41 }42 String cr = Globals.SYS_COM_CONFIG.get("sys.index.create").toString();//true or false43if ("false".equals(cr.toLowerCase())) {44 create = false;45 }46 Directory dir = FSDirectory.open(docDir);47// Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);48 Analyzer analyzer = new IKAnalyzer(true);49 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);50if (create) {51// Create a new index in the directory, removing any52// previously indexed documents:53 iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);54 } else {55// Add new documents to an existing index:56 iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);57 }58 IndexWriter writer = new IndexWriter(dir, iwc);59 String sql = "SELECT indexno,title,describes,pdate,keywords FROM TABLEA WHERE STATE=1 AND SSTAG<>1 ";60int rowCount = ObjectCtl.getRowCount(con, sql);61int pageSize = StringUtil.StringToInt(Globals.SYS_COM_CONFIG.get("sys.index.size").toString()); //每页记录数62int pages = (rowCount - 1) / pageSize + 1; //计算总页数63 ArrayList list = null;64 Gk_infoSub gk = null;65for (int i = 1; i < pages+1; i++) {66long a = System.currentTimeMillis();67 list = ObjectCtl.listPage(con, sql, i, pageSize, new Gk_infoSub());68for (int j = 0; j < list.size(); j++) {69 gk = (Gk_infoSub) list.get(j);70 Document doc = new Document();71 doc.add(new Field("indexno", StringUtil.null2String(gk.getIndexno()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//主键不分词72 doc.add(new Field("title", StringUtil.null2String(gk.getTitle()), Field.Store.YES, Field.Index.ANALYZED));73 doc.add(new Field("describes", StringUtil.null2String(gk.getDescribes()), Field.Store.YES, Field.Index.ANALYZED));74 doc.add(new Field("pdate", StringUtil.null2String(gk.getPdate()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//⽇期不分词75 doc.add(new Field("keywords", StringUtil.null2String(gk.getKeywords()), Field.Store.YES, Field.Index.ANALYZED));76 writer.addDocument(doc);77 ObjectCtl.executeUpdateBySql(con,"UPDATE TABLEA SET SSTAG=1 WHERE indexno='"+gk.getIndexno()+"'");//更新已索引状态78 }80long b = System.currentTimeMillis();81long c = b - a;82 System.out.println("[Lucene " + rowCount + "条," + pages + "页,第" + i + "页花费时间:" + c + "毫秒]");83 }84 mit();8586 } catch (Exception e) {87 e.printStackTrace();88 } finally {89 DBConnector.freecon(con); //释放数据库连接90try {91if (writer != null) {92 writer.close();93 }94 } catch (CorruptIndexException e) {95 e.printStackTrace();96 } catch (IOException e) {97 e.printStackTrace();98 } finally {99try {100if (dir != null && IndexWriter.isLocked(dir)) {101 IndexWriter.unlock(dir);//注意解锁102 }103 } catch (IOException e) {104 e.printStackTrace();105 }106 }107 }108long b1 = System.currentTimeMillis();109long c1 = b1 - a1;110 System.out.println("[Lucene 执⾏完毕,花费时间:" + c1 + "毫秒,完成时间:" + new Date() + "]");111 }112 }3、单字段查询以及多字段分页查询⾼亮显⽰1package lucene.util;23import org.apache.lucene.store.FSDirectory;4import org.apache.lucene.store.Directory;5import org.apache.lucene.search.*;6import org.apache.lucene.search.highlight.SimpleHTMLFormatter;7import org.apache.lucene.search.highlight.Highlighter;8import org.apache.lucene.search.highlight.SimpleFragmenter;9import org.apache.lucene.search.highlight.QueryScorer;10import org.apache.lucene.queryParser.QueryParser;11import org.apache.lucene.queryParser.MultiFieldQueryParser;12import org.apache.lucene.analysis.TokenStream;13import org.apache.lucene.analysis.Analyzer;14import org.apache.lucene.analysis.KeywordAnalyzer;15import org.apache.lucene.document.Document;16import org.apache.lucene.index.IndexReader;17import org.apache.lucene.index.Term;18import org.apache.lucene.util.Version;19import modules.gk.Gk_infoSub;2021import java.util.ArrayList;22import java.io.File;23import java.io.StringReader;24import ng.reflect.Constructor;2526import web.util.StringUtil;27import web.sys.Globals;28import org.wltea.analyzer.lucene.IKAnalyzer;29//30public class LuceneQuery {31private static String indexPath;// 索引⽣成的⽬录32private int rowCount;// 记录数33private int pages;// 总页数34private int currentPage;// 当前页数35private int pageSize; //每页记录数3637public LuceneQuery() {38this.indexPath = Globals.SYS_COM_CONFIG.get("sys.index.path").toString();39 }4041public int getRowCount() {42return rowCount;43 }4445public int getPages() {46return pages;47 }49public int getPageSize() {50return pageSize;51 }5253public int getCurrentPage() {54return currentPage;55 }5657/**58 * 函数功能:根据字段查询索引59*/60public ArrayList queryIndexTitle(String keyWord, int curpage, int pageSize) {61 ArrayList list = new ArrayList();62try {63if (curpage <= 0) {64 curpage = 1;65 }66if (pageSize <= 0) {67 pageSize = 20;68 }69this.pageSize = pageSize; //每页记录数70this.currentPage = curpage; //当前页71int start = (curpage - 1) * pageSize;72 Directory dir = FSDirectory.open(new File(indexPath));73 IndexReader reader = IndexReader.open(dir);74 IndexSearcher searcher = new IndexSearcher(reader);75 Analyzer analyzer = new IKAnalyzer(true);76 QueryParser queryParser = new QueryParser(Version.LUCENE_36, "title", analyzer);77 queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);78 Query query = queryParser.parse(keyWord);79int hm = start + pageSize;80 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);81 searcher.search(query, res);8283 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");84 Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));85this.rowCount = res.getTotalHits();86this.pages = (rowCount - 1) / pageSize + 1; //计算总页数87 TopDocs tds = res.topDocs(start, pageSize);88 ScoreDoc[] sd = tds.scoreDocs;89for (int i = 0; i < sd.length; i++) {90 Document hitDoc = reader.document(sd[i].doc);91 list.add(createObj(hitDoc, analyzer, highlighter));92 }9394 } catch (Exception e) {95 e.printStackTrace();96 }9798return list;99100 }101/**102 * 函数功能:根据字段查询索引103*/104public ArrayList queryIndexFields(String allkeyword, String onekeyword, String nokeyword, int curpage, int pageSize) {105 ArrayList list = new ArrayList();106try {107if (curpage <= 0) {108 curpage = 1;109 }110if (pageSize <= 0) {111 pageSize = 20;112 }113this.pageSize = pageSize; //每页记录数114this.currentPage = curpage; //当前页115int start = (curpage - 1) * pageSize;116 Directory dir = FSDirectory.open(new File(indexPath));117 IndexReader reader = IndexReader.open(dir);118 IndexSearcher searcher = new IndexSearcher(reader);119 BooleanQuery bQuery = new BooleanQuery(); //组合查询120if (!"".equals(allkeyword)) {//包含全部关键词121 KeywordAnalyzer analyzer = new KeywordAnalyzer();122 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//AND 123 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, allkeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 124 bQuery.add(query, BooleanClause.Occur.MUST); //AND125 }126if (!"".equals(onekeyword)) { //包含任意关键词127 Analyzer analyzer = new IKAnalyzer(true);128 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//OR 129 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, onekeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 130 bQuery.add(query, BooleanClause.Occur.MUST); //AND131 }132if (!"".equals(nokeyword)) { //排除关键词133 Analyzer analyzer = new IKAnalyzer(true);134 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//NOT 135 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, nokeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 136 bQuery.add(query, BooleanClause.Occur.MUST_NOT); //AND137138 }139int hm = start + pageSize;140 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);141 searcher.search(bQuery, res);142 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");143 Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(bQuery));144this.rowCount = res.getTotalHits();145this.pages = (rowCount - 1) / pageSize + 1; //计算总页数146 System.out.println("rowCount:" + rowCount);147 TopDocs tds = res.topDocs(start, pageSize);148 ScoreDoc[] sd = tds.scoreDocs;149 Analyzer analyzer = new IKAnalyzer();150for (int i = 0; i < sd.length; i++) {151 Document hitDoc = reader.document(sd[i].doc);152 list.add(createObj(hitDoc, analyzer, highlighter));153 }154155 } catch (Exception e) {156 e.printStackTrace();157 }158159return list;160161 }162163/**164 * 创建返回对象(⾼亮)165*/166167private synchronized static Object createObj(Document doc, Analyzer analyzer, Highlighter highlighter) {168169 Gk_infoSub gk = new Gk_infoSub();170try {171172if (doc != null) {173 gk.setIndexno(StringUtil.null2String(doc.get("indexno")));174 gk.setPdate(StringUtil.null2String(doc.get("pdate")));175 String title = StringUtil.null2String(doc.get("title"));176 gk.setTitle(title);177if (!"".equals(title)) {178 highlighter.setTextFragmenter(new SimpleFragmenter(title.length()));179 TokenStream tk = analyzer.tokenStream("title", new StringReader(title));180 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, title));181if (!"".equals(htext)) {182 gk.setTitle(htext);183 }184 }185 String keywords = StringUtil.null2String(doc.get("keywords"));186 gk.setKeywords(keywords);187if (!"".equals(keywords)) {188 highlighter.setTextFragmenter(new SimpleFragmenter(keywords.length()));189 TokenStream tk = analyzer.tokenStream("keywords", new StringReader(keywords));190 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, keywords));191if (!"".equals(htext)) {192 gk.setKeywords(htext);193 }194 }195 String describes = StringUtil.null2String(doc.get("describes"));196 gk.setDescribes(describes);197if (!"".equals(describes)) {198 highlighter.setTextFragmenter(new SimpleFragmenter(describes.length()));199 TokenStream tk = analyzer.tokenStream("keywords", new StringReader(describes));200 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, describes));201if (!"".equals(htext)) {202 gk.setDescribes(htext);203 }204 }205206 }207return gk;208 }209catch (Exception e) {210211 e.printStackTrace();212return null;213 }214finally {215 gk = null;216 }217218 }219220private synchronized static Object createObj(Document doc) {221222 Gk_infoSub gk = new Gk_infoSub();223try {224225if (doc != null) {226 gk.setIndexno(StringUtil.null2String(doc.get("indexno")));227 gk.setPdate(StringUtil.null2String(doc.get("pdate")));228 gk.setTitle(StringUtil.null2String(doc.get("title")));229 gk.setKeywords(StringUtil.null2String(doc.get("keywords")));230 gk.setDescribes(StringUtil.null2String(doc.get("describes")));231 }232return gk;233 }234catch (Exception e) {235236 e.printStackTrace();237return null;238 }239finally {240 gk = null;241 }242243 }244 }单字段查询:1long a = System.currentTimeMillis();2try {3int curpage = StringUtil.StringToInt(StringUtil.null2String(form.get("curpage")));4int pagesize = StringUtil.StringToInt(StringUtil.null2String(form.get("pagesize")));5 String title = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("title")));6 LuceneQuery lu = new LuceneQuery();7 form.addResult("list", lu.queryIndexTitle(title, curpage, pagesize));8 form.addResult("curPage", lu.getCurrentPage());9 form.addResult("pageSize", lu.getPageSize());10 form.addResult("rowCount", lu.getRowCount());11 form.addResult("pageCount", lu.getPages());12 } catch (Exception e) {13 e.printStackTrace();14 }15long b = System.currentTimeMillis();16long c = b - a;17 System.out.println("[搜索信息花费时间:" + c + "毫秒]");多字段查询:1long a = System.currentTimeMillis();2try {3int curpage = StringUtil.StringToInt(StringUtil.null2String(form.get("curpage")));4int pagesize = StringUtil.StringToInt(StringUtil.null2String(form.get("pagesize")));5 String allkeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("allkeyword")));6 String onekeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("onekeyword")));7 String nokeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("nokeyword")));8 LuceneQuery lu = new LuceneQuery();9 form.addResult("list", lu.queryIndexFields(allkeyword,onekeyword,nokeyword, curpage, pagesize));10 form.addResult("curPage", lu.getCurrentPage());11 form.addResult("pageSize", lu.getPageSize());12 form.addResult("rowCount", lu.getRowCount());13 form.addResult("pageCount", lu.getPages());14 } catch (Exception e) {15 e.printStackTrace();16 }17long b = System.currentTimeMillis();18long c = b - a;19 System.out.println("[⾼级检索花费时间:" + c + "毫秒]");4、Lucene通配符查询1 BooleanQuery bQuery = new BooleanQuery(); //组合查询2if (!"".equals(title)) {3 WildcardQuery w1 = new WildcardQuery(new Term("title", title+ "*"));4 bQuery.add(w1, BooleanClause.Occur.MUST); //AND5 }6int hm = start + pageSize;7 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);8 searcher.search(bQuery, res);5、Lucene嵌套查询实现SQL:(unitid like 'unitid%' and idml like 'id2%') or (tounitid like 'unitid%' and tomlid like 'id2%' and tostate=1)1 BooleanQuery bQuery = new BooleanQuery();2 BooleanQuery b1 = new BooleanQuery();3 WildcardQuery w1 = new WildcardQuery(new Term("unitid", unitid + "*"));4 WildcardQuery w2 = new WildcardQuery(new Term("idml", id2 + "*"));5 b1.add(w1, BooleanClause.Occur.MUST);//AND6 b1.add(w2, BooleanClause.Occur.MUST);//AND7 bQuery.add(b1, BooleanClause.Occur.SHOULD);//OR8 BooleanQuery b2 = new BooleanQuery();9 WildcardQuery w3 = new WildcardQuery(new Term("tounitid", unitid + "*"));10 WildcardQuery w4 = new WildcardQuery(new Term("tomlid", id2 + "*"));11 WildcardQuery w5 = new WildcardQuery(new Term("tostate", "1"));12 b2.add(w3, BooleanClause.Occur.MUST);//AND13 b2.add(w4, BooleanClause.Occur.MUST);//AND14 b2.add(w5, BooleanClause.Occur.MUST);//AND15 bQuery.add(b2, BooleanClause.Occur.SHOULD);//OR6、Lucene先根据时间排序后分页1int hm = start + pageSize;2 Sort sort = new Sort(new SortField("pdate", SortField.STRING, true));3 TopScoreDocCollector res = TopScoreDocCollector.create(pageSize, false);4 searcher.search(bQuery, res);5this.rowCount = res.getTotalHits();6this.pages = (rowCount - 1) / pageSize + 1; //计算总页数7 TopDocs tds =searcher.search(bQuery,rowCount,sort);// res.topDocs(start, pageSize);8 ScoreDoc[] sd = tds.scoreDocs;9 System.out.println("rowCount:" + rowCount);10int i=0;11for (ScoreDoc scoreDoc : sd) {12 i++;13if(i<start){14continue;15 }16if(i>hm){17break;18 }19 Document doc = searcher.doc(scoreDoc.doc);20 list.add(createObj(doc));21 }这个效率不⾼,正常的做法是创建索引的时候进⾏排序,之后使⽤分页⽅法,不要这样进⾏2次查询。

基于Lucene的中文分词器的设计与实现

基于Lucene的中文分词器的设计与实现

基于Lucene的中文分词器的设计与实现彭焕峰【摘要】According to the low efficiency of the Chinese words segmentation machines of Lucene, this paper designs a new word segmentation machine based on all-Hash segmentation mechanism according to binary-seek-by-word by analyzing many old dictionary mechanisms. The new mechanism uses the word's Hash value to reduce the number of string findings. The maintenance of dictionary file is convenient, and the developers can customize the dictionary based on different application to improve search efficiency.%针对Lucene自带中文分词器分词效果差的缺点,在分析现有分词词典机制的基础上,设计了基于全哈希整词二分算法的分词器,并集成到Lucene中,算法通过对整词进行哈希,减少词条匹配次数,提高分词效率。

该分词器词典文件维护方便,可以根据不同应用的要求进行定制,从而提高了检索效率。

【期刊名称】《微型机与应用》【年(卷),期】2011(030)018【总页数】3页(P62-64)【关键词】Lucene;哈希;整词二分;最大匹配【作者】彭焕峰【作者单位】南京工程学院计算机工程学院,江苏南京211167【正文语种】中文【中图分类】TP391.1信息技术的发展,形成了海量的电子信息数据,人们对信息检索的要求越来越高,搜索引擎技术也得到了快速发展,并逐渐地被应用到越来越多的领域。

基于Lucene的中文文本分词

基于Lucene的中文文本分词
转移 网络法 、 知识分 词语 义分 析法 、 邻接 约束法 、 合 匹配 法 、 综 后缀 分词 法 、 征词 库法 、 束矩 阵法 和语 特 约
法分析法 等.
1 1 3 人 工智 能法 . 称理 解分 词法 . 工智 能是 对信 息进 行 智能 化处 理 的 . 种模 式 , .. 又 人 一 主要 有两 种处
关键词: 中文文本分词 ; 文本检索;uee Lc n
中图 分类号 : P 1.1 文献 标识 码 : T 311 A
0 引 言
伴 随着 文本挖掘 技 术 的发展 , 文本 分词 技术 作为 文本 挖掘技 术 的一个 重要 研 究分支 , 也得 到了迅速 的发 展. 本 分词 技 术为 大 多数 文 本 挖掘 技术 ( 文 如文 本分 类 技 术 , 本 聚类 技 术 等 ) 供文 本 预处理 工 文 提 作, 分词 效果 的好坏 会直 接影 响到 后续 的处理 过 程 , 因此文本 分词 技术 是文 本 挖掘过 程 中的一个关 键环 节. 目前 , 文本 挖掘领 域 的一 项重 要 成果 —— Ap c eJk ra的开源 工 程 L c n ( ah a at u e e 一种 基于 J AVA语 言 的文本 检索工 具包 ) 已经 得到 了广 泛 的应用 和发 展. 国际上很 多 的大公 司都 以 L cn u e e作为开 发平 台 , 例 如 目前搜 索弓I 擎业 的 巨头 G o l 司 也在其 系统 中引入 了 L cn 平 台 , 在其 基础 上进行 深入 的开 o ge公 ue e 并
维普资讯
内蒙古 工 业大 学学 报
j oURNAL OF 3期
UNI VERSI TY OF TECHNOLOGY
文 章 编 号 :0 1 5 6 (0 7 0。 1 50 1 0 — 1 72 0 )30 8 —4

Lucene 3.0 的几种分词系统

Lucene 3.0 的几种分词系统
1、 StopAnalyzer
StopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。
2、 StandardAnalyzer
StandardAnalyzer根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。
3、 SimpleAnalyzer
SimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。
在全文检索系统开发中,通常用来支持西文符号的处理,不支持中文。由于不完成单词过滤功能,所以不需要过滤词库支持。词汇分割策略上简单,使用非英文字符作为分割符,不需要分词词库的支持。
13、 Paoding Analysis
Paoding Analysis中文分词具有极 高效率 和 高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G内存个人机器上,1秒可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。
7、 ChineseAnalyzer
ChineseAnalyzer功能与StandardAnalyzer分析器在处理中文是基本一致,都是切分成单个的双字节中文字符。在Lucene3.0版本中已经弃用。
8、 PerFieldAnalyzerWrapper
PerFieldAnalyzerWrapper功能主要用在针对不同的Field采用不同的Analyzer的场合。比如对于文件名,需要使用KeywordAnalyzer,而对于文件内容只使用StandardAnalyzer就可以了。通过addAnalyzer()可以添加分类器。

基于Lucene的中文分词技术研究

基于Lucene的中文分词技术研究

向或逆 向最大匹配 的方法来分 词。例如 ,假设词 典包括 如下
的 词语 :
今天 / 很好” 。

天气


很好
输入 “ 今天天气很好 ” ,最后 的分词结 果为 “ 今天 , 天气
正 向最大匹配 和逆向最大 匹配 的实 现大 同小 异 ,最 大的 区别 就是正 向最 大匹配是 正向扫描字符 串 ,逆 向最大 匹配是
除 了这 两种 ,另外 一种最 少切分 的方法是使 每一句 中切 出的词数最小 。 22 基于统计 的分词方法 .
所周 知 ,英 语等西方 语言是使 用空格 和标 点来分 隔单词 。但 是在 汉语等 亚洲语种 中 ,一 般使用 表意文 字 ,而 不是使 用 由
字母 组成 的单词 。所 以相对 于西方语 言 ,L c n 中文 分词 ue e对
a c a y c ur c ・
Ke r s h n s e me t t n; u e e; xma t h n ma i m rb b l y y wo d :C i e e s g n ai o L c n ma i lma c i g; x mu p a i t o i
1 引 言
的效果并不是很好 。L cn 处理 中文分词常用方法有 3种 : ue e ()单字方式 : 【 【 【 【 [ 【 。 1 咬】 死】 猎】 人】 的】 狗]
() 二元覆 盖方式 : 【 2 咬死】 [ 死猎】 [ 人1 【 的1 猎 人 【 的狗】 。
w r e e t t n meh d a d ma i m r b b l y p rii l t o i h i t ov h r b e o n e u t o o d s g n a i t o n x mu p o a i t a t p e me d wh c s o s le t e p o l m f ma y r s l f m o i c h s

lucene中文分词组件和分析器KTDictSeg

lucene中文分词组件和分析器KTDictSeg
急剧变慢。
V1.3.01
1、 修改字典格式,提高字典加载速度
2、 增加对英文专业名词的支持 如C++,C#等只要加入字典就可以被分出来
3、 增加词频判断功能,在无法取舍时根据词频取舍
4、 增加优先优先词频选项,通过这个选项动态决定分词粒度 需打开 FreqFirst
5、 增加中文人名前后缀统计和根据该统计定位人名的功能
7、 1.4版本新加了 KTDictSegTokenizer默认构造,没有全面考虑到锁的问题。导致多线程查询是会出错,已经更改这出错误。
使用KTDictSeg的lucene分词分析器
1. using System;
2. using System.Collections.Generic;
13、提供一个新闻搜索的简单例子,采用+KTDictSegAnalyzer+KTDictSeg,项目名为Demo.KTDictSegAnalyzer
14、将所有ArrayList 改为List<>
V1.4.01
1、 增加对的支持
2、 增加多元分词
3、 配置文件中增加对相对路径的支持(winform 和 )
36. {
37. m_SimpleDictSeg = null;
38. throw e1;
39. }
40. }
14. {
15. dictPath = _dictPath;
16. }
17ห้องสมุดไป่ตู้
18. public override TokenStream TokenStream(string fieldName, TextReader reader)

java实现中文分词

java实现中文分词

java实现中⽂分词IK Analyzer是基于lucene实现的分词开源框架下载路径:/so/search/s.do?q=IKAnalyzer2012.jar&t=doc&o=&s=all&l=null 需要在项⽬中引⼊:IKAnalyzer2012.jarlucene-core-3.6.0.jar实现的两种⽅法:使⽤(lucene)实现:1import java.io.IOException;2import java.io.StringReader;3import org.wltea.analyzer.core.IKSegmenter;4import org.wltea.analyzer.core.Lexeme;56public class Fenci1 {7public static void main(String[] args) throws IOException{8 String text="你好,我的世界!";9 StringReader sr=new StringReader(text);10 IKSegmenter ik=new IKSegmenter(sr, true);11 Lexeme lex=null;12while((lex=ik.next())!=null){13 System.out.print(lex.getLexemeText()+",");14 }15 }1617 }使⽤(IK Analyzer)实现:1import java.io.IOException;2import java.io.StringReader;3import org.apache.lucene.analysis.Analyzer;4import org.apache.lucene.analysis.TokenStream;5import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;6import org.wltea.analyzer.lucene.IKAnalyzer;78public class Fenci {9public static void main(String[] args) throws IOException {11 String text="你好,我的世界!";12//创建分词对象13 Analyzer anal=new IKAnalyzer(true);14 StringReader reader=new StringReader(text);15//分词16 TokenStream ts=anal.tokenStream("", reader);17 CharTermAttribute term=ts.getAttribute(CharTermAttribute.class);18//遍历分词数据19while(ts.incrementToken()){20 System.out.print(term.toString()+",");21 }22 reader.close();23 System.out.println();24 }2526 }运⾏后结果:你好,我,的,世界,。

基于Lucene的中文文本分词

基于Lucene的中文文本分词

基于Lucene的中文文本分词
王继明;杨国林
【期刊名称】《内蒙古工业大学学报(自然科学版)》
【年(卷),期】2007(026)003
【摘要】中文文本分词技术是文本挖掘领域的一个重要分支,在中国仍然处于发展阶段.Apache Jakarta 的开源工程Lucene是一个十分优秀的基于Java语言的文本检索工具包,在国外已经得到广泛的应用.但是Lucene对中文分词功能的支持不太理想,给Lucene加入好的中文分词功能对Lucene在国内的发展和应用将会起到很大的推动作用.
【总页数】4页(P185-188)
【作者】王继明;杨国林
【作者单位】内蒙古工业大学信息工程学院,呼和浩特,010051;内蒙古工业大学信息工程学院,呼和浩特,010051
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.一种基于互信息的串扫描中文文本分词方法 [J], 赵秦怡;王丽珍
2.基于词条组合的中文文本分词方法 [J], 黄魏;高兵;刘异;杨克巍
3.基于Lucene的石墨烯中文文献搜索引擎设计与实现 [J], 肖显东;王勤生;杨永强;章国宝;
4.基于Lucene的中文是非问答系统的设计与实现 [J], 罗东霞;卿粼波;吴晓红
5.基于Lucene的中文是非问答系统的设计与实现 [J], 罗东霞;卿粼波;吴晓红因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2008年6月21日
总结 不过,此中文分词模块还存在一些固有的缺陷,如词 典结构的建立并未充分考虑到空间浪费的问题,对于碎片 的整理之后还应该添加权值计算和确定的功能,系统还未 实现向词典添加新词的功能,这些问题都有待进一步深入 研究后,再提出可行的方案进行完善。
Company name
2008年6月21日
Company name
2008 年6 月 21 日 2008 年 6月 21 日
中文分词面临的问题
计算机难以正确理 解并分析中文文本
Company name
2008 年6 月 21 日 2008 年 6月 21 日
中文分词的研究内容
语言是一个开放集,它的词条始终是处于不断的增长中, 所以很难有一个完善的词典来描述它,可能这个词在今天 不是词,在将来就被认定为一个词了。这就告诉我们,词 典的完备性始终是我们研究中文分词必须考虑的一个问题。 汉语自然语言处理的应用系统处理对象越来越多的是大规 模语料,因此分词的速度和分词算法的易实现性变得相当 关键。 词典规模、词典查找速度、切分预处理方式、切分排 歧方式、未登录词处理、词性标注等方面在前人的基 础上做进一步的改善
Company name
2008年6月21日
本课题的研究意义
由于Lucene支持的中文文本分词仅限于单字区分 和双字区分两种方式,不能满足大多数中文文本 信息检索技术的需求,所以在一定程度上限制了 它在中国的应用和开发。因此Lucene加入中文分 词的功能,对于Lucene在中国的广泛应用和发展 将会起到很大的推动作用
3)在识别新词的问题上,对分词产生的碎片进行概率上的 统计,以此来判断是否将其认为是未登录词。通过测试验 证,系统可识别大部分的中文人名,提高了系统的实用性。 4)针对中文文本中可能会出现英文词语的特点,系统对英 文文本也进行了相应的处理,保证了分词的全面性,提高 了系统的处理能力。
Company name
Company name
2008年 6月年 21 2008 6日 月21日
基于Lucene的中文字典分词模块的设计与实现
3.对文本进行初步的分词 本分词系统选用机械分词算法中的最大匹配算 法作为中文分词算法,具体实现就是对于字符串s, 从前到后扫描,对扫描的每个字,从词表中寻找 最长匹配 。
Company name
致谢
在我的毕业设计即将完成之际,我 想感谢所有在毕设过程中帮助指导我的 老师和同学们。感谢程老师,在整个设 计过程中都给予了高度的关注和悉心的 指导。感谢各位答辩组的老师,感谢郭 师兄,还有我的同学孙琳,谢谢你们给 了我最无私的帮助,谢谢。
Company name
LOGO
2008年6月21日
Company name
对本文工作的总结 本文在全文搜索引擎JAVA版的开源软件包LUCENE的基 础上,对中文分词技术进行了深入的研究,设计并完成了 中文文本字典分词系统,并将系统封装成LUCENE分析器添 加到LUCENE中使用,扩展了LUCENE的中文处理的功能。 1)对几种常用词典机制进行了分析和比较,针对中文文本 中双字词所占比例较高的特点,实现双层哈希词典机制策 略,在保证分词具有较高的效率的同时,简化了对词典的 维护和更新等操作,使系统维护简单易行。
新词识别
王军虎
计算碎片“虎”相对于“军” (“王军”)的条件概率 计算碎片“军”相对于 “王“的条件概率
碎片“虎”
碎片“军”
计算“王”在文本 中出现的概率 碎片“王”
Company name
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现
5.将系统封装成Lucene分析器,建立索引
Company name
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现 本设计完成的功能:
设计词典结构,读入词库文件,初始化词典结构 对文本预处理,使用最大正向匹配算法初步分词 设计实现双向匹配算法,对结果进行基于规则的选择,实 现系统纠错功能 对分词后的结果产生的碎片进行概率统计,识别文本中的未 登陆词 将分词系统封装成Lucene分析器,并使用索引器建立索引, 实现系统检索功能
Company name
2008 年6 月 21 日 2008 年 6月 21 日
中文文本分词的一般过程
词典初始化
输入分词文本,对文本预处理 对文本进行初步的划分 消歧和未登陆词识别 保存结果
Company name
中文词典 更新词典
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现 1词典建立 词典是汉语自动分词的基础,分词词典机制的 优劣直接影响到中文分词的速度和效率。
2008 年6 月 21 日 2008 年 6月 21 日
中文分词的研究背景及现状 网络资源爆炸性增长,搜索引擎技术发展迅速 全文搜索引擎包Lucene在许多搜索引擎技术项 目中得到了广泛且深入的应用和研究 中文分词技术成为计算机信息检索、自然语言 理解、人工智能、机器翻译和自动文摘等领域 突破的关键多种技术发展的瓶颈
Company name
2008 年6 月 21 日 2008 年 6月 21 日
总结 2)对分词歧义进行了研究。实现了最大正向匹配算法,对 中文文本分词。为了提高分词的准确率,在最大正向匹配算 法的基础做了改进,对文本分别实现了正向和逆向的最大匹 配,然后对两种结果进行基于规则的选择,实验证明,这种 分词算法可显著提高分词准确率。
基于Lucene的中文字典分词模块 的设计与实现
信安041 温珊珊
LOGO
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现
1.中文分词的研究背景及现状
2.中文分词的研究内容和意义 3.分词模块的设计与实现
4.对本文工作的总结
Company name
1 基于整词二分 的分词词典机 制 2 基于TRIE索引 树的分词词典 机制 3 基于逐字二分 的分词词典机 制
Company name
2008 年6 月 21 日 2008 年 6月 21 日
双字哈希词典机制
为了使分词系统在具有较高的分词效率的同 时,维护和更新词典也相对简单,本研究采用了 一种新的词典机制来建立词典——双字哈希词典 机制。。
Company name
2008 年6 月 21 日 2008 年 6月 21 日
双字哈希词典机制
Company name
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现
2.对文本进行预处理
预处理,利用特殊的标记(0xa1)将输入的中文文本 分割成较短的汉字串,汉字串以中文空格分开,简化分 词算法要处理的特殊情况,这些标记包括所有的标点符 号,例如:“,”、“。”等等。由于本研究同时考虑 到了对英文文本和数字的处理,所以,也将英文单词, 数字等作为标记来分割中文文本。Company name
2008 年6 月 21 日 2008 年 6月 21 日
中文分词的研究现状
从70年代我国情报检索界从事到中文信息检索 领域的研究开始,一直有大量学者致力于中文自动 分词研究,至今已获得许多可喜的成果,出现了一 些实用的自动分词系统。这些系统在分词的精确度 和分词速度方面都具有相当的水平,但是仍然需要 进一步的研究。
存 在
Company name
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现
5.新词识别
获得位 置连续的 碎片 组
计算每 两个 相邻碎 片的 条件 概率
与设定 的阈 值比较 大小 判断是 否为 词
Company name
2008 年6 月 21 日 2008 年 6月 21 日
2008 年6 月 21 日 2008 年 6月 21 日
基于Lucene的中文字典分词模块的设计与实现
4 歧义识别——对结果的进一步处理
最大正向匹配算法 最大逆向匹配算法
Company name
2008年 6月 21 日 2008 年 6月 21日
对结果的纠错功能实现过程
中文字典 不 存 在 查找
lucene.analysis(分析器)
Company name
2008年6月21日
系统设计界面和功能展示
Company name
2008年6月21日
系统设计界面和功能展示
Company name
2008年6月21日
系统设计界面和功能展示
Company name
2008 年6 月 21 日 2008 年 6月 21 日
相关文档
最新文档