中文文本处理简要介绍

标签: 数据分析 数据挖掘与机器学习 统计软件 软件应用 NLP | 发表时间:2016-01-07 03:50 | 作者:COS编辑部
出处:http://cos.name

本文作者李绳,博客地址 http://acepor.github.io/。作者自述:

一位文科生曾励志成为语言学家
出国后阴差阳错成了博士候选人
三年后交完论文对学术彻底失望
回国后误打误撞成了数据科学家

作为一个处理自然语言数据的团队,我们在日常工作中要用到不同的工具来预处理中文文本,比如 Jieba Stanford NLP software。出于准确性和效率的考虑,我们选择了Stanford NLP software, 所以本文将介绍基于 Stanford NLP software 的中文文本预处理流程。

中文文本处理简要介绍

与拉丁语系的文本不同,中文并不使用空格作为词语间的分隔符。比如当我们说“We love coding.”,这句英文使用了两个空格来分割三个英文词汇;如果用中文做同样的表述, 就是“我们爱写代码。”,其中不包含任何空格。因而,处理中文数据时,我们需要进行分词,而这恰恰时中文自然语言处理的一大难点。

下文将介绍中文文本预处理的几个主要步骤:

  1. 中文分词
  2. 标注词性
  3. 生成词向量
  4. 生成中文依存语法树

Stanford NLP software 简要介绍

Stanford NLP software 是一个较大的工具合集:包括  Stanford POS tagger 等组件,也有一个包含所有组件的合集  Stanford CoreNLP。各个组件是由不同的开发者开发的,所以每一个工具都有自己的语法。当我们研究这些组件的文档时,遇到了不少问题。下文记录这些问题和相对应的对策,以免重蹈覆辙。

Stanford NLP 小组提供了一个简明的FAQ—— Stanford Parser FAQ 和一份详细的Java文档 —— Stanford JavaNLP API Documentation。在这两份文档中,有几点格外重要:

尽管PSFG分词器小且快,Factored分词器更适用于中文,所以我们推荐使用后者。

中文分词器默认使用GB18030编码(Penn Chinese Treebank的默认编码)。

使用 -encoding 选项可以指定编码,比如 UTF-8,Big-5 或者 GB18030。

中文预处理的主要步骤

1. 中文分词

诚如上面所言,分词是中文自然语言处理的一大难题。 Stanford Word Segmenter 是专门用来处理这一问题的工具。FAQ请参见 Stanford Segmenter FAQ。具体用法如下:

  bash -x segment.sh ctb INPUT_FILE UTF-8 0

其中 ctb 是词库选项,即 Chinese tree bank,也可选用 pku,即 Peking University。 UTF-8是输入文本的编码,这个工具也支持 GB18030 编码。最后的0指定 n-best list 的大小,0表示只要最优结果。

2. 中文词性标注

词性标注是中文处理的另一大难题。我们曾经使用过 Jieba 来解决这个问题,但效果不尽理想。Jieba 是基于词典规则来标注词性的,所以任意一个词在 Jieba 里有且只有一个词性。如果一个词有一个以上的词性,那么它的标签就变成了一个集合。比如“阅读”既可以表示动词,也可以理解为名词,Jieba 就会把它标注成 n(名词),而不是根据具体语境来给出合适的 v(动词)或 n(名词)的标签。这样一来,标注的效果就大打折扣。幸好 Stanford POS Tagger 提供了一个根据语境标注词性的方法。具体用法如下:

  java -mx3000m -cp "./*" edu.stanford.nlp.tagger.maxent.MaxentTagger -model models/chinese-distsim.tagger -textFile INPUT_FILE

-mx3000m 指定内存大小,可以根据自己的机器配置选择。 edu.stanford.nlp.tagger.maxent.MaxentTagger 用于选择标注器,这里选用的是一个基于最大熵(Max Entropy)的标注器。 models/chinese-distsim.tagger 用于选择分词模型。

3. 生成词向量

深度学习是目前机器学习领域中最热门的一个分支。而生成一个优质的词向量是利用深度学习处理 NLP 问题的一个先决条件。除了 Google 的 Word2vec,Stanford NLP 小组提供了另外一个选项—— GLOVE

使用Glove也比较简单,下载并解压之后,只要对里面的 demo.sh 脚本进行相应修改,然后执行这个脚本即可。

CORPUS=text8                                    # 设置输入文件路径
VOCAB_FILE=vocab.txt                            # 设置输入词汇路径
COOCCURRENCE_FILE=cooccurrence.bin              
COOCCURRENCE_SHUF_FILE=cooccurrence.shuf.bin
BUILDDIR=build
SAVE_FILE=vectors                               # 设置输入文件路径
VERBOSE=2           
MEMORY=4.0                                      # 设置内存大小
VOCAB_MIN_COUNT=5                               # 设置词汇的最小频率
VECTOR_SIZE=50                                  # 设置矩阵维度
MAX_ITER=15                                     # 设置迭代次数
WINDOW_SIZE=15                                  # 设置词向量的窗口大小
BINARY=2
NUM_THREADS=8
X_MAX=10

4. 生成中文依存语法树

文本处理有时需要比词性更丰富的信息,比如句法信息,Stanford NLP 小组提供了两篇论文: The Stanford Parser: A statistical parserNeural Network Dependency Parser,并在这两篇论文的基础上开发了两个工具,可惜效果都不太理想。前者的处理格式是正确的中文依存语法格式,但是速度极慢(差不多一秒一句);而后者虽然处理速度较快,但生成的格式和论文 Discriminative reordering with Chinese grammatical relations features – acepor中的完全不一样。我们尝试了邮件联系论文作者和工具作者,并且在 Stackoverflow 上提问,但这个问题似乎无解。

尽管如此,我们还是把两个方案都记录在此:

  java -cp "*:." -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLP -file INPUT_FILE -props StanfordCoreNLP-chinese.properties -outputFormat text -parse.originalDependencies
  java -cp "./*" edu.stanford.nlp.parser.nndep.DependencyParser -props nndep.props -textFile INPUT_FILE -outFile OUTPUT_FILE

结论

预处理中文文本并非易事,Stanford NLP 小组对此作出了极大的贡献。我们的工作因而受益良多,所以我们非常感谢他们的努力。当然我们也期待 Stanford NLP software 能更上一层楼。

本文原载于 https://acepor.github.io/2015/12/17/General-Pipelines/

您可能也喜欢:

LDA-math-文本建模

LDA-math-LDA 文本建模

上海R用户沙龙会议纪要(Jan 20, 2013 @联合创业办公社)

十八般武艺,谁主天下?

COS沙龙第30期(北京)纪要
无觅

相关 [中文 文本] 推荐:

中文文本处理简要介绍

- - 统计之都
本文作者李绳,博客地址 http://acepor.github.io/. 一位文科生曾励志成为语言学家. 出国后阴差阳错成了博士候选人. 三年后交完论文对学术彻底失望. 回国后误打误撞成了数据科学家. 作为一个处理自然语言数据的团队,我们在日常工作中要用到不同的工具来预处理中文文本,比如 Jieba 和 Stanford NLP software.

python 中文文本分类 - CSDN博客

- -
3,结构化表示--构建词向量空间. 即已经分好类的文本资料(例如:语料库里是一系列txt文章,这些文章按照主题归入到不同分类的目录中,如 .\art\21.txt). 推荐语料库:复旦中文文本分类语料库,下载链接:http://download.csdn.net/detail/github_36326955/9747927.

EmEditor简体中文便携版:强大文本编辑器

- - 精品绿色便携软件
EmEditor Professional以运行轻巧、敏捷而又功能强大、丰富著称,作为简单好用的文本编辑器, EmEditor支持多种配置,可自定义颜色、字体、工具栏、快捷键、行距等,支持文本列块选择、无限撤消/重做等,是 替代记事本的最佳编辑器. 我最近一直在用EmEditor,其便携性很适合影子系统, 标签窗口也是极方便操作,现提供 EmEditor 11.0.3中文便携版,分别为EmEditor 32位和64位版.

Ekho 5.8.2 发布,中文文本转语音

- - 开源中国社区最新新闻
主要修改:改进对数字、时间、日期的朗读. 涉及平台:Linux、Android(粤语版). 下载地址: https://sourceforge.net/projects/e-guidedog/files/Ekho/5.8.2/. 软件首页: http://www.eguidedog.net/ekho.php.

清空上传文本框中文件路径值

- - JavaScript - Web前端 - ITeye博客
今天工作时,遇到了一个问题:需要将上传文件的input框中的值清空,在上传文件保存成功之后,(上传控件在IE浏览器下有input框)在IE浏览器下input框中依然还显示刚刚上传文件的路径,尝试着使用普通文本框清空的方法去做,但是起不到效果. 后来在网上看到需要将原有的标签用新的标签替换就行了.  这样保存完信息后,同时刚刚input框中文件的路径值就消失了~~.

[原]PySpark NaiveBayes算法之中文文本分类测试

- - moxiaomomo的专栏
假设现在有N行文本,每行文本的第一列已经打好标签, Y 或 N, 用于标识该行文本是否包含敏感词汇;第二列之后的每一列是对某些句子或文本进行中文分词之后的词汇. N 朴素贝叶斯算法 是 生成模型 中 最经典 分类算法 之一 Y 这是 一条 包含 色情 的 语句. 我们现在用pyspark结合NaiveBayes分类算法来进行训练和测试,这个过程大概包括:.

Evernote iPhone, iPad App 關鍵更新,中文介面與支援富文本編輯

- Amo - 電腦玩物
開場白還是那句老話:Evernote是我個人慣用的數位筆記本. 接著,繼之前「Evernote Android 關鍵更新,支援富文本編輯與桌面預覽便利貼」後,今天Evernote的iOS App也進行了一番大改造,其中最關鍵的新功能,就是繼Android版本後,現在iPhone、iPad上的Evernote也可以擁有富文本編輯工具列,並且擁有中文介面了.

GitHub - letiantian/TextRank4ZH: 从中文文本中自动提取关键词和摘要

- -
TextRank算法可以用来从文本中提取关键词和摘要(重要的句子). TextRank4ZH是针对中文文本的TextRank算法的python算法实现. Python 3下需要将上面的python改成python3,pip改成pip3. 在Python 2.7.9和Python 3.4.3中测试通过.

word2vec词向量训练及中文文本相似度计算 - CSDN博客

- -
本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助. 参考:《Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年》.           《Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学2014年》.           《Word2vec对中文词进行聚类的研究 · 郑文超,徐鹏 · 北京邮电大学2013年》.

浅谈中文文本自动纠错在影视剧搜索中应用与Java实现

- - 博客园_首页
  这周由于项目需要对搜索框中输入的错误影片名进行校正处理,以提升搜索命中率和用户体验,研究了一下中文文本自动纠错(专业点讲是校对,proofread),并初步实现了该功能,特此记录.   中文输入错误的校对与更正是指在输入不常见或者错误文字时系统提示文字有误,最简单的例子就是在word里打字时会有红色下划线提示.