十-词性标注与关键词提取
想要做到和人聊天,首先得先读懂对方在说什么,所以问句解析是整个聊天过程的第一步,问句解析是一个涉及知识非常全面的过程,几乎涵盖了自然语言处理的全部,本节让我们尝试一下如何分析一个问句
问句解析的过程¶
一般问句解析需要进行分词、词性标注、命名实体识别、关键词提取、句法分析以及查询问句分类等。这些事情我们从头开始做无非是重复造轮子,傻子才会这么做,人之所以为人是因为会使用工具。网络上有关中文的NLP工具有很多,介绍几个不错的:
第一个要数哈工大的LTP(语言技术平台)了,它可以做中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术
第二个就是博森科技了,它除了做中文分词、词性标注、命名实体识别、依存文法之外还可以做情感分析、关键词提取、新闻分类、语义联想、时间转换、新闻摘要等,但因为是商业化的公司,除了分词和词性标注免费之外全都收费
第三个就是jieba分词,这个开源小工具分词和词性标注做的挺不错的,但是其他方面还欠缺一下,如果只是中文分词的需求完全可以满足
第四个就是中科院张华平博士的NLPIR汉语分词系统,也能支持关键词提取
我们优先选择NLPIR
NLPIR使用¶
文档在http://pynlpir.readthedocs.io/en/latest/
首先安装pynlpir库
1 | pip install pynlpir |
写个小程序测试一下分词效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # coding:utf-8 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import pynlpir pynlpir.open() s = '聊天机器人到底该怎么做呢?' segments = pynlpir.segment(s) for segment in segments: print segment[0], '\t', segment[1] pynlpir.close() |
执行效果如下:
1 2 3 4 5 6 7 8 | 聊天 verb 机器人 noun 到底 adverb 该 verb 怎么 pronoun 做 verb 呢 modal particle ? punctuation mark |
下面我们再继续试下关键词提取效果:
1 2 3 | key_words = pynlpir.get_key_words(s, weighted=True) for key_word in key_words: print key_word[0], '\t', key_word[1] |
输出如下:
1 2 | 聊天 2.0 机器人 2.0 |
从这个小程序来看,分词和关键词提取效果很好
下面我们再来试验一个,这一次我们把分析功能全打开,部分代码如下:
1 2 | s = '海洋是如何形成的' segments = pynlpir.segment(s, pos_names='all') |
执行后效果如下:
1 2 3 4 5 6 7 | 海洋 noun 是 verb:verb 是 如何 pronoun:interrogative pronoun:predicate interrogative pronoun 形成 verb 的 particle:particle 的/底 海洋 2.0 形成 2.0 |
如果我们把segments在加上一个参数pos_english=False,也就是不使用英语,那么输出就是
1 2 3 4 5 6 7 | 海洋 名词 是 动词:动词"是" 如何 代词:疑问代词:谓词性疑问代词 形成 动词 的 助词:的/底 海洋 2.0 形成 2.0 |
解释一下¶
这里的segment是切词的意思,返回的是tuple(token, pos),其中token就是切出来的词,pos就是语言属性
调用segment方法指定的pos_names参数可以是'all', 'child', 'parent',默认是parent, 表示获取该词性的最顶级词性,child表示获取该词性的最具体的信息,all表示获取该词性相关的所有词性信息,相当于从其顶级词性到该词性的一条路径
词性分类表¶
查看nlpir的源代码中的pynlpir/docs/pos_map.rst,可以看出全部词性分类及其子类别如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | POS_MAP = { 'n': ('名词', 'noun', { 'nr': ('人名', 'personal name', { 'nr1': ('汉语姓氏', 'Chinese surname'), 'nr2': ('汉语名字', 'Chinese given name'), 'nrj': ('日语人名', 'Japanese personal name'), 'nrf': ('音译人名', 'transcribed personal name') }), 'ns': ('地名', 'toponym', { 'nsf': ('音译地名', 'transcribed toponym'), }), 'nt': ('机构团体名', 'organization/group name'), 'nz': ('其它专名', 'other proper noun'), 'nl': ('名词性惯用语', 'noun phrase'), 'ng': ('名词性语素', 'noun morpheme'), }), 't': ('时间词', 'time word', { 'tg': ('时间词性语素', 'time morpheme'), }), 's': ('处所词', 'locative word'), 'f': ('方位词', 'noun of locality'), 'v': ('动词', 'verb', { 'vd': ('副动词', 'auxiliary verb'), 'vn': ('名动词', 'noun-verb'), 'vshi': ('动词"是"', 'verb 是'), 'vyou': ('动词"有"', 'verb 有'), 'vf': ('趋向动词', 'directional verb'), 'vx': ('行事动词', 'performative verb'), 'vi': ('不及物动词', 'intransitive verb'), 'vl': ('动词性惯用语', 'verb phrase'), 'vg': ('动词性语素', 'verb morpheme'), }), 'a': ('形容词', 'adjective', { 'ad': ('副形词', 'auxiliary adjective'), 'an': ('名形词', 'noun-adjective'), 'ag': ('形容词性语素', 'adjective morpheme'), 'al': ('形容词性惯用语', 'adjective phrase'), }), 'b': ('区别词', 'distinguishing word', { 'bl': ('区别词性惯用语', 'distinguishing phrase'), }), 'z': ('状态词', 'status word'), 'r': ('代词', 'pronoun', { 'rr': ('人称代词', 'personal pronoun'), 'rz': ('指示代词', 'demonstrative pronoun', { 'rzt': ('时间指示代词', 'temporal demonstrative pronoun'), 'rzs': ('处所指示代词', 'locative demonstrative pronoun'), 'rzv': ('谓词性指示代词', 'predicate demonstrative pronoun'), }), 'ry': ('疑问代词', 'interrogative pronoun', { 'ryt': ('时间疑问代词', 'temporal interrogative pronoun'), 'rys': ('处所疑问代词', 'locative interrogative pronoun'), 'ryv': ('谓词性疑问代词', 'predicate interrogative pronoun'), }), 'rg': ('代词性语素', 'pronoun morpheme'), }), 'm': ('数词', 'numeral', { 'mq': ('数量词', 'numeral-plus-classifier compound'), }), 'q': ('量词', 'classifier', { 'qv': ('动量词', 'verbal classifier'), 'qt': ('时量词', 'temporal classifier'), }), 'd': ('副词', 'adverb'), 'p': ('介词', 'preposition', { 'pba': ('介词“把”', 'preposition 把'), 'pbei': ('介词“被”', 'preposition 被'), }), 'c': ('连词', 'conjunction', { 'cc': ('并列连词', 'coordinating conjunction'), }), 'u': ('助词', 'particle', { 'uzhe': ('着', 'particle 着'), 'ule': ('了/喽', 'particle 了/喽'), 'uguo': ('过', 'particle 过'), 'ude1': ('的/底', 'particle 的/底'), 'ude2': ('地', 'particle 地'), 'ude3': ('得', 'particle 得'), 'usuo': ('所', 'particle 所'), 'udeng': ('等/等等/云云', 'particle 等/等等/云云'), 'uyy': ('一样/一般/似的/般', 'particle 一样/一般/似的/般'), 'udh': ('的话', 'particle 的话'), 'uls': ('来讲/来说/而言/说来', 'particle 来讲/来说/而言/说来'), 'uzhi': ('之', 'particle 之'), 'ulian': ('连', 'particle 连'), }), 'e': ('叹词', 'interjection'), 'y': ('语气词', 'modal particle'), 'o': ('拟声词', 'onomatopoeia'), 'h': ('前缀', 'prefix'), 'k': ('后缀' 'suffix'), 'x': ('字符串', 'string', { 'xe': ('Email字符串', 'email address'), 'xs': ('微博会话分隔符', 'hashtag'), 'xm': ('表情符合', 'emoticon'), 'xu': ('网址URL', 'URL'), 'xx': ('非语素字', 'non-morpheme character'), }), 'w': ('标点符号', 'punctuation mark', { 'wkz': ('左括号', 'left parenthesis/bracket'), 'wky': ('右括号', 'right parenthesis/bracket'), 'wyz': ('左引号', 'left quotation mark'), 'wyy': ('右引号', 'right quotation mark'), 'wj': ('句号', 'period'), 'ww': ('问号', 'question mark'), 'wt': ('叹号', 'exclamation mark'), 'wd': ('逗号', 'comma'), 'wf': ('分号', 'semicolon'), 'wn': ('顿号', 'enumeration comma'), 'wm': ('冒号', 'colon'), 'ws': ('省略号', 'ellipsis'), 'wp': ('破折号', 'dash'), 'wb': ('百分号千分号', 'percent/per mille sign'), 'wh': ('单位符号', 'unit of measure sign'), }), } |
好,这回我们一下子完成了分词、词性标注、关键词提取。命名实体识别、句法分析以及查询问句分类我们之后再研究