- 浏览: 168990 次
- 性别:
- 来自: 武汉
文章分类
最新评论
1、附件附上中文解析器的相关包
2、代码
package com.yihaodian.pricehisotry; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; //import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.analysis.tokenattributes.TermAttribute; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.wltea.analyzer.lucene.IKAnalyzer; import org.apache.lucene.demo.IndexFiles; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.yihaodian.pricehisotry.service.ProductService; @SuppressWarnings("deprecation") public class CutWords { private static ApplicationContext context = null; static{ context = new ClassPathXmlApplicationContext( new String[] { "/spring-bean.xml", "/spring-dao.xml" }); } private static Map<String,String> brand = new HashMap<String,String>(); private static Map<String,String> generalName = new HashMap<String,String>(); private static Set<String> name1 = new HashSet<String>(); private static Set<String> name2 = new HashSet<String>(); private static Set<String> name3 = new HashSet<String>(); private static Set<String> name4 = new HashSet<String>(); private static Set<String> name5 = new HashSet<String>(); private static Set<String> name6 = new HashSet<String>(); private static long indexWord = 0; //存储大于6个的 private static Set<String> name7 = new HashSet<String>(); public static void main(String[] args) throws IOException { //读取已有的special word File file = new File("D:\\eee.txt"); try { FileInputStream fileInputStream = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK"); BufferedReader br = new BufferedReader(inputStreamReader); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = br.readLine()) != null) { if(tempString.length() == 1) name1.add(tempString); else if(tempString.length() == 2) name2.add(tempString); else if(tempString.length() == 3) name3.add(tempString); else if(tempString.length() == 4) name4.add(tempString); else if(tempString.length() == 5) name5.add(tempString); else if(tempString.length() == 6) name6.add(tempString); else name7.add(tempString); } br.close(); }catch (Exception e) { } //读取已有的BAND File fileBrand = new File("D:\\band.txt"); try { FileInputStream fileInputStream = new FileInputStream(fileBrand); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK"); BufferedReader br = new BufferedReader(inputStreamReader); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = br.readLine()) != null) { if (!brand.containsKey(tempString)) { brand.put(tempString, tempString); } } br.close(); }catch (Exception e) { e.printStackTrace(); } //读取已有的general word File filegeneral = new File("D:\\geneName.txt"); try { FileInputStream fileInputStream = new FileInputStream(filegeneral); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK"); BufferedReader br = new BufferedReader(inputStreamReader); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = br.readLine()) != null) { //这里没有被执行 if (!generalName.containsKey(tempString)) { generalName.put(tempString,tempString); } } br.close(); }catch (Exception e) { e.printStackTrace(); } System.out.println("得到的品牌的大小:"+brand.size()); System.out.println("得到的名词的大小:"+generalName.size()); ProductService productService = (ProductService)(context.getBean("productService")); List<String> productNames = productService.queryYhdProductsByCategoryName("%巧克力%"); File f = new File("D:\\liufen.txt"); if(!f.exists()) f.createNewFile(); FileWriter fw = new FileWriter(f,true); // for(int k=0;k<carInfo.size();k++){ // fw.write(carInfo.get(k).getCar().get(6)+"\r\n"); // } Analyzer ikAnalyzer = new IKAnalyzer(); System.out.println("======中文=======IKAnalyzer======分词======="); for (String productName : productNames) { showToken(ikAnalyzer, productName); } for (String name : name7) { fw.write(name+"\r\n"); } for (String name : name6) { fw.write(name+"\r\n"); } for (String name : name5) { fw.write(name+"\r\n"); } for (String name : name4) { fw.write(name+"\r\n"); } for (String name : name3) { fw.write(name+"\r\n"); } for (String name : name2) { fw.write(name+"\r\n"); } for (String name : name1) { fw.write(name+"\r\n"); } fw.flush(); fw.close(); // Analyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_30); // System.out.println("=====一元========StandardAnalyzer=====分词========"); // showToken(standardAnalyzer, text); } /** * 分词及打印分词结果的方法 * @param analyzer 分词器名称 * @param text 要分词的字符串 * @throws IOException 抛出的异常 */ public static void showToken(Analyzer analyzer, String text) throws IOException { Reader reader = new StringReader(text); TokenStream stream = (TokenStream)analyzer.tokenStream("", reader); //添加工具类 注意:以下这些与之前lucene2.x版本不同的地方 TermAttribute termAtt = (TermAttribute)stream.addAttribute(TermAttribute.class); OffsetAttribute offAtt = (OffsetAttribute)stream.addAttribute(OffsetAttribute.class); // 循环打印出分词的结果,及分词出现的位置 while(stream.incrementToken()){ indexWord++; // System.out.println(termAtt.term() + "|("+ offAtt.startOffset() + " " + offAtt.endOffset()+")"); Pattern pattern = Pattern.compile("\\d+[ml]{0,1}[l]{0,1}"); Matcher matcher = pattern.matcher(termAtt.term()); if (matcher.find()) { continue; } IndexFiles indexFiles; if (brand.containsKey(termAtt.term())) continue; if (generalName.containsKey(termAtt.term())) continue; // System.out.println(termAtt.term()+"--"+indexWord); int len = offAtt.endOffset() - offAtt.startOffset(); switch (len) { case 1: name1.add(termAtt.term()); break; case 2: name2.add(termAtt.term()); break; case 3: name3.add(termAtt.term()); break; case 4: name4.add(termAtt.term()); break; case 5: name5.add(termAtt.term()); break; case 6: name6.add(termAtt.term()); break; default: name7.add(termAtt.term()); break; } } } }
在本程序中,这段代码对于商品名中包含品牌或者是已经有了的切词去重复。然后将已有的切词和刚切的全部写入到一个文件中
lucene包采用的是3.5最新版本。官网可以下载。
在切词的过程中可能遇到,切到的词不是很令人满意,这个时候需要对词库做出整理。另外还可以对解析器做出优化,加强解析器只能识别词组的功能。丰富解析器的词库
- IKAnalyzer3.2.5Stable.jar (1.1 MB)
- 下载次数: 4
发表评论
-
机器学习----逻辑回归
2016-02-19 12:12 795这节学习的是逻辑回归 ... -
通用广告推荐,团购推荐,商户推荐,商品推荐数据算法框架
2015-09-01 16:51 630本章介绍的是简单的多维权重算法以广告为例, 广告有很多属性 ... -
算法程序-通过log重现计算过程
2015-08-17 14:56 1526核心算法类 public class ShopScorer ... -
机器学习算法模型(一)
2015-08-04 12:45 810之前介绍了通用的经验型权重配置算法,但是仍然无法对200多个 ... -
商品名匹配算法
2012-12-17 10:23 1763商品名组成为 品牌+型号(规格)+形容词(颜色)+商品简称+ ... -
求点到曲线的最短距离 垂直逼近算法
2012-08-20 11:13 5776y = ln(x) + Math.pow(x,0.000333 ... -
牛顿迭代--高斯方程求解
2012-08-20 10:59 3012y = alnx + x + x*x + x *x *x + ... -
价格弹性指数 价格与销量模型
2012-07-30 10:35 3696在当今电子商务越来越热的情况下,价格战与利润是一个关键点,价格 ... -
float 导致的计算精确度问题
2012-05-31 14:04 1129java 中float 计算精确度问题,解决方法是利用Bi ... -
价格与销量的关系 JAVA实现该算法 最小二乘法
2012-04-05 17:47 1475由于方程式不方便编辑,一切都在附件的图片和word文档上 -
对URL非法字符进行转义
2012-03-15 15:45 1255url=“http://www.baidu.com?body= ... -
JAVA 读取CSV文件
2012-03-12 16:40 13651、读取CSV文件只从第二行开始读取,忽略标题的,包文件自己搜 ... -
OPI 导出EXCEL(JAVA 应用程序非WEB导出)
2012-03-12 16:39 16831、直接是工具类调用静态方法 import java.io. ... -
JSP 无模板导出功能实现
2012-02-16 10:26 897HttpServletResponse response = ... -
导出EXCEL常用工具类
2011-11-18 15:06 13081、接口 package com.yihaodian. ... -
抓取网站全站信息,并导出数据为EXCEL
2011-11-18 13:21 997现在以https://www.mann-hummel.com/ ... -
File的读取和写入操作 java
2011-11-18 13:08 9961、文件的读取操作 File file = new Fil ... -
排序算法,从大到小
2011-11-11 10:51 8781、得到list中最大的那个值 public OppoSit ... -
正则表达式提取特定字符串内的特定内容
2011-09-28 09:16 1548我在@京东商城 发现了一个非常不错的商品:七彩云南 寿 熟饼3 ... -
用递归算法查找父节点下的所有叶子节点
2011-09-13 16:31 9565父节点 ----叶子节点 ----子节点一 ------ ...
相关推荐
由于中文是以词为基本单位,不像英文那样有明显的空格分隔,因此在进行信息检索时,需要先对中文文本进行分词,将连续的汉字序列切分成具有独立含义的词语。这样才能有效地进行关键词匹配和索引。 在Lucene中,常见...
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其本身并不包含专门针对中文的分词模块。然而,...
`lucene`目录很可能包含了Lucene的库文件,这些文件包含了Lucene的核心组件,如索引和搜索模块,以及各种分词器。在Java项目中,开发者通常会将这些库文件作为依赖引入,以便使用Lucene提供的API进行文本处理。 `...
用java写的图形分词测试的小东西,用的分词器是: 来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器,其使用“正向全切分算法”,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I...
中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备...
**Lucene分词器资源包详解** Lucene是一款开源的全文搜索引擎库,广泛应用于Java开发中,用于构建高效、可扩展的信息检索应用。这个压缩包提供了Lucene分词时所必需的jar包,使得开发者能够方便地在项目中集成...
lucene3.0 中文分词器, 庖丁解牛
pinyinAnaylyzer.jar则是基于pinyin4j的拼音分词器,它可以将汉字转换成拼音并进行分词,进一步提高搜索的灵活性。 在实际应用中,我们常常需要定制分词规则,例如mydict.dic文件,这是一份自定义词典,包含了我们...
**Lucene+中文IK分词器实例解析** Lucene是一个高性能、全文检索库,由Apache软件基金会开发。它提供了一个简单但功能强大的API,用于在各种应用中实现全文索引和搜索。在处理中文文本时,由于中文词汇的复杂性和无...
本文将深入探讨“基于词典的最大匹配”的Lucene中文分词程序,这是构建高效、准确的中文信息处理系统的重要组成部分。 首先,我们要理解什么是分词。中文分词是指将连续的汉字序列按照词语的边界进行划分,使得每个...
### Lucene4.0 IK分词器使用概览 #### IKAnalyzer:中文分词利器 IKAnalyzer是一款基于Java开发的开源中文分词工具包,自2006年首次发布以来,历经多个版本的迭代,已成为业界广泛认可的中文分词解决方案。其最初...
1. **分析器**(Analyzer):用于将文本切分成词项(Term),并对词项进行标准化处理(如大小写转换、去除停用词等)。中文环境下,通常需要自定义分析器来实现中文分词。 2. **索引器**(IndexWriter):负责创建和...
《Lucene.NET中文分词器:深入解析与实践》 Lucene.NET是一个开源全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个强大的信息检索工具,Lucene.NET广泛应用于搜索引擎开发、文档检索系统等领域。...
1. **中文分词**:由于中文没有明显的词边界,盘古分词是专门针对中文设计的分词工具,能够准确地将连续的汉字序列切分成具有实际意义的词语。 2. **自定义词典**:盘古分词支持用户自定义词典,可以根据具体业务...
使用visual studio 开发的lucene.net和盘古分词实现全文检索。并按照lucene的得分算法进行多条件检索并按照得分算法计算匹配度排序。 可以输入一句话进行检索。 lucene.net的版本为2.9.2 盘古分词的版本为2.3.1 并...
以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较于中文来说较为简单,因为英文单词间通常以空格作为天然的分隔符。然而,为了提高搜索效率和准确性,Lucene3.0采用了更...
用java实现的,利用了lucene里面的standardAnalyzer分析器实现的分词,可以去停用词,再利用波特算法实现 词干提取 最后排序 和词频统计输出
1. **分词(Tokenization)**:在Lucene中,分词是将输入的文档内容分解成一系列独立的、有意义的单元——称为“词元”(Tokens)。这个过程由分词器(Tokenizer)完成,它根据特定的语言规则将连续的字符序列切分成...