Code Monkey home page Code Monkey logo

thulac-java's Introduction

THULAC:一个高效的中文词法分析工具包

本文档只针对THULAC的java版本,其他版本的使用方式请查阅对应的README文件。

目录

项目介绍

THULAC (THU Lexical Analyzer for Chinese) 是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:

  1. 能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
  2. 准确率高。该工具包在标准数据集Chinese Treebank (CTB5) 上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
  3. 速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。(该数据取自本库的c++版本,java版本可能速度略慢)

编译和安装

  • 可执行jar包

本库正在持续开发中,请参阅下文自行编译运行。

  • 下载源代码编译运行

下载编译本库需要计算机上已安装java, gitgradle,以及稳定可靠的网络连接。 之后,运行命令行:

git clone https://github.com/thunlp/THULAC-Java.git

执行完毕后,运行命令行:

gradle check

如果控制台上打出BUILD SUCCESSFUL字样则说明编译成功。

使用方式

1. 分词和词性标注程序

1.1. 命令格式

从命令行输入输出:
java -jar THULAC_lite_java_run.jar [-t2s] [-seg_only] [-deli delimiter] [-user userdict.txt]
从文本文件(UTF-8编码)输入输出:
java -jar THULAC_lite_java_run.jar [-t2s] [-seg_only] [-deli delimiter] [-user userdict.txt] -input input_file -output output_file

1.2. 命令参数

参数名称 含义
-t2s 将句子从繁体转化为简体
-seg_only 只进行分词,不进行词性标注
-deli delimiter 将词与词性间的分隔符设置为delimiter,默认为下划线_
-filter 使用过滤器去除一些没有意义的词语,例如“可以”。
-user userdict.txt 设置用户词典为userdict.txt,词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码
-model_dir dir 设置模型文件所在文件夹为dir,默认为models/
-input input_file 设置输入文件为input_file,默认为命令行输入
-output output_file 设置输出文件为output_file,默认为命令行输出

2. 获取模型

THULAC需要分词和词性标注模型的支持,获取下载好的模型用户可以登录thulac.thunlp.org网站填写个人信息进行下载,并放到THULAC的根目录即可,或者使用参数-model_dir dir指定模型的位置。

代表分词软件的性能对比

我们选择LTP、ICTCLAS、结巴分词等国内代表分词软件与THULAC做性能比较。我们选择Windows作为测试环境,根据第二届国际汉语分词测评发布的国际中文分词测评标准,对不同软件进行了速度和准确率测试。

在第二届国际汉语分词测评中,共有四家单位提供的测试语料 (Academia Sinica, City University, Peking University, Microsoft Research), 在评测提供的资源icwb2-data中包含了来自这四家单位的训练集(training)、测试集(testing), 以及根据各自分词标准而提供的相应测试集的标准答案 (icwb2-data/scripts/gold).在icwb2-data/scripts目录下含有对分词进行自动评分的perl脚本score。

我们在统一测试环境下,对若干流行分词软件和THULAC进行了测试,使用的模型为各分词软件自带模型。THULAC使用的是随软件提供的简单模型Model_1。评测环境为 Intel Core i5 2.4 GHz 评测结果如下:

msr_test(560KB)

Algorithm Time Precision Recall
LTP-3.2.0 3.21s 0.867 0.896
ICTCLAS(2015版) 0.55s 0.869 0.914
jieba 0.26s 0.814 0.809
THULAC 0.62s 0.877 0.899

pku_test(510KB)

Algorithm Time Precision Recall
LTP-3.2.0 3.83s 0.960 0.947
ICTCLAS(2015版) 0.53s 0.939 0.944
jieba 0.23s 0.850 0.784
THULAC 0.51s 0.944 0.908

除了以上在标准测试集上的评测,我们也对各个分词工具在大数据上的速度进行了评测,结果如下:

CNKI_journal.txt(51 MB)

Algorithm Time Speed
LTP-3.2.0 348.624s 149.80KB/s
ICTCLAS(2015版) 106.461s 490.59KB/s
jieba 22.5583s 2314.89KB/s
THULAC 42.625s 1221.05KB/s

词性解释

n/名词 np/人名 ns/地名 ni/机构名 nz/其它专名
m/数词 q/量词 mq/数量词 t/时间词 f/方位词 s/处所词
v/动词 vm/能愿动词 vd/趋向动词 a/形容词 d/副词
h/前接成分 k/后接成分 i/习语 j/简称
r/代词 c/连词 p/介词 u/助词 y/语气助词
e/叹词 o/拟声词 g/语素 w/标点 x/其它

THULAC模型介绍

  1. 我们随THULAC源代码附带了简单的分词模型Model_1,仅支持分词功能。该模型由人民日报分词语料库训练得到。
  2. 我们随THULAC源代码附带了分词和词性标注联合模型Model_2,支持同时分词和词性标注功能。该模型由人民日报分词和词性标注语料库训练得到。
  3. 我们还提供更复杂、完善和精确的分词和词性标注联合模型Model_3和分词词表。该模型是由多语料联合训练训练得到(语料包括来自多文体的标注文本和人民日报标注文本等)。由于模型较大,如有机构或个人需要,请填写“doc/资源申请表.doc”,并发送至 [email protected],通过审核后我们会将相关资源发送给联系人。

注意事项

该工具目前仅处理UTF8编码中文文本,之后会逐渐增加支持其他编码的功能,敬请期待。

其他语言实现

更新历史

更新时间 更新内容
2016-09-29 增加THULAC分词so版本。
2016-03-31 增加THULAC分词python版本。
2016-01-20 增加THULAC分词Java版本。
2016-01-10 开源THULAC分词工具C++版本。

开源协议

  1. THULAC面向国内外大学、研究所、企业以及个人用于研究目的免费开放源代码。
  2. 如有机构或个人拟将THULAC用于商业目的,请发邮件至[email protected]洽谈技术许可协议。
  3. 欢迎对该工具包提出任何宝贵意见和建议。请发邮件至[email protected]
  4. 如果您在THULAC基础上发表论文或取得科研成果,请您在发表论文和申报成果时声明“使用了清华大学THULAC”,并按如下格式引用:

中文:

孙茂松, 陈新雄, 张开旭, 郭志芃, 刘知远. THULAC:一个高效的中文词法分析工具包. 2016.

英文:

Maosong Sun, Xinxiong Chen, Kaixu Zhang, Zhipeng Guo, Zhiyuan Liu. THULAC: An Efficient Lexical Analyzer for Chinese. 2016.

相关论文

  • Zhongguo Li, Maosong Sun. Punctuation as Implicit Annotations for Chinese Word Segmentation. Computational Linguistics, vol. 35, no. 4, pp. 505-512, 2009.

作者

Maosong Sun (孙茂松,导师), Xinxiong Chen(陈新雄,博士生), Kaixu Zhang (张开旭,硕士生), Zhipeng Guo(郭志芃,本科生), Zhiyuan Liu(刘知远,助理教授).

致谢

std4453:对此java版本的代码进行优化和添加注释。

thulac-java's People

Contributors

gzp9595 avatar majunhua avatar std4453 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

thulac-java's Issues

各种问题不忍吐槽

这些都是曾经的THULAC-Java的问题,现在已经解决掉绝大部分了。

一个库应该有一个作为根的包就够了,为什么现在有四个。。

以下是针对thulac.java的吐槽

thulac.java为什么是小写的,里面既有profiler还有实际逻辑,然后根本没有一个可以直接调用的API,我想直接提取分词的结果还得用文件系统中转一下。
变量命名完全不符合规范,虽然是直接从c++翻译过来的库,但也不应该这样啊。。
为什么输入文件的字符集是硬编码的,而且还不是最常用于中文的GB2312而是UTF-8,这是在逼我先把文件读进来一遍再用UTF8输出一遍吗。。
命令行容错也很捉急,比如输入的是-input -seg_only ...的话,input_file就是-seg_only,后面用InputStreamReader的时候就会FileNotFound,然而这个时候程序并没有终止,接下来在getRaw里面就会报NullPointerException。反正各种地方出了错就直接printStackTrace然后无视掉了,既没有finally块也不终止程序,这样问题很大的知道吗。
FileOutputStream out开了不关也是厉害,虽然Closable在finalize的时候会被关闭掉,但是如果程序本身崩溃(比如上面说的NullPointerException的情况)的话就会直接退出而导致系统资源泄露。
getRaw里面Pattern每次执行到就要重新compile一遍也是真的嫌cpu太快,好歹做个静态的字段缓存一下啊。
代码风格也是。。大括号换不换行,运算符前后加不加空格这种,都是IDE里面一步Format Code就能搞定的事情,难道vim用得太爽不惜发动圣战也要乱写?
各种常量就当做magic number摆在那里真的好吗。。真的不考虑弄个properties文件不用重编译就能调参数吗。。
其他各种小毛病也是一大堆,反正怎么跟best practice不对付就怎么来。。
比如遍历Vector完全可以用自动代码糖的Iterator,非要用for循环,还不把size先提取出来。
比如区别控制台和输出到文件也是直接硬编码,完全可以用PrintWriter把out包一层然后就和System.out是同一个类型了,非要加一个判断然后把同样的代码逻辑写两遍,敢问有人听说过DRY原则吗?
对了明明在main的方法签名里面声明了throws IOException又把所有可能出IOException的地方都直接catch掉是几个意思。。

总之,我现在非常好奇的是,清华的实力到底是怎么样的。。

SegItem增加offset属性

目前SegItem没有offset属性,这个属性对于分词来说也是很关键的,期待增加

words没有清空,分词结果是重复的

1、image
如果 读取到空行的话,words.不清空,输出时候会输出重复行
2、配置信息加载 建议设计成单例模式,工具调用会重复加载,如果用户字典太大会很慢的。

添加注释&核查词性解释

1.建议添加注释,要不然像现在通篇没有注释既不便于使用,又不便于维护。

github文档中中的词性解释是这样的:

n/名词 np/人名 ns/地名 ni/机构名 nz/其它专名
m/数词 q/量词 mq/数量词 t/时间词 f/方位词 s/处所词
v/动词 vm/能愿动词 vd/趋向动词 a/形容词 d/副词
h/前接成分 k/后接成分 i/习语 j/简称
r/代词 c/连词 p/介词 u/助词 y/语气助词
e/叹词 o/拟声词 g/语素 w/标点 x/其它

而实际测试:

我觉得吧,如果非要我说一句话试试看的话,我一定会这么说:苟利国家生死以,岂因祸福避趋之。

输出结果为:

我_r 觉得_v 吧_u ,_w 如果_c 非_d 要_v 我_r 说_v 一_m 句_q 话_n 试试_v 看_v 的_u 话_n ,_w 我_r 一定_d 会_v 这么_r 说_v :_w 苟利国家生死以_id ,_w 岂因祸福避趋之_id 。_w

可见习语代码为"id",而非"i",与文档中不符。
可能还有其他不一致之处,我未全部核查。
建议核查并且修改词性解释。

CBTaggingDecoder实例化对象多线程安全问题

您好,CBTaggingDecoder实例化对象多线程调用存在线程安全问题,里面的成员变量不是线程安全的

每次调用分词方法存在对成员变量的写操作;

反之,如果每次new一个CBTaggingDecoder对象(初始化成员变量等),则模型文件需要重新加载,开销很大

能不能优化一下,使得既能够多线程调用,然后不需要重新加载模型文件(至少重用模型数据结构,或者CBTaggingDecoder对象单例化)

这里的部分成员变量在调用分词方法 有写操作
private int maxLength;
private int len;
private String sequence;
private int[][] allowedLabelLists;
private int[][] pocsToTags;

private CBNGramFeature nGramFeature;
private Dat dat;

private CBModel model;

private Node[] nodes;
private int[] values;
private AlphaBeta[] alphas;
private int[] result;

private String[] labelInfo;

private int[][] labelTransPre;
private int[][] labelTransPost;

public int threshold;

关于API、demo和文档

各位老师同学幸苦了,开发了这么好的一个中文分词项目。
不知道是否可以自定义词典?是否可以自定义词性?该如何操作?
如果能有hanlp这样丰富的API和demo就好了,方便大家学习和反馈问题。

thulac.java中一些问题: maxLength过大导致长段文字未分词. seg_only时无法自定义分隔符.建议增加正则表达式Pattern p匹配的标点符号

现在程序中maxLength=50000,测试分词:

String[] args = {"-t2s","-seg_only","-deli","_","-input",“input.txt”,"-output","output.txt",
				"-model_dir","/Users/XXXX/models"};
thulac.main(args);

其中input.txt为:

一位真正的作家永远只为内心写作,只有内心才会真实地告诉他,他的自私、他的高尚是多么突出。内心让他真实地了解自己,一旦了解了自己也就了解了世界。很多年前我就明白了这个原则,可是要捍卫这个原则必须付出艰辛的劳动和长时期的痛苦

输出分词结果为:

一位真正的作家永远只为内心写作,只有内心才会真实地告诉他,他的自私、他的高尚是多么突出。内心让他真实地了解自己,一旦了解了自己也就了解了世界。很多年 前 我 就 明白 了 这个 原则 , 可是 要 捍卫 这个 原则 必须 付出 艰辛 的 劳动 和 长 时期 的 痛苦 , 因为 内心 并非 时时刻刻 都 是 敞开 的 , 它 更 多 的 时候 倒是 封闭 起来 , 于是 只有 写作 , 不 停 地 写作 才 能 使 内心 敞开 , 才 能 使 自己 置身 于 发现 之中 , 就 像 日出 的 光芒 照亮 了 黑暗 , 灵感 这时候 才 会 突然 来到 。

问题:

  1. 分割词为“ ”,而非自定义的“_”
  2. 长段文字未分词

对于解决问题2的建议

  1. 如果maxLength没有什么存在必要的话,建议去除,因为它明显降低长句时分词正确性。建议在public static Vector getRaw中,永远对标点符合进行识别,而不进行if(ans.length() < maxLength)的比较
  2. 建议将public static Vector getRaw中正则表达式识别如下修改:

Pattern p = Pattern.compile(".*?[:\\..。?!;;!?,,、 \"\'“”‘’\n\r【】《》");

以识别更全的标点符号(可考虑在此基础上增添其他符号,但是中文常用的、“”‘’""不能少!)
原文件为:

Pattern p = Pattern.compile(".*?[。?!;;!?]");

修改后运行结果:(同时将maxLength值设为1)

一 位 真正 的 作家 永远 只 为 内心 写作 , 只有 内心 才 会 真实 地 告诉 他 , 他 的 自私 、 他 的 高尚 是 多么 突出 。 内心 让 他 真实 地 了解 自己 , 一旦 了解 了 自己 也 就 了解 了 世界 。 很多年 前 我 就 明白 了 这个 原则 , 可是 要 捍卫 这个 原则 必须 付出 艰辛 的 劳动 和 长 时期 的 痛苦 , 因为 内心 并非 时时刻刻 都 是 敞开 的 , 它 更 多 的 时候 倒是 封闭 起来 , 于是 只有 写作 , 不 停 地 写作 才 能 使 内心 敞开 , 才 能 使 自己 置身 于 发现 之中 , 就 像 日出 的 光芒 照亮 了 黑暗 , 灵感 这时候 才 会 突然 来到

关于分词文本中有空行的问题。

老师好,在使用JAVA版分词时,若文本出现空行,该分词器会自动把下一行内容填充到该行(空行),因此会出现重复词频。第一次使用时不会该情况,改变参数segOnly再次调用则会出现。

带特殊字符文本分词异常

首先,需要了解一些基本事实: 􀂄 **的小麦依靠自给。

据香港媒体报导,嫩模Jeana(何佩瑜)四处惹是非,结果被其他𡃁模群起围攻,指她整容。

at java.util.Vector.get(Unknown Source)
at org.thunlp.thulac.cb.CBTaggingDecoder.segment(CBTaggingDecoder.java:276)

貌似是POCGraph graph对象与句子长度不一致

句子中特殊字符占据两个长度,而POCGraph graph对象少了一个长度

补充:

后面的方法 this.nGramFeature.putValues(sequence, len); 里面用到sequence.charat(i)方法,都会出问题了

THULAC的Java 8实现thulac4j

thulac4j是THULAC的Java 8实现,做了如下的优化:

  1. 规范化分词词典,并去掉一些无用词;
  2. 重写DAT(双数组Trie树)的构造算法,生成的DAT size减少了8%左右,从而节省了内存;
  3. 简明化分词流程,便于功能扩展。

欢迎大家对比使用。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.