您的位置:首页 > 其它

中文分词的应用 新浪和庖丁两种方式对比

2015-06-23 14:51 197 查看
中文分词相比于英文难度要大得多,涉及到自然语言的理解和处理。分词也是文本挖掘中的关键技术之一,百度也是因为中文分词相比于google更优秀,才做到中文的检索结果更优。实际上新浪、百度云服务上很多开发者也开放出分词的API供大家调用,例如:http://apidoc.sinaapp.com/sae/SaeSegment.html,我没有专门测试,这是依托于SAE服务的,一些第三方自己开发的大多都是基于开源产品的封装,例如一个新浪SAE上部署的应用(非官方)提供了下面的接口:

方法
http://5.tbip.sinaapp.com/api.php?str=中文字符串&type=str
参数说明

str = 中文字符串(要分词的中文)

type =默认返回序列化后的数组

str 返回用,分隔的字符串 例如:明天,星期天

json 返回json结果

做个试验,字符串为“斯蒂夫·乔布斯之于Apple,对亚马逊来说,领军人物贝佐斯必不可少”,看到的分词如下:

斯蒂夫·乔布斯,之,于,apple,,,对,亚马逊,来说,,,领军,人物,贝佐斯,必不可少

分词算法分类

基于字符串匹配的分词方法 – 基于理解的分词方法

基于统计的分词方法

两大难题

歧义识别

新词识别

应用

搜索引擎

自然语言处理

Lucene的中文分词器中庖丁分词器较为著名,虽然很久没有更新,但是从实际的使用效果来看,非常不错,速度和结果都达到了商业水准。

项目主页:http://code.google.com/p/paoding/

效果体验

使用者第一步最有可能的是想要体验了解庖丁的分词效果。考虑到这样的需求,庖丁提供了一个shell文件,使用者不必写任何代码就可以获得这样的信息。进入Paoding-Analysis分发包,在命令行模式下执行analyzer.bat(windows)或analyzer.sh(linux)即可。下以windows为例:

u 显示帮助

E:\Paoding-Analysis>analyzer.bat ?

u 分词对话

当没有在命令行参数种输入分词内容或待分词的文章时,analyzer.bat进入分词对话模式,使用者可以多次输入或粘贴不同的文字内容,查看分词效果,如:

E:\Paoding-Analysis>analyzer.bat

paoding> |

此时使用者可以在光标所在所在位置(|)输入或粘贴待分词的内容(以分号结束),按下Enter键换行,analyzer.bat便可以输出分词结果。比如:

paoding> 中文分词;

1: 中文/分词/

分词器net.paoding.analysis.analyzer.PaodingAnalyzer

内容长度 4字符, 分 2个词

分词耗时 0ms

————————————————–

分词完毕后,又会进入以上对话模式。

键入:e或:q退出会话 (包括:符号) 。

键入:?显示帮助(包括:符号) 。

u 对文件进行分词

analyzer.bat允许对指定的文件进行分词体验。文件以路径名给出可以使绝对地址、相对当前目录的地址,或以classpath:为前缀的类路径地址。示例如下:

paoding> :-f E:/content.txt

paoding> :-f E:/content.txt -c gbk

paoding> :-f E:/content.txt -c gbk -m max

设置环境变量方法简单但是没有必要,庖丁字典仅仅在使用庖丁分词的工程中使用即可,没有必要设置全局的环境变量,所以我使用了修改配置文件,把dic目录拷贝到使用庖丁分词的工程目录中

修改配置文件paoding-dic-home.properties,paoding.dic.home=classpath:dic

导入

lucene-core-3.1.0.jar

paoding-analysis.jar

commons-logging.jar

dic文件夹

示例代码:

package paoding;

import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

public class PaodingTest {

public static void main(String[] args) {

String line = “斯蒂夫·乔布斯之于Apple,对亚马逊来说,领军人物贝佐斯必不可少”;

PaodingAnalyzer analyzer = new PaodingAnalyzer();

StringReader sr = new StringReader(line);

TokenStream ts = analyzer.tokenStream(line, sr);

try {

while (ts.incrementToken()) {

CharTermAttribute cta = ts.addAttribute(CharTermAttribute.class);

System.out.println(cta.toString());

}

} catch (Exception e) {

}

analyzer.close();

}

}

结果为

斯,蒂夫,乔布,斯,之于,apple,对,亚马逊,来说,军人,人物,领军人物,贝佐,佐斯,不可,必不可少

庖丁词典中没有乔布斯和贝索斯的专有名词,在词典name-foreign.dic中加入斯蒂夫、乔布斯、贝佐斯之后(注意要删除dic目录下的.compiled文件夹之后再编译),结果为:

蒂夫,斯蒂夫,乔布,乔布斯,之于,apple,对,亚马逊,来说,军人,人物,领军人物,贝佐斯,不可,必不可少

对比新浪SAE tbip提供的分词的结果庖丁得到的结果相对较差,估计tbip也是采用了一些开源的分词插件,并进行了一些优化。庖丁的使用还需要继续配置和优化才能得到更好的效果。

从执行时间来看的话,庖丁分词作为单机运行的程序,有相当大的优势。

庖丁分词工程:http://pan.baidu.com/s/1dDxKuOT

附:

目前中文分词做的较为先进的是中科院的ictclas 中文分词算法,采用隐马尔科夫模型(Hidden Markov Model, HMM),但目前看ict有两个版本一个是开源版,一个是闭源版本。闭源版本可以免费使用但是不得商用,这个可以见北京理工大学张华平博士的空间,张华平导师的学生孙健依据ict的开源版写了一个Java版本(Ansj),并且全部开源,使得
Ansi 可用于人名识别、地名识别、组织机构名识别、多级词性标注、关键词提取、指纹提取等领域,支持行业词典、 用户自定义词典。详细信息可以参考作者孙健的专访以及项目的Github地址。这个工具有待进一步研究,不过看起来庖丁很久没有更新了,而ansj
3天前还在更新呢,很敬佩孙健的持之以恒!

附上ansj示例:http://demo.ansj.org/,尝试字符串”斯蒂夫·乔布斯之于Apple,对亚马逊来说,领军人物贝佐斯必不可少”

结果列出了5种方式,效果非常不错。之后再专门研究ansj分词吧:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: