自然语言处理工具包(中文)

中文自然语言处理工具包:

https://github.com/crownpku/awesome-chinese-nlp#chinese-nlp-toolkits-%E4%B8%AD%E6%96%87nlp%E5%B7%A5%E5%85%B7

awesome-chinese-nlp

Awesome

A curated list of resources for NLP (Natural Language Processing) for Chinese

中文自然语言处理相关资料

图片来自复旦大学邱锡鹏教授

Contents 列表

1. Chinese NLP Toolkits 中文NLP工具

2. Corpus 中文语料

3. Organizations 相关中文NLP组织和会议

4. Learning Materials 学习资料

Chinese NLP Toolkits 中文NLP工具

Toolkits 综合NLP工具包

Popular NLP Toolkits for English/Multi-Language 常用的英文或支持多语言的NLP工具包

  • CoreNLP by Stanford (Java)

  • NLTK (Python)

  • spaCy (Python)

  • OpenNLP (Java)

  • gensim (Python) Gensim is a Python library for topic modelling, document indexing and similarity retrieval with large corpora.

Chinese Word Segment 中文分词

Information Extraction 信息提取

QA & Chatbot 问答和聊天机器人

Corpus 中文语料

Organizations 相关中文NLP组织和会议

Learning Materials 学习资料

FoolNLTK

https://github.com/rockyzhengwu/FoolNLTK

中文处理工具包

特点

  • 可能不是最快的开源中文分词,但很可能是最准的开源中文分词
  • 基于BiLSTM模型训练而成
  • 包含分词,词性标注,实体识别, 都有比较高的准确率
  • 用户自定义词典

Install

pip install foolnltk

使用说明

分词
import fool

text = "一个傻子在北京"
print(fool.cut(text))
# ['一个', '傻子', '在', '北京']

命令行分词

python -m fool [filename]
用户自定义词典

词典格式格式如下,词的权重越高,词的长度越长就越越可能出现, 权重值请大于1

难受香菇 10
什么鬼 10
分词工具 10
北京 10
北京天安门 10

加载词典

import fool
fool.load_userdict(path)
text = "我在北京天安门看你难受香菇"
print(fool.cut(text))
# ['我', '在', '北京天安门', '看', '你', '难受香菇']

删除词典

fool.delete_userdict();
词性标注
import fool

text = "一个傻子在北京"
print(fool.pos_cut(text))
#[('一个', 'm'), ('傻子', 'n'), ('在', 'p'), ('北京', 'ns')]
实体识别
import fool 

text = "一个傻子在北京"
words, ners = fool.analysis(text)
print(ners)
#[(5, 8, 'location', '北京')]

注意

  • Python2 暂时不支持是因为数据文件是pickle读取的,Python2和Python3不兼容,待修改
  • 有找不到模型文件的, 可以看下sys.prefix,一般默认为/usr/local/
  • 暂时只在Python3 Linux 平台测试通过

jieba

“结巴”中文分词:做最好的 Python 中文分词组件

"Jieba" (Chinese for "to stutter") Chinese text segmentation: built to be the best Python Chinese word segmentation module.

  • Scroll down for English documentation.

特点

  • 支持三种分词模式:

    • 精确模式,试图将句子最精确地切开,适合文本分析;
    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词

  • 支持自定义词典

  • MIT 授权协议

在线演示

http://jiebademo.ap01.aws.af.cm/

(Powered by Appfog)

网站代码:https://github.com/fxsjy/jiebademo

安装说明

代码对 Python 2/3 均兼容

  • 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
  • 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用

算法

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
  • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

主要功能

  1. 分词

  • jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
  • jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

代码示例

# encoding=utf-8
import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

输出:

【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】: 我/ 来到/ 北京/ 清华大学

【新词识别】:他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)

【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
  1. 添加自定义词典

载入词典

  • 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。

例如:

创新办 3 i
云计算 5
凱特琳 nz
台中

调整词典

  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

代码示例:

>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
>>> jieba.suggest_freq(('中', '将'), True)
494
>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
>>> jieba.suggest_freq('台中', True)
69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开
  1. 关键词提取

基于 TF-IDF 算法的关键词抽取

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

代码示例 (关键词提取)

https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py

关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

关键词一并返回关键词权重值示例

基于 TextRank 算法的关键词抽取

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例

算法论文: TextRank: Bringing Order into Texts

基本思想:

  1. 将待抽取关键词的文本进行分词
  2. 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
  3. 计算图中节点的PageRank,注意是无向带权图

使用示例:

见 test/demo.py

  1. 词性标注

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 用法示例
>>> import jieba.posseg as pseg
>>> words = pseg.cut("我爱北京天安门")
>>> for word, flag in words:
...    print('%s %s' % (word, flag))
...
我 r
爱 v
北京 ns
天安门 ns
  1. 并行分词

  • 原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升

  • 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows

  • 用法:

    • jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
    • jieba.disable_parallel() # 关闭并行分词模式
  • 例子:https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py

  • 实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。

  • 注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt

  1. Tokenize:返回词语在原文的起止位置

  • 注意,输入参数只接受 unicode
  • 默认模式
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和                start: 0                end:2
word 服装                start: 2                end:4
word 饰品                start: 4                end:6
word 有限公司            start: 6                end:10

  • 搜索模式
result = jieba.tokenize(u'永和服装饰品有限公司', mode='search')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和                start: 0                end:2
word 服装                start: 2                end:4
word 饰品                start: 4                end:6
word 有限                start: 6                end:8
word 公司                start: 8                end:10
word 有限公司            start: 6                end:10
  1. ChineseAnalyzer for Whoosh 搜索引擎

  1. 命令行分词

使用示例:python -m jieba news.txt > cut_result.txt

命令行选项(翻译):

使用: python -m jieba [options] filename

结巴命令行界面。

固定参数:
  filename              输入文件

可选参数:
  -h, --help            显示此帮助信息并退出
  -d [DELIM], --delimiter [DELIM]
                        使用 DELIM 分隔词语,而不是用默认的' / '。
                        若不指定 DELIM,则使用一个空格分隔。
  -p [DELIM], --pos [DELIM]
                        启用词性标注;如果指定 DELIM,词语和词性之间
                        用它分隔,否则用 _ 分隔
  -D DICT, --dict DICT  使用 DICT 代替默认词典
  -u USER_DICT, --user-dict USER_DICT
                        使用 USER_DICT 作为附加词典,与默认词典或自定义词典配合使用
  -a, --cut-all         全模式分词(不支持词性标注)
  -n, --no-hmm          不使用隐含马尔可夫模型
  -q, --quiet           不输出载入信息到 STDERR
  -V, --version         显示版本信息并退出

如果没有指定文件名,则使用标准输入。

--help 选项输出:

$> python -m jieba --help
Jieba command line interface.

positional arguments:
  filename              input file

optional arguments:
  -h, --help            show this help message and exit
  -d [DELIM], --delimiter [DELIM]
                        use DELIM instead of ' / ' for word delimiter; or a
                        space if it is used without DELIM
  -p [DELIM], --pos [DELIM]
                        enable POS tagging; if DELIM is specified, use DELIM
                        instead of '_' for POS delimiter
  -D DICT, --dict DICT  use DICT as dictionary
  -u USER_DICT, --user-dict USER_DICT
                        use USER_DICT together with the default dictionary or
                        DICT (if specified)
  -a, --cut-all         full pattern cutting (ignored with POS tagging)
  -n, --no-hmm          don't use the Hidden Markov Model
  -q, --quiet           don't print loading messages to stderr
  -V, --version         show program's version number and exit

If no filename specified, use STDIN instead.

延迟加载机制

jieba 采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。

import jieba
jieba.initialize()  # 手动初始化(可选)

在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:

jieba.set_dictionary('data/dict.txt.big')

例子: https://github.com/fxsjy/jieba/blob/master/test/test_change_dictpath.py

其他词典

  1. 占用内存较小的词典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small

  2. 支持繁体分词更好的词典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big

下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;或者用 jieba.set_dictionary('data/dict.txt.big')

其他语言实现

结巴分词 Java 版本

作者:piaolingxue 地址:https://github.com/huaban/jieba-analysis

结巴分词 C++ 版本

作者:yanyiwu 地址:https://github.com/yanyiwu/cppjieba

结巴分词 Node.js 版本

作者:yanyiwu 地址:https://github.com/yanyiwu/nodejieba

结巴分词 Erlang 版本

作者:falood 地址:https://github.com/falood/exjieba

结巴分词 R 版本

作者:qinwf 地址:https://github.com/qinwf/jiebaR

结巴分词 iOS 版本

作者:yanyiwu 地址:https://github.com/yanyiwu/iosjieba

结巴分词 PHP 版本

作者:fukuball 地址:https://github.com/fukuball/jieba-php

结巴分词 .NET(C#) 版本

作者:anderscui 地址:https://github.com/anderscui/jieba.NET/

结巴分词 Go 版本

系统集成

  1. Solr: https://github.com/sing1ee/jieba-solr

分词速度

  • 1.5 MB / Second in Full Mode
  • 400 KB / Second in Default Mode
  • 测试环境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt

常见问题

1. 模型的数据是如何生成的?

详见: https://github.com/fxsjy/jieba/issues/7

2. “台中”总是被切成“台 中”?(以及类似情况)

P(台中) < P(台)×P(中),“台中”词频不够导致其成词概率较低

解决方法:强制调高词频

jieba.add_word('台中') 或者 jieba.suggest_freq('台中', True)

3. “今天天气 不错”应该被切成“今天 天气 不错”?(以及类似情况)

解决方法:强制调低词频

jieba.suggest_freq(('今天', '天气'), True)

或者直接删除该词 jieba.del_word('今天天气')

4. 切出了词典中没有的词语,效果不理想?

解决方法:关闭新词发现

jieba.cut('丰田太省了', HMM=False) jieba.cut('我们中出了一个叛徒', HMM=False)

更多问题请点击:https://github.com/fxsjy/jieba/issues?sort=updated&state=closed

修订历史

https://github.com/fxsjy/jieba/blob/master/Changelog


 

SnowNLP: Simplified Chinese Text Processing

 

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

 

from snownlp import SnowNLP

s = SnowNLP(u'这个东西真心很赞')

s.words         # [u'这个', u'东西', u'真心',
                #  u'很', u'赞']

s.tags          # [(u'这个', u'r'), (u'东西', u'n'),
                #  (u'真心', u'd'), (u'很', u'd'),
                #  (u'赞', u'Vg')]

s.sentiments    # 0.9769663402895832 positive的概率

s.pinyin        # [u'zhe', u'ge', u'dong', u'xi',
                #  u'zhen', u'xin', u'hen', u'zan']

s = SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')

s.han           # u'「繁体字」「繁体中文」的叫法
                # 在台湾亦很常见。'

text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''

s = SnowNLP(text)

s.keywords(3)	# [u'语言', u'自然', u'计算机']

s.summary(3)	# [u'因而它是计算机科学的一部分',
                #  u'自然语言处理是一门融语言学、计算机科学、
				#	 数学于一体的科学',
				#  u'自然语言处理是计算机科学领域与人工智能
				#	 领域中的一个重要方向']
s.sentences

s = SnowNLP([[u'这篇', u'文章'],
             [u'那篇', u'论文'],
             [u'这个']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]

 

Features

 

  • 中文分词(Character-Based Generative Model
  • 词性标注(TnT 3-gram 隐马)
  • 情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决)
  • 文本分类(Naive Bayes)
  • 转换成拼音(Trie树实现的最大匹配)
  • 繁体转简体(Trie树实现的最大匹配)
  • 提取文本关键词(TextRank算法)
  • 提取文本摘要(TextRank算法)
  • tf,idf
  • Tokenization(分割成句子)
  • 文本相似(BM25
  • 支持python3(感谢erning

 

Get It now

 

$ pip install snownlp

 

关于训练

 

现在提供训练的包括分词,词性标注,情感分析,而且都提供了我用来训练的原始文件 以分词为例 分词在snownlp/seg目录下

 

from snownlp import seg
seg.train('data.txt')
seg.save('seg.marshal')
# from snownlp import tag
# tag.train('199801.txt')
# tag.save('tag.marshal')
# from snownlp import sentiment
# sentiment.train('neg.txt', 'pos.txt')
# sentiment.save('sentiment.marshal')

 

这样训练好的文件就存储为seg.marshal了,之后修改snownlp/seg/__init__.py里的data_path指向刚训练好的文件即可

 

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

 

目录

 

 

软件简介

 

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。

 

在线演示

 

THULAC在线演示平台thulac.thunlp.org/demo

 

编译和安装

 

  • C++版

      在当前路径下运行
      make
      会在当前目录下得到thulac和train_c
      (thulac需要模型的支持,需要将下载的模型放到当前目录下)
    
  • java版

      可直接按照分词程序命令格式运行可执行的jar包
      自行编译需要安装Gradle, 然后在项目根目录执行gradle build, 生成文件在build/libs下
    (thulac需要模型的支持,需要将下载的模型放到当前目录下)
    
  • python版(兼容python2.x和python3.x)

    1. 源代码下载

      将thulac文件放到目录下,通过 import thulac 来引用
      thulac需要模型的支持,需要将下载的模型放到thulac目录下。
    2. pip下载

      sudo pip install thulac
      通过 import thulac 来引用

 

使用方式

 

1.分词和词性标注程序

 

1.1.命令格式

 

  • C++版(接口调用参见1.5)

    • ./thulac [-t2s] [-seg_only] [-deli delimeter] [-user userword.txt] 从命令行输入输出
    • ./thulac [-t2s] [-seg_only] [-deli delimeter] [-user userword.txt] outputfile 利用重定向从文本文件输入输出(注意均为UTF8文本)
  • java版

    • java -jar THULAC_lite_java_run.jar [-t2s] [-seg_only] [-deli delimeter] [-user userword.txt] 从命令行输入输出
    • java -jar THULAC_lite_java_run.jar [-t2s] [-seg_only] [-deli delimeter] [-user userword.txt] -input input_file -output output_file 从文本文件输入输出(注意均为UTF8文本)
  • python版(兼容python2.x和python3.x)

    通过python程序import thulac,新建thulac.thulac(args)类,其中args为程序的参数。之后可以通过调用thulac.cut()进行单句分词。

    具体接口参数可查看python版接口参数

    代码示例

    代码示例1
    import thulac   
    
    thu1 = thulac.thulac()  #默认模式
    text = thu1.cut("我爱北京天安门", text=True)  #进行一句话分词
    print(text)
    代码示例2
    thu1 = thulac.thulac(seg_only=True)  #只进行分词,不进行词性标注
    thu1.cut_f("input.txt", "output.txt")  #对input.txt文件内容进行分词,输出到output.txt

 

1.2.通用参数(C++版、Java版)

 

-t2s                将句子从繁体转化为简体
-seg_only           只进行分词,不进行词性标注
-deli delimeter     设置词与词性间的分隔符,默认为下划线_
-filter             使用过滤器去除一些没有意义的词语,例如“可以”。
-user userword.txt  设置用户词典,用户词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码(python版暂无)
-model_dir dir      设置模型文件所在文件夹,默认为models/

 

1.3.Java版特有的参数

 

-input input_file   设置从文件读入,默认为命令行输入
-output output_file 设置输出到文件中,默认为命令行输出

 

1.4.python版接口参数

 

  • thulac(user_dict=None, model_path=None, T2S=False, seg_only=False, filt=False)初始化程序,进行自定义设置

    user_dict           设置用户词典,用户词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码
    T2S                 默认False, 是否将句子从繁体转化为简体
    seg_only            默认False, 时候只进行分词,不进行词性标注
    filt                默认False, 是否使用过滤器去除一些没有意义的词语,例如“可以”。
    model_path          设置模型文件所在文件夹,默认为models/
  • cut(文本, text=False) 对一句话进行分词

    text                默认为False, 是否返回文本,不返回文本则返回一个二维数组([[word, tag]..]),tag_only模式下tag为空字符。
  • cut_f(输入文件, 输出文件) 对文件进行分词

  • run() 命令行交互式分词(屏幕输入、屏幕输出)

 

1.5.C++版接口参数(需include "include/thulac.h")

 

  • 首先需要实例化THULAC类,然后可以调用以下接口:

    int init(const char* model_path = NULL, const char* user_path = NULL, int just_seg = 0, int t2s = 0, int ufilter = 0, char separator = '_');
    初始化程序,进行自定义设置

     

      user_path           设置用户词典,用户词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码
      t2s                 默认False, 是否将句子从繁体转化为简体
      just_seg            默认False, 时候只进行分词,不进行词性标注
      ufilter             默认False, 是否使用过滤器去除一些没有意义的词语,例如“可以”。
      model_path          设置模型文件所在文件夹,默认为models/
      separator           默认为‘_’, 设置词与词性之间的分隔符  
    

 

1.5.分词和词性标注模型的使用

 

THULAC需要分词和词性标注模型的支持,用户可以在下载列表中下载THULAC模型 Models_v1.zip,并放到THULAC的根目录即可,或者使用参数-model_dir dir指定模型的位置。

 

2.模型训练程序

 

THULAC工具包提供模型训练程序train_c,用户可以使用train_c训练获得THULAC的所需的模型。

 

2.1.命令格式

 

    ./train_c [-s separator] [-b bigram_threshold] [-i iteration] training_filename model_filename   
    使用training_filename为训练集,训练出来的模型名字为model_filename

 

2.2.参数意义

 

    -s              设置词与词性间的分隔符,默认为斜线/
    -b              设置二字串的阈值,默认为1
    -i              设置训练迭代的轮数,默认为15

 

2.3.训练集格式

 

我们使用默认的分隔符(斜线/)作为例子,训练集内容应为

 

    我/r 爱/vm 北京/ns 天安门/ns

 

类似的已经进行词性标注的句子。

 

若要训练出只分词的模型,使用默认的分隔符(斜线/)作为例子,训练集内容应为

 

    我/ 爱/ 北京/ 天安门/ 

 

类似的句子。

 

2.4.使用训练出的模型

 

将训练出来的模型覆盖原来models中的对应模型,之后执行分词程序即可使用训练出来的模型。

 

与代表性分词软件的性能对比

 

我们选择LTP-3.2.0 ICTCLAS(2015版) jieba(C++版)等国内具代表性的分词软件与THULAC做性能比较。我们选择Windows作为测试环境,根据第二届国际汉语分词测评(The Second International Chinese Word Segmentation Bakeoff)发布的国际中文分词测评标准,对不同软件进行了速度和准确率测试。

 

在第二届国际汉语分词测评中,共有四家单位提供的测试语料(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)

 

AlgorithmTimePrecisionRecallF-Measure
LTP-3.2.0 3.21s 0.867 0.896 0.881
ICTCLAS(2015版) 0.55s 0.869 0.914 0.891
jieba(C++版) 0.26s 0.814 0.809 0.811
THULAC_lite 0.62s 0.877 0.899 0.888

 

pku_test(510KB)

 

AlgorithmTimePrecisionRecallF-Measure
LTP-3.2.0 3.83s 0.960 0.947 0.953
ICTCLAS(2015版) 0.53s 0.939 0.944 0.941
jieba(C++版) 0.23s 0.850 0.784 0.816
THULAC_lite 0.51s 0.944 0.908 0.926

 

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

 

CNKI_journal.txt(51 MB)

 

AlgorithmTimeSpeed
LTP-3.2.0 348.624s 149.80KB/s
ICTCLAS(2015版) 106.461s 490.59KB/s
jieba(C++版) 22.558s 2314.89KB/s
THULAC_lite 42.625s 1221.05KB/s

 

词性标记集

 

通用标记集(适用于所有版本)

 

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

 

特殊标记集(适用于lite_v1_2版)

为了方便在分词和词性标注后的过滤,在v1_2版本,我们增加了两种词性,如果需要可以下载使用。

vm/能愿动词 vd/趋向动词

 

THULAC的不同配置

 

  1. 我们随THULAC源代码附带了简单的分词模型Model_1,仅支持分词功能。该模型由人民日报分词语料库训练得到。

  2. 我们随THULAC源代码附带了分词和词性标注联合模型Model_2,支持同时分词和词性标注功能。该模型由人民日报分词和词性标注语料库训练得到。

  3. 我们还提供更复杂、完善和精确的分词和词性标注联合模型Model_3和分词词表。该模型是由多语料联合训练训练得到(语料包括来自多文体的标注文本和人民日报标注文本等)。由于模型较大,如有机构或个人需要,请填写“资源申请表.doc”,并发送至 thunlp@gmail.com ,通过审核后我们会将相关资源发送给联系人。

 

获取链接

THULAC工具包分成两个部分组成。第一部分为算法源代码部分,可以通过网站上下载或者从github获取最新基础版代码,无需注册;第二部分为算法模型部分,THULAC需要分词和词性标注模型的支持,可以从2.算法模型注册后获得。

算法源代码lite版

 

SourceVersionDescriptionSizeDateDownload
THULAC_lite lite版 THULAC_lite分词源代码(C++版) 799KB 2017-04-11 download
THULAC_lite分词源代码(python版) 44KB 2017-04-11
THULAC_lite分词源代码(java版) 588KB 2017-01-13
THULAC_lite分词java版可执行的jar包 55KB 2017-04-11
THULAC模型,包括分词模型和词性标注模型(lite版) 58.2MB 2016-01-10
v1_2 THULAC_lite_v1_2分词源代码(C++版) 799KB 2017-04-11 download
THULAC_lite_v1_2分词源代码(java版) 588KB 2017-01-13
THULAC_lite_v1_2分词java版可执行的jar包 55KB 2017-04-11
THULAC模型,包括分词模型和词性标注模型(v1_2) 58.3MB 2016-07-10

 

2.算法源代码lite版(github)

 

SourceDescriptionLink
THULAC_lite_C++ THULAC_lite分词源代码(C++版) link
THULAC_lite_Python THULAC_lite分词源代码(python版) link
THULAC_lite_Java THULAC_lite分词源代码(java版) link
THULAC_lite.So THULAC_lite分词源代码(So版) link

 

3.算法模型

 

SourceDescriptionSizeDateDownload
THULAC_lite_Model THULAC模型,包括分词模型和词性标注模型(lite版) 58.2MB 2016-01-10 download
THULAC_pro_c++_v1.zip THULAC模型,包括更复杂完善的分词和词性标注模型以及分词词表 162MB 2016-01-10 download

 

注意事项

 

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

 

历史

 

更新时间更新内容
2017-01-17 在pip上发布THULAC分词python版本。
2016-10-10 增加THULAC分词so版本。
2016-03-31 增加THULAC分词python版本。
2016-01-20 增加THULAC分词Java版本。
2016-01-10 开源THULAC分词工具C++版本。

 

开源协议

 

  1. THULAC面向国内外大学、研究所、企业以及个人用于研究目的免费开放源代码。
  2. 如有机构或个人拟将THULAC用于商业目的,请发邮件至thunlp@gmail.com洽谈技术许可协议。
  3. 欢迎对该工具包提出任何宝贵意见和建议。请发邮件至thunlp@gmail.com。
  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(郭志芃,本科生), Junhua Ma (马骏骅,访问学生), Zhiyuan Liu(刘知远,助理教授).

 

常见问题

 

1.THULAC工具包提供的模型是如何得到的?

 

THULAC工具包随包附带的分词模型Model_1以及分词和词性标注模型Model_2是由人民日报语料库训练得到的。这份语料库中包含已标注的字数约为一千二百万字。

 

同时,我们还提供更复杂、完善和精确的分词和词性标注联合模型Model_3和分词词表。该模型是由多语料联合训练训练得到(语料包括来自多文体的标注文本和人民日报标注文本等)。这份语料包含已标注的字数约为五千八百万字。由于模型较大,如有机构或个人需要,请填写“资源申请表.doc”,并发送至 thunlp@gmail.com ,通过审核后我们会将相关资源发送给联系人。

 

2.能否提供工具包所带的模型的训练原始语料(如人民日报语料库)?

 

THULAC工具包中所带的模型的训练原始语料都是需要授权获得的。如果需要原始分词语料,如人民日报语料库,请联系北京大学计算语言学研究所授权获取。

 

YaYaNLP: Chinese Language Processing

 

YaYaNLP是一个纯python编写的中文自然语言处理包,取名于“牙牙学语”。 YaYaNLP提供以下功能:

 

  • 中文分词
  • 词性标注
  • 命名实体识别

 

  • 人名识别
  • 地名识别
  • 组织机构识别

 

  • 简繁转换

 

项目

 

项目主页:https://github.com/Tony-Wang/YaYaNLP

 

我的主页:www.huangyong.me

 

安装

 

直接下载源码包,解压后运行

 

python setup.py install

 

下载字典与模型文件

 

YaYaNLP使用了与HanLP兼容的字典数据,而编译后的字典数据保存的扩展名为.ya 可以直接从hanLP项目下载,data-for-1.2.4.zip

 

配置数据文件路径

 

在yaya/config.py修改自己的数据文件路径

 

DATA_ROOT = "/your/data/path"

 

特性

 

人名识别

 

    # 识别人名
    text = u"签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。"
    terms = segment.seg(text)
    print_terms(terms)

 

签约/vi
仪式/n
前/f
,/w
秦光荣/nr
、/w
李纪恒/nr
、/w
仇和/nr
等/udeng
一同/d
会见/v
了/ule
参加/v
签约/vi
的/ude1
企业家/nnt
。/w

 

歧意词识别

 

    # 识别歧意词
    text = u"龚学平等领导说,邓颖超生前杜绝超生"
    terms = segment.seg(text)
    print_terms(terms)

 

龚学平/nr
等/udeng
领导/n
说/v
,/w
邓颖超/nr
生前/t
杜绝/v
超生/vi

 

地名识别

 

    # 识别地名
    text = u"蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机"
    terms = segment.seg(text)
    print_terms(terms)

 

蓝翔/nt
给/p
宁夏/ns
固原市/ns
彭阳县/ns
红河镇/ns
黑牛沟村/ns
捐赠/v
了/ule
挖掘机/n

 

组织名识别

 

    # 组织名识别
    text = u"济南杨铭宇餐饮管理有限公司是由杨先生创办的餐饮企业"
    terms = segment.seg(text)
    print_terms(terms)

 

济南杨铭宇餐饮管理有限公司/nt
是/vshi
由/p
杨先生/nr
创办/v
的/ude1
餐饮企业/nz

 

简繁转换

 

    # 简繁转换
    text = u"以后等你当上皇后,就能买草莓庆祝了"
    print segment.simplified_to_traditional(text)

 

以後等妳當上皇后,就能買士多啤梨慶祝了

 

    # 繁简转换
    text = u"用筆記簿型電腦寫程式HelloWorld"
    print segment.traditional_to_simplified(text)

 

用笔记本电脑写程序HelloWorld

 

感谢

 

本项目参考了hanck/HanLP项目实现原理并使用了该项目的字典和模型文件。

 

版权

 

  • Apache License Version 2.0
  • 任何使用了YaYaNLP的全部或部分功能、词典、模型的项目、产品或文章等形式的成果必须显式注明YaYaNLP及此项目主页

    Chinese-Annotator

    Join the chat at https://gitter.im/Chinese-Annotator/Lobby Build Status License

    Annotator for Chinese Text Corpus

    Many NLP tasks require lots of labelling data. Current annotators are mostly for English. We want to develop a Chinese Annotator based on existing open source technologies.

    Chinese-Annotator Gitter聊天室

    欢迎一起加入讨论。

    Project Allignment

    .
    ├── config                  # System config files
    ├── docs                    # Documentations
    ├── tests                   # Test cases
    │   └── data                # Raw data for tests
    ├── chi_annotator           # Main project folder
    │   ├── algo_factory        # Algo Factory module containing general algorithms
    │       ├── preprocess      # Preprocess codes
    │       ├── online          # Online Algorithms for Active Learning (svm for now)
    │       └── offline         # Offline Algorithms for higher Accuracy (DL models)
    │   ├── task_center         # Task Center module (main entrance and logic control)
    │   ├── webui               # WebUI module
    │       ├── apis
    │       └── static
    │   ├── data                # Database module
    │   └── user_instance       # User Instance module holding config files for specific tasks
    │       └── examples        # User Instance examples
    |           ├── classify    # Text Classfication
    |           ├── ner         # Named Entity Recognition
    |           ├── pos_tagger  # POS Tagger
    |           └── re          # Relation Extraction
    └── ...
    
    

    构想:中文文本标注工具

    自然语言处理的大部分任务是监督学习问题。序列标注问题如中文分词、命名实体识别,分类问题如关系识别、情感分析、意图分析等,均需要标注数据进行模型训练。深度学习大行其道的今天,基于深度学习的NLP模型更是数据饥渴。

    最前沿的NLP技术往往首先针对英文语料。英文NLP的生态很好,针对不同有意思的问题都有不少大规模语料公开供大家研究,如斯坦福的SQuAD阅读理解语料。中文方面开源语料就少得多,各种英文NLP上的犀利模型和前沿技术都因为中文语料的匮乏很难迁移过来。另一方面,对于一些垂直领域,如医疗、金融、法律、公安等等,专有名词和特有需求甚多,很难将比较general的比如在wikipedia dump上面训练的模型直接拿过来用。

    传统人工标注数据的过程往往是繁琐和低效率的。刚标了一个“联想”是公司名,又来一个“联想集团”,再标一次又来一个“联想集团有限公司”,如此的例子令标注过程含有大量的重复劳动。另一方面也没有一个易上手的标注UI,标注工作者往往需要直接按预先定好的格式直接在写字板之类的软件中修改原始数据,格式错误率也较高。

    能不能构建一个中文文本的标注工具,可以达到以下两个特点:

    1. 标注过程背后含有智能算法,将人工重复劳动降到最低;

    2. 标注界面显而易见地友好,让标注操作尽可能简便和符合直觉。

    答案是可以的。事实上很多标注工具已经做到了这一点,最先进的如Explosion.ai的Prodigy;然而开发了著名的NLP开源包Spacy的explosion.ai选择了将Prodigy闭源,而Spacy支持中文也仍然遥遥无期。我们希望构建一个开源的中文文本标注工具,而本文很多的技术灵感正是来自Prodigy文档

    主动学习的智能标注算法

    流程:

    1. 用户标一个label

    2. 主动学习的后台算法分为online和offline部分。online部分即时更新模型,可使用诸如SVM、bag of words等尽可能快的传统方法;offline部分当标注数据积累到一定数量时更新模型,可使用准确度较高的深度学习模型。

    3. 模型更新后,对尽可能多的example做预测,将确信度排序,取确信度最低的一个example作为待标注例子。重复1的过程。

    可以想象如果模型训练得好的话,这个过程将直接忽略掉确信度最大的那些例子,而把所有重点放在分类边界上的那些确信度小的例子。这样可以尽算法所能减少用户端的人工工作量。

    online与offline模型互相协作,与用户手动标注的过程一起不断迭代;在最终标注任务完成之后,offline模型可以重新在所有标注数据上重新训练,以达到最好的模型效果。

    显而易见的友好标注前端

    用户标注的界面应该尽可能符合直觉,让用户完全聚焦在当前的标注任务上。

    Prodigy给了一个非常好的demo,每一次的标注只需要用户解决一个case的问题。以文本分类为例,对于算法给出的分类结果,只需要点击“正确”提供正样本,“错误”提供负样本,“略过”将不相关的信息滤除,“Redo”让用户撤回操作,四个功能键以最简模式让用户进行标注操作。

    真正应用中,应该还要加入一个用户自己加入标注的交互方式,比如用户可以高亮一个词然后选择是“公司”,或者链接两个实体选择他们的关系等等。

    以上是个人觉得的一个智能中文文本标注工具的最大亮点。算法本身还有很多细节需要思考,比如online机器学习算法与offline深度学习算法的协作、中文NLP的特征提取与模型构建、正则规则的引入、word embedding的训练和使用等等。系统本身还要考虑后台存储(SQLite?)和数据导入导出,前端框架选型和开发,前后端交互(django? flask? RestAPI?)等等的问题。下面是Prodigy的简单架构图。

    我们希望专注于中文文本标注的功能。前期我们想实现三种中文NLP任务的标注工具:中文命名实体识别,中文关系识别,中文文本分类。未来如果有更多如中文图片问答、中文图片描述之类的任务,我们可以再研究加入图片标注这一块。

    希望这个工具的开发会是以中文社区的开源协作方式,为整个中文NLP的开源生态做出一点贡献。

posted @ 2017-12-29 10:42  tutu_python  阅读(3706)  评论(0编辑  收藏  举报