今天总结一下自然语言处理之词性标注,后附现有比较好的开源实现工具(基于python实现包)~~~
词性定义
-
百度百科定义:词性指以词的特点作为划分词类的根据。词类是一个语言学术语,是一种语言中词的语法分类,是以语法特征(包括句法功能和形态变化)为主要依据、兼顾词汇意义对词进行划分的结果。
-
维基百科定义:In traditional grammar, a part of speech (abbreviated form: PoS or POS) is a category of words (or, more generally, of lexical items) which have similar grammatical properties.
-
从组合和聚合关系来说,一个词类是指:在一个语言中,众多具有相同句法功能、能在同样的组合位置中出现的词,聚合在一起形成的范畴。词类是最普遍的语法的聚合。词类划分具有层次性。如汉语中,词可以分成实词和虚词,实词中又包括体词、谓词等,体词中又可以分出名词和代词等。
词性标注就是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程,这也是自然语言处理中一项非常重要的基础性工作,所有对于词性标注的研究已经有较长的时间,在研究者长期的研究总结中,发现汉语词性标注中面临了许多棘手的问题。
中文词性标注的难点
-
汉语是一种缺乏词形态变化的语言,词的类别不能像印欧语那样,直接从词的形态变化上来判别。
-
常用词兼类现象严重。《现代汉语八百词》收取的常用词中,兼类词所占的比例高达22.5%,而且发现越是常用的词,不同的用法越多。由于兼类使用程度高,兼类现象涉及汉语中大部分词类,因而造成在汉语文本中词类歧义排除的任务量大。
-
研究者主观原因造成的困难。语言学界在词性划分的目的、标准等问题上还存在分歧。目前还没有一个统的被广泛认可汉语词类划分标准,词类划分的粒度和标记符号都不统一。词类划分标准和标记符号集的差异,以及分词规范的含混性,给中文信息处理带来了极大的困难。
词性标注常见方法
基于规则的词性标注方法
-
基于规则的词性标注方法是人们提出较早的一种词性标注方法,其基本思想是按兼类词搭配关系和上下文语境建造词类消歧规则。早期的词类标注规则一般由人工构建。
-
随着标注语料库规模的增大,可利用的资源也变得越来越多,这时候以人工提取规则的方法显然变得不现实,于是乎,人们提出了基于机器学习的规则自动提出方法。
import nltk nltk.download("punkt") nltk.download("averaged_perceptron_tagger") nltk.download('tagsets') s = "i enjoy playing the piano" tokens = nltk.word_tokenize(s) tags = nltk.pos_tag(tokens) print(tags)
基于统计模型的词性标注方法(又称为基于随机的词性标注法)
-
统计方法将词性标注看作是一个序列标注问题。其基本思想是:给定带有各自标注的词的序列,我们可以确定下一个词最可能的词性。
-
现在已经有隐马尔可夫模型(HMM)或条件随机域(CRF)等统计模型了,这些模型可以使用有标记数据的大型语料库进行训练,而有标记的数据则是指其中每一个词都分配了正确的词性标注的文本。
- 单元法或词频法:如对于beaut会被看做美丽的模糊形式,所以词性标注器会把beaut标记为形容词。
- N元法:就是对于某个单词会考虑到前面n个单词的词性,最流行的n元标注器被称为维特比算法,该算法hmm和crf都有用到
基于统计方法与规则方法相结合的词性标注方法
-
理性主义方法与经验主义相结合的处理策略一直是自然语言处理领域的专家们不断研究和探索的问题,对于词性标注问题当然也不例外。
-
这类方法的主要特点在于对统计标注结果的筛选,只对那些被认为可疑的标注结果,才采用规则方法进行歧义消解,而不是对所有情况都既使用统计方法又使用规则方法。
基于深度学习的词性标注方法
- 可以当作序列标注的任务来做,目前深度学习解决序列标注任务常用方法包括LSTM+CRF、BiLSTM+CRF等。
**词性标注任务数据集 **
- 人民日报1998词性标注数据集:https://pan.baidu.com/s/1fW908EQmyMv0XB5i0DhVyQ
import spacy nlp = spacy.load('en_core_web_sm') doc = nlp(u"ans so i said i'm going to play the piano for the paly tonight") for token in doc: print(doc.text,token.pos_,token.tag_)
分块标记
分块就是根据句子中的词和词性,按照某种规则组合在一起形成一个个分块,每个分块代表一个实体。常见的实体包括:组织、人员、地点、日期、时间等
以上面的例子为例,首先我们做名词短语分块(NP-chunking),比如:技术问题。名词短语分块通过词性标记和一些规则就可以识别出来,也可以通过机器学习的方法识别
除了名词短语分块还有很多其他分块:介词短语(PP,比如:以我……)、动词短语(VP,比如:打人)、句子(S,我是人)
import nltk rule = r"""Noun Phrase:{<DT>?<JJ>*<NN>}""" chunkparse = nltk.RegexpParser(rule) chunked = chunkparse.parse(nltk.pos_tag(nltk.word_tokenize("and so i said i am going to play the piano tonight for the play tonight"))) chunked.draw() print(chunked)
加缝是把分块的内容提取出来其他的内容认为不重要被忽视
如下面的代码是提取名词
import nltk rule = r"""Chink: {<.*>+} }<VB.?|CC|RB|JJ|IN|DT|TO|>+{""" chunkparse = nltk.RegexpParser(rule) chunked = chunkparse.parse(nltk.pos_tag(nltk.word_tokenize("and so i said i am going to play the piano tonight for the play tonight"))) chunked.draw() print(chunked)
词性标注工具推荐
-
Jieba:“结巴”中文分词:做最好的 Python 中文分词组件,可以进行词性标注。
Github地址:https://github.com/fxsjy/jieba
-
SnowNLP:SnowNLP是一个python写的类库,可以方便的处理中文文本内容。
Github地址:https://github.com/isnowfy/snownlp
-
THULAC:THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。
Github地址:https://github.com/thunlp/THULAC
-
StanfordCoreNLP:斯坦福的,具备各种nlp功能,包括词性标注。
-
Hanlp:HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。
Github地址:https://github.com/hankcs/pyhanlp
-
NLTK:NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。
Github地址:https://github.com/nltk/nltk
-
SpaCy:工业级的自然语言处理工具,遗憾的是不支持中文。
最新研究进展看这里:https://github.com/sebastianruder/NLP-progress/blob/master/english/part-of-speech_tagging.md
本文转自:tps://www.jianshu.com/p/940464a662b0