- 浏览: 2184771 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
在做一个电商的网站的初期时,我们常常面临词库的问题,因为我们并没有比较好的词库,这时候呢,我们就可以从网上下一些,别人有的词库,这些词库有淘宝的,有搜狗的,搜狗的分类比较细, 我们可以根据下载与我们行业比较相关的词库,但这些词库一般都是scel格式的,直接使用JAVA解析,是没法解析的,如果遇到这种情况可用散仙下面的这个类,来解析,经测试无乱码现象,解析完整度还不错。
源码如下:
源码如下:
package com.qin.parse.scel; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class SougouScelReader { public SougouScelMdel read(File file) throws IOException { return read(new FileInputStream(file)); } public SougouScelMdel read(URL url) throws IOException { return read(url.openStream()); } protected ByteArrayOutputStream output=new ByteArrayOutputStream(); protected String readString(DataInputStream input,int pos,int[] reads) throws IOException { int read=reads[0]; input.skip(pos-read); read=pos; output.reset(); while(true) { int c1 = input.read(); int c2 = input.read(); read+=2; if(c1==0 && c2==0) { break; } else { output.write(c1); output.write(c2); } } reads[0]=read; return new String(output.toByteArray(),encoding); } protected static String encoding = "UTF-16LE"; public SougouScelMdel read(InputStream in) throws IOException { SougouScelMdel model = new SougouScelMdel(); DataInputStream input = new DataInputStream(in); int read; try { byte[] bytes = new byte[4]; input.readFully(bytes); assert (bytes[0] == 0x40 && bytes[1] == 0x15 && bytes[2] == 0 && bytes[3] == 0); input.readFully(bytes); int flag1 = bytes[0]; assert (bytes[1] == 0x43 && bytes[2] == 0x53 && bytes[3] == 0x01); int[] reads=new int[]{8}; model.setName(readString(input,0x130,reads)); model.setType(readString(input,0x338,reads)); model.setDescription(readString(input,0x540,reads)); model.setSample(readString(input,0xd40,reads)); read = reads[0]; input.skip(0x1540 - read); read=0x1540; input.readFully(bytes); read += 4; assert (bytes[0] == (byte) 0x9D && bytes[1] == 0x01 && bytes[2] == 0 && bytes[3] == 0); bytes = new byte[128]; Map<Integer, String> pyMap = new LinkedHashMap<Integer, String>(); while (true) { int mark = readUnsignedShort(input); int size = input.readUnsignedByte(); input.skip(1); read += 4; assert (size > 0 && (size % 2) == 0); input.readFully(bytes, 0, size); read += size; String py = new String(bytes, 0, size, encoding); //System.out.println(py); pyMap.put(mark, py); if ("zuo".equals(py)) { break; } } if (flag1 == 0x44) { input.skip(0x2628 - read); } else if (flag1 == 0x45) { input.skip(0x26C4 - read); } else { throw new RuntimeException("出现意外,联系作者"); } StringBuffer buffer = new StringBuffer(); Map<String, List<String>> wordMap = new LinkedHashMap<String, List<String>>(); while (true) { int size = readUnsignedShort(input); if (size < 0) { break; } int count = readUnsignedShort(input); int len = count / 2; assert (len * 2 == count); buffer.setLength(0); for (int i = 0; i < len; i++) { int key = readUnsignedShort(input); buffer.append(pyMap.get(key)).append("'"); } buffer.setLength(buffer.length() - 1); String py = buffer.toString(); List<String> list = wordMap.get(py); if (list == null) { list = new ArrayList<String>(); wordMap.put(py, list); } for (int i = 0; i < size; i++) { count = readUnsignedShort(input); if (count > bytes.length) { bytes = new byte[count]; } input.readFully(bytes, 0, count); String word = new String(bytes, 0, count, encoding); //接下来12个字节可能是词频或者类似信息 input.skip(12); list.add(word); } } //System.out.println(wordMap.size()); model.setWordMap(wordMap); return model; } finally { in.close(); } } protected final int readUnsignedShort(InputStream in) throws IOException { int ch1 = in.read(); int ch2 = in.read(); if ((ch1 | ch2) < 0) { return Integer.MIN_VALUE; } return (ch2 << 8) + (ch1 << 0); } } //自行将此类提出来为public class class SougouScelMdel { private Map<String, List<String>> wordMap; private String name; private String type; private String description; private String sample; public Map<String, List<String>> getWordMap() { return wordMap; } void setWordMap(Map<String, List<String>> wordMap) { this.wordMap = wordMap; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getSample() { return sample; } public void setSample(String sample) { this.sample = sample; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.qin.parse.scel; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Paths; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; /** * 解析sogo词库工具类 * * * **/ public class ParseSogo { public static void main(String[] args)throws Exception { sogou("D:\\词库\\dianshang.scel","D:\\词库\\goods1.txt",false); } /** * 读取scel的词库文件 * 生成txt格式的文件 * @param inputPath 输入路径 * @param outputPath 输出路径 * @param isAppend 是否拼接追加词库内容 * true 代表追加,false代表重建 * * **/ private static void sogou(String inputPath,String outputPath,boolean isAppend) throws IOException{ File file=new File(inputPath); if(!isAppend){ if(Files.exists(Paths.get(outputPath),LinkOption.values())){ System.out.println("存储此文件已经删除"); Files.deleteIfExists(Paths.get(outputPath)); } } RandomAccessFile raf=new RandomAccessFile(outputPath, "rw"); int count=0; SougouScelMdel model = new SougouScelReader().read(file); Map<String,List<String>> words = model.getWordMap(); //词<拼音,词> Set<Entry<String,List<String>>> set = words.entrySet(); Iterator<Entry<String,List<String>>> iter = set.iterator(); while(iter.hasNext()){ Entry<String,List<String>> entry = iter.next(); List<String> list = entry.getValue(); int size = list.size(); for(int i = 0; i < size; i++){ String word = list.get(i); //System.out.println(word); raf.seek(raf.getFilePointer()); raf.write((word+"\n").getBytes());//写入txt文件 count++; } } raf.close(); System.out.println("生成txt成功!,总计写入: "+count+" 条数据!"); } }
评论
1 楼
x0070704
2014-12-03
这个工具好强大,大部分的文件都被解析出来了,但我发现有些解析不了,会在input.readFully(bytes, 0, count);那行报IndexOutOfBoundsException错。虽然我也在研究怎样解决这问题,但鉴于自己也是刚接触,暂时未完全了解其原理,希望作者也一起解决一下
暂时发现不能解析的文件如下:
农林渔畜/渔业/船名前缀.scel
农林渔畜/渔业/海洋工程与海洋环境专有名词.scel
社会科学/教育教学/教育局股室.scel
社会科学/广告传媒/悠活网词汇.scel
工程应用/环境能源/核能词汇.scel
暂时发现不能解析的文件如下:
农林渔畜/渔业/船名前缀.scel
农林渔畜/渔业/海洋工程与海洋环境专有名词.scel
社会科学/教育教学/教育局股室.scel
社会科学/广告传媒/悠活网词汇.scel
工程应用/环境能源/核能词汇.scel
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1573### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1234如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1129我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2208高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2094将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1669在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 1068Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 6043之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 990长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2092计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3389### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1108# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3290# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1122# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1474# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1062### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1387# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1371# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 740### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1502前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
【标题】中的“jav经典小程序,五子棋,聊天程序,扫雷程序”指的是使用Java编程语言编写的一些经典的小型应用程序。这些程序包括了大家熟知的娱乐游戏——五子棋,一个实现基本通信功能的聊天程序,以及模拟经典...
保证能用,完美的下载指定FTP文件夹下的内容,(只测试了文件,文件夹未测),JAVA程序的
JAV独立升级程序,用于给系统的JDK JAV、jre进行安装和升级。本程序从JAV6.0原版而来。
“jav674”可能是一个具体的练习题目或者案例,这通常用于巩固所学知识,比如设计并实现一个简单的应用程序或者解决一个特定的编程问题。这种实践性的环节对于理解Java编程至关重要,因为编程语言的学习不只是理论...
jav 读取本地文件列表 FileBrowser_demojav 读取本地文件列表 FileBrowser_demo
JAV的安装程序, 点一下安装就可以了。
【标题】"sre.rar_jav.land_jav id_jav.land怎么用_jav·land_www.javlibs" 提示我们这个压缩包可能包含了与Java编程相关的资源,特别是针对Android平台的开发。`jav.land`、`jav.id`、`jav.land怎么用`以及`jav·...
首先,txt文件是一种常见的纯文本文件格式,通常用于存储简单的文本信息,如文档、笔记或数据。由于txt文件不包含任何格式信息,解析这类文件通常涉及到读取每一行并理解其内容结构。在试题文档的场景下,这可能意味...
标题"DHS.rar_DVD18JAV_JAV505_jav137_jav2018dvd_jav649"暗示这可能是一个关于Java编程的学习资源集合,其中包含了不同项目的代号或者版本号。描述提到是“练习作品DVD定制系统”,这可能是一个基于Java开发的用于...
在提供的"支持任何开发工具的敏感词过滤"压缩包中,可能包含了多种格式的敏感词库,如文本文件、数据库文件或特定格式的数据结构。开发者需要根据自己的需求选择合适的格式进行导入和使用。同时,这个资源可能还提供...
1. jav程序监控并记录jvm运行时内存、线程、垃圾收集和堆空间 2. 定时记录到本地文件中; 3. 可以设置记录的时间间隔和循环记录次数; 4. 在监控不完善的情况下,可以记录java进程异常退出之前的jvm状态信息; 5. ...
在做项目的时候,发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
JAVBus.ipa
总结,"JAV.rar"中包含的"倪博JAVA课题设计源代码"可能是一个实际的图书管理系统项目,涉及了Java编程、数据库设计、前端开发等多个方面。通过深入学习和实践,我们可以掌握构建此类系统的全过程,提升在IT领域的...
【标题】"JAV网络机顶盒.7z"是一个包含有关JAV(Java-based Application for Video)网络机顶盒的压缩文件。该文件可能是针对特定型号或品牌的JAV网络机顶盒提供的固件更新、刷机教程或者相关配置文件的集合。 ...
.jar文件类似于Windows上的.exe可执行文件,但它是Java平台的可执行格式。用户可以通过Java虚拟机(JVM)来运行这个文件,实现QQ的启动和功能使用。 “说明.txt”文件很可能是提供给用户关于如何安装和运行这个Java...
yrtos_ MULTITASKING RTOS,.
这个压缩包"jav-8-openjdk-amd64.tar.gz"包含了一整套用于在Linux环境下开发、运行Java应用程序和Android应用所需的工具和库。解压后,你将获得OpenJDK 8的安装文件,包括JRE(Java Runtime Environment)和JDK工具...
根据给定的信息,本文将对“JAV的简易计算机”这一项目进行详细的解析与知识点的阐述。本项目基于Java语言实现了一个简易计算器的功能,能够处理基本的数学运算,并且具备一定的用户界面。接下来,我们将围绕该项目...