欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用IKAnalyzer进行中文分词

程序员文章站 2022-05-09 13:53:13
...
               

在不需要标注词性的情况下,IKAnalyzer这个工具能实现较好的分词效果。下载地址:https://code.google.com/p/ik-analyzer/

下载下来以后能看到有个pdf文档告诉该如何使用,不过作者貌似没有提到需要用到lucene包,这个jar包可以从这里下载:http://grepcode.com/snapshot/repo1.maven.org/maven2/org.apache.lucene/lucene-core/3.6.1

一个完整的结构如下:

使用IKAnalyzer进行中文分词


其中ext.dic和chinese_stopword.dic都是自定义的,这里ext.dic用的是百度百科的词条【496万个词条】,需要在xml里面添加dic的位置。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  <properties>   <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict">ext.dic;</entry>   <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry>  </properties>

添加好字典后,就可以写个程序来测试效果了,测试用例如下:

李天一,现名李冠丰。著名歌唱家李双江和知名歌唱家梦鸽之子。根据司法机关公布资料显示,李天一出生于1996年4月。曾就读北京海淀区中关村第三小学、人民大学附中、美国Shattuck-St. Mary's School(沙特克圣玛丽学院)冰球学校。2011年9月6日,因与人斗殴被拘留教养1年。2012年9月19日,李天一被解除教养。2013年2月22日,因涉嫌轮奸案被刑事拘留,后因可查资料显示未成年,移交少管所。3月7日,*电视台新闻中心官方微博发布了一条消息,称李天一因涉嫌强奸罪,已被检察机关批捕。2013年9月,李双江一篇旧文证实李天一成年。


测试程序如下:

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.StringReader;import org.apache.lucene.analysis.TokenStream;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;import org.wltea.analyzer.core.IKSegmenter;import org.wltea.analyzer.core.Lexeme;import org.wltea.analyzer.lucene.IKAnalyzer;public class IKAnalyzerTest public static void main(String[] args) throws IOException {  String filePath = "test.txt";  String news=new String();        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8"));     String str;     while ((str = in.readLine()) != null) {      news+=str;     }    in.close();    System.out.println(news);    IKAnalyzer analyzer = new IKAnalyzer(true);    StringReader reader = new StringReader(news);    TokenStream ts = analyzer.tokenStream("", reader);    CharTermAttribute term = ts.getAttribute(CharTermAttribute.class);    while(ts.incrementToken()){     System.out.print(term.toString()+"|");     }    analyzer.close();    reader.close();        System.out.println();    StringReader re = new StringReader(news);    IKSegmenter ik = new IKSegmenter(re,true);    Lexeme lex = null;    while((lex=ik.next())!=null){     System.out.print(lex.getLexemeText()+"|");    } }}


其中上面第一个没有调用lucene库,第二个是调用lucene库进行分词,两者区别貌似不大。


得到结果如下:

?李天一,现名李冠丰。著名歌唱家李双江和知名歌唱家梦鸽之子。根据司法机关公布资料显示,李天一出生于1996年4月。曾就读北京海淀区中关村第三小学、人民大学附中、美国Shattuck-St. Mary's School(沙特克圣玛丽学院)冰球学校。2011年9月6日,因与人斗殴被拘留教养1年。2012年9月19日,李天一被解除教养。2013年2月22日,因涉嫌轮奸案被刑事拘留,后因可查资料显示未成年,移交少管所。3月7日,*电视台新闻中心官方微博发布了一条消息,称李天一因涉嫌强奸罪,已被检察机关批捕。2013年9月,李双江一篇旧文证实李天一成年。啊
加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
加载扩展停止词典:chinese_stopword.dic
李天一|现名|李冠|丰|著名|歌唱家|李双|江和|知名|歌唱家|梦鸽|之子|根据|司法机关|公布|资料|显示|李天一|出生于|1996年|4月|就读|北京|海淀区|中关村第三小学|人民大学|附中|美国|shattuck-st.|mary|s|school|沙|特克|圣玛丽学院|冰球|学校|2011年|9月6日|与人|斗殴|拘留|教养|1年|2012年|9月19日|李天|一被|解除|教养|2013年|2月22日|因涉嫌|轮奸案|刑事拘留|可查|资料|显示|未成年|移交|少管所|3月7日|*电视台|新闻中心|官方|微博|发布|一条|消息|称|李天一|因涉嫌|强奸罪|已被|检察机关|批捕|2013年|9月|李双江|一篇|旧文|证实|李天一|成年|
李天一|现名|李冠|丰|著名|歌唱家|李双|江和|知名|歌唱家|梦鸽|之子|根据|司法机关|公布|资料|显示|李天一|出生于|1996年|4月|就读|北京|海淀区|中关村第三小学|人民大学|附中|美国|shattuck-st.|mary|s|school|沙|特克|圣玛丽学院|冰球|学校|2011年|9月6日|与人|斗殴|拘留|教养|1年|2012年|9月19日|李天|一被|解除|教养|2013年|2月22日|因涉嫌|轮奸案|刑事拘留|可查|资料|显示|未成年|移交|少管所|3月7日|*电视台|新闻中心|官方|微博|发布|一条|消息|称|李天一|因涉嫌|强奸罪|已被|检察机关|批捕|2013年|9月|李双江|一篇|旧文|证实|李天一|成年|


可以看到有些词分出来不是很准确,比如上面红色标记的部分,这里采用了智能匹配,但是依然出错了,分出来的词甚至不在词表中。看来还是ANSJ分词比较靠谱。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow