java ikanalyzer分词_利用ikanalyzer分词
最近想研究一下word2vec,第一步是要搞个训练预料。看了看网上有人是用sogou labs提供的新闻语料进行研究的。但是我觉得可能单纯用新闻语料可能还不够吧。
所以就开始在网上找一些别的语料,后来找到了一个百度百科2012年的全部词条信息,是网友制作成词典供mdict使用的。二进制格式有5个多G,搞成utf-8文本后有13.3g,数据量还是蛮大的,应该足够word2vec的训练了。
由于是中文,还需要进行分词,尝试了一下用crf进行分词(据说是目前最先进的分词技术,据我所知,百度最新的分词工具,应该就是用crf的吧)的stanford-segmenter,发现速度太慢了。
在网上找了一下,准确和速度都还可以的分词库,最好找了ikanalyzer。这个其实是为lucence的一个切词库。不过,她也可以单独来使用。我研究了一下,觉得可能词库还够,所以就进行了一下扩充。
首先我用别的分词工具,对基本词进行了一个补充,加了一个normal_add.dic的词典,共增加了215,780(去重后)。另外从搜狗输入法的一些官方推荐的细胞词库中扒出了913,347的词形成sogou_scel.dic,另外再加了一些中文的停用词表stopword_zh.dic。
最终的配置文件如下:
1: <?xml version="1.0" encoding="UTF-8"?>
2:
3:
4: IK Analyzer 扩展配置
5: normal_add.dict;sogou_scel.dic;
6: stopword.dic;stopword_zh.dic;
7:
8:
调用ikanalyzer,写了一个分词的程序,测试了一下,目前的分词速度在1s钟,200000个词左右,速度还是蛮快的。具体的代码如下:
1: package com.smallqiao.wordseg;
2:
3: import java.io.FileInputStream;
4: import java.io.FileNotFoundException;
5: import java.io.FileOutputStream;
6: import java.io.IOException;
7: import java.io.InputStreamReader;
8: import java.io.OutputStreamWriter;
9: import java.io.UnsupportedEncodingException;
10:
11: import org.wltea.analyzer.cfg.Configuration;
12: import org.wltea.analyzer.cfg.DefaultConfig;
13: import org.wltea.analyzer.core.IKSegmenter;
14: import org.wltea.analyzer.core.Lexeme;
15:
16: public class Main {
17:
18: public static void main(String[] args) {
19: if (args.length < 4) {
20: System.err.println("usage: java -jar *.jar [use smart, default true]");
21: System.err.println("\tif the is set as -, the standard input is used");
22: System.err.println("\tif the is set as -, the standard output is used");
23: System.exit(-1);
24: }
25: String input = args[0].trim();
26: String enc = args[1].trim();
27: String output = args[2].trim();
28: String out_enc = args[3].trim();
29: boolean useSmart = true;
30: if (args.length >= 5) {
31: useSmart = Boolean.parseBoolean(args[4]);
32: }
33:
34: InputStreamReader ir = null;
35: OutputStreamWriter ow = null;
36: try {
37: Configuration cfg = DefaultConfig.getInstance();
38: cfg.setUseSmart(useSmart);
39: System.err.println("config");
40: System.err.println("\tmain dict: " + cfg.getMainDictionary());
41: System.err.print("\text dict: ");
42: for (String dict : cfg.getExtDictionarys()) {
43: System.err.print(dict + ", ");
44: }
45: System.err.println("\b\b");
46: System.err.println("\text stop dict: ");
47: for (String dict : cfg.getExtStopWordDictionarys()) {
48: System.err.print(dict + ", ");
49: }
50: System.err.println("\b\b");
51: System.err.println("\tuse smart: " + cfg.useSmart());
52:
53: if (input.equals("-")) {
54: ir = new InputStreamReader(System.in, enc);
55: } else {
56: ir = new InputStreamReader(new FileInputStream(input), enc);
57: }
58:
59: IKSegmenter seg = new IKSegmenter(ir, cfg);
60:
61: if (output.equals("-")) {
62: ow = new OutputStreamWriter(System.out, out_enc);
63: } else {
64: ow = new OutputStreamWriter(new FileOutputStream(output), out_enc);
65: }
66: Lexeme lex = null;
67: int cnt = 0;
68: long begin = 0;
69: long end = 0;
70: int time_cnt = 10000;
71: int last = 0;
72: while ((lex = seg.next()) != null) {
73: if (cnt == 0) {
74: begin = System.currentTimeMillis();
75: }
76: ow.write(lex.getLexemeText());
77: ow.write(" ");
78:
79: if (++cnt == time_cnt) {
80: ow.flush();
81: end = System.currentTimeMillis();
82: String info = String.format("speed: %d word/s", 1000 * cnt / (end - begin));
83: while (last-- > 0) {
84: System.err.print('\b');
85: }
86: System.err.printf(info);
87: last = info.length();
88: cnt = 0;
89: }
90: }
91: ow.flush();
92: }
93: catch(UnsupportedEncodingException e) {
94: System.err.println("unsupported encoding: " + enc + "or " + out_enc);
95: System.exit(-1);
96: } catch (FileNotFoundException e) {
97: System.err.println("input file not found: " + input);
98: System.exit(-1);
99: } catch (IOException e) {
100: System.err.println("while seg, io excepiton: " + e.getMessage());
101: System.exit(-1);
102: }
103: finally {
104: if (ir != null) {
105: try {
106: ir.close();
107: } catch (IOException e) {
108: }
109: }
110:
111: if (ow != null) {
112: try {
113: ow.close();
114: } catch (IOException e) {
115: }
116: }
117: }
118: }
119:
120: }
最终的切词工具,打包供下载:wordseg
欢迎加入我爱机器学习QQ14群:336582044
微信扫一扫,关注我爱机器学习公众号
java ikanalyzer分词_利用ikanalyzer分词相关推荐
- JAVA使用es不分词_谈谈 Elasticsearch 分词和自定义分词
初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景: 1.为什么命名有包含搜索关键词的文档,但结果里面就没有相关文档呢? 2.我存进去的文档到底被分成哪些词(ter ...
- 与自定义词典 分词_如何掌握分词技术,你需要学会这些
导语 本周对自然语言处理的分词技术进行了学习.本文针对分词技术的进行了全视角的概览,目标是掌握什么是分词技术.为什么需要分词技术和如何使用分词技术.后续将分不同篇幅对其中内容进行深挖和讲解. 文章结构 ...
- java invoke 泛型_利用Java反射机制和泛型,全自动解析json
有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量 Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...
- java 分词词频_利用word分词来对文本进行词频统计
标签: 命令行脚本的调用方法如下: 将需要统计词频的文本写入文件:text.txt chmod +x wfs.sh & wfs.sh -textFile=text.txt -statistic ...
- java 庖丁解牛中文分词_庖丁解牛中文分词包
http://code.google.com/p/paoding/ Paoding Analysis摘要 Paoding's Knives 中文分词具有极 高效率 和 高扩展性 .引入隐喻,采用完全的 ...
- mysql 中文分词搜索_利用中文分词打造数据库全文检索
传统的 LIKE 模糊查询(前置百分号)无法利用索引,特别是多个关键词 OR,或在多个字段中 LIKE,更是效率低下.本文研究对文章进行分词以提高检索的准确度和查询效率. 根据自己的编程语言选择一款合 ...
- java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用
在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...
- java 实现网络通信_利用Java怎么样实现网络通信功能
利用Java怎么样实现网络通信功能 发布时间:2020-11-20 15:19:04 来源:亿速云 阅读:72 作者:Leah 利用Java怎么样实现网络通信功能?相信很多没有经验的人对此束手无策,为 ...
- java jmap 分析_利用java虚拟机的工具jmap分析java内存情况
有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...
最新文章
- oracle数据库部署
- 剑指offer之31-35题解
- 适配器模式和装饰模式
- CentOS7 3.项目持续交付脚本
- 报告 | 斯坦福2019 AI年度报告出炉!700亿美元投入AI,自动驾驶融资最多
- 洛谷 [P1265] 公路修建
- 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
- Angular2 初识
- 获取数据库链接Junit
- [Java IO]04_系统标准IO
- visio给图片添加任意形状外框
- png批量转换成jpg,png批量转jpg方法
- 慧之声科技- 程序员的爱情故事
- QQ音乐、网易云音乐、虾米音乐们的音乐社区暗战
- 重难点详解-关系代数表达式
- 优雅写代码的45个小技巧
- 业大宗商品价格简史:经验总结与未来展望-20210107.PDF
- GA-RPN:Region Proposal by Guided Anchoring
- 锁定td的高度_如何固定单元格的高度
- “广告电商”到底是什么?广告收益模式是否行得通?