十、半个小时搞定词性标注与关键词提取

想要做到和人聊天,首先得先读懂对方在说什么,所以问句解析是整个聊天过程的第一步,问句解析是一个涉及知识非常全面的过程,几乎涵盖了自然语言处理的全部,本节让我们尝试一下如何分析一个问句

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

问句解析的过程

一般问句解析需要进行分词、词性标注、命名实体识别、关键词提取、句法分析以及查询问句分类等。这些事情我们从头开始做无非是重复造轮子,傻子才会这么做,人之所以为人是因为会使用工具。网络上有关中文的NLP工具有很多,介绍几个不错的:

第一个要数哈工大的LTP(语言技术平台)了,它可以做中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术

第二个就是博森科技了,它除了做中文分词、词性标注、命名实体识别、依存文法之外还可以做情感分析、关键词提取、新闻分类、语义联想、时间转换、新闻摘要等,但因为是商业化的公司,除了分词和词性标注免费之外全都收费

第三个就是jieba分词,这个开源小工具分词和词性标注做的挺不错的,但是其他方面还欠缺一下,如果只是中文分词的需求完全可以满足

第四个就是中科院张华平博士的NLPIR汉语分词系统,也能支持关键词提取

我们优先选择NLPIR

 

NLPIR使用

文档在http://pynlpir.readthedocs.io/en/latest/

首先安装pynlpir库

pip install pynlpir

写个小程序测试一下分词效果:

 
  1. # coding:utf-8

  2.  
  3. import sys

  4. reload(sys)

  5. sys.setdefaultencoding( "utf-8" )

  6.  
  7. import pynlpir

  8.  
  9. pynlpir.open()

  10. s = '聊天机器人到底该怎么做呢?'

  11. segments = pynlpir.segment(s)

  12. for segment in segments:

  13. print segment[0], '\t', segment[1]

  14.  
  15. pynlpir.close()

执行效果如下:

 
  1. 聊天 verb

  2. 机器人 noun

  3. 到底 adverb

  4. 该 verb

  5. 怎么 pronoun

  6. 做 verb

  7. 呢 modal particle

  8. ? punctuation mark

下面我们再继续试下关键词提取效果:

 
  1. key_words = pynlpir.get_key_words(s, weighted=True)

  2. for key_word in key_words:

  3. print key_word[0], '\t', key_word[1]

输出如下:

 
  1. 聊天 2.0

  2. 机器人 2.0

 

从这个小程序来看,分词和关键词提取效果很好

 

下面我们再来试验一个,这一次我们把分析功能全打开,部分代码如下:

 
  1. s = '海洋是如何形成的'

  2. segments = pynlpir.segment(s, pos_names='all')

执行后效果如下:

 
  1. 海洋 noun

  2. 是 verb:verb 是

  3. 如何 pronoun:interrogative pronoun:predicate interrogative pronoun

  4. 形成 verb

  5. 的 particle:particle 的/底

  6. 海洋 2.0

  7. 形成 2.0

 

如果我们把segments在加上一个参数pos_english=False,也就是不使用英语,那么输出就是

 
  1. 海洋 名词

  2. 是 动词:动词"是"

  3. 如何 代词:疑问代词:谓词性疑问代词

  4. 形成 动词

  5. 的 助词:的/底

  6. 海洋 2.0

  7. 形成 2.0

解释一下

这里的segment是切词的意思,返回的是tuple(token, pos),其中token就是切出来的词,pos就是语言属性

调用segment方法指定的pos_names参数可以是'all', 'child', 'parent',默认是parent, 表示获取该词性的最顶级词性,child表示获取该词性的最具体的信息,all表示获取该词性相关的所有词性信息,相当于从其顶级词性到该词性的一条路径

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

词性分类表

查看nlpir的源代码中的pynlpir/docs/pos_map.rst,可以看出全部词性分类及其子类别如下:

 
  1. POS_MAP = {

  2. 'n': ('名词', 'noun', {

  3. 'nr': ('人名', 'personal name', {

  4. 'nr1': ('汉语姓氏', 'Chinese surname'),

  5. 'nr2': ('汉语名字', 'Chinese given name'),

  6. 'nrj': ('日语人名', 'Japanese personal name'),

  7. 'nrf': ('音译人名', 'transcribed personal name')

  8. }),

  9. 'ns': ('地名', 'toponym', {

  10. 'nsf': ('音译地名', 'transcribed toponym'),

  11. }),

  12. 'nt': ('机构团体名', 'organization/group name'),

  13. 'nz': ('其它专名', 'other proper noun'),

  14. 'nl': ('名词性惯用语', 'noun phrase'),

  15. 'ng': ('名词性语素', 'noun morpheme'),

  16. }),

  17. 't': ('时间词', 'time word', {

  18. 'tg': ('时间词性语素', 'time morpheme'),

  19. }),

  20. 's': ('处所词', 'locative word'),

  21. 'f': ('方位词', 'noun of locality'),

  22. 'v': ('动词', 'verb', {

  23. 'vd': ('副动词', 'auxiliary verb'),

  24. 'vn': ('名动词', 'noun-verb'),

  25. 'vshi': ('动词"是"', 'verb 是'),

  26. 'vyou': ('动词"有"', 'verb 有'),

  27. 'vf': ('趋向动词', 'directional verb'),

  28. 'vx': ('行事动词', 'performative verb'),

  29. 'vi': ('不及物动词', 'intransitive verb'),

  30. 'vl': ('动词性惯用语', 'verb phrase'),

  31. 'vg': ('动词性语素', 'verb morpheme'),

  32. }),

  33. 'a': ('形容词', 'adjective', {

  34. 'ad': ('副形词', 'auxiliary adjective'),

  35. 'an': ('名形词', 'noun-adjective'),

  36. 'ag': ('形容词性语素', 'adjective morpheme'),

  37. 'al': ('形容词性惯用语', 'adjective phrase'),

  38. }),

  39. 'b': ('区别词', 'distinguishing word', {

  40. 'bl': ('区别词性惯用语', 'distinguishing phrase'),

  41. }),

  42. 'z': ('状态词', 'status word'),

  43. 'r': ('代词', 'pronoun', {

  44. 'rr': ('人称代词', 'personal pronoun'),

  45. 'rz': ('指示代词', 'demonstrative pronoun', {

  46. 'rzt': ('时间指示代词', 'temporal demonstrative pronoun'),

  47. 'rzs': ('处所指示代词', 'locative demonstrative pronoun'),

  48. 'rzv': ('谓词性指示代词', 'predicate demonstrative pronoun'),

  49. }),

  50. 'ry': ('疑问代词', 'interrogative pronoun', {

  51. 'ryt': ('时间疑问代词', 'temporal interrogative pronoun'),

  52. 'rys': ('处所疑问代词', 'locative interrogative pronoun'),

  53. 'ryv': ('谓词性疑问代词', 'predicate interrogative pronoun'),

  54. }),

  55. 'rg': ('代词性语素', 'pronoun morpheme'),

  56. }),

  57. 'm': ('数词', 'numeral', {

  58. 'mq': ('数量词', 'numeral-plus-classifier compound'),

  59. }),

  60. 'q': ('量词', 'classifier', {

  61. 'qv': ('动量词', 'verbal classifier'),

  62. 'qt': ('时量词', 'temporal classifier'),

  63. }),

  64. 'd': ('副词', 'adverb'),

  65. 'p': ('介词', 'preposition', {

  66. 'pba': ('介词“把”', 'preposition 把'),

  67. 'pbei': ('介词“被”', 'preposition 被'),

  68. }),

  69. 'c': ('连词', 'conjunction', {

  70. 'cc': ('并列连词', 'coordinating conjunction'),

  71. }),

  72. 'u': ('助词', 'particle', {

  73. 'uzhe': ('着', 'particle 着'),

  74. 'ule': ('了/喽', 'particle 了/喽'),

  75. 'uguo': ('过', 'particle 过'),

  76. 'ude1': ('的/底', 'particle 的/底'),

  77. 'ude2': ('地', 'particle 地'),

  78. 'ude3': ('得', 'particle 得'),

  79. 'usuo': ('所', 'particle 所'),

  80. 'udeng': ('等/等等/云云', 'particle 等/等等/云云'),

  81. 'uyy': ('一样/一般/似的/般', 'particle 一样/一般/似的/般'),

  82. 'udh': ('的话', 'particle 的话'),

  83. 'uls': ('来讲/来说/而言/说来', 'particle 来讲/来说/而言/说来'),

  84. 'uzhi': ('之', 'particle 之'),

  85. 'ulian': ('连', 'particle 连'),

  86. }),

  87. 'e': ('叹词', 'interjection'),

  88. 'y': ('语气词', 'modal particle'),

  89. 'o': ('拟声词', 'onomatopoeia'),

  90. 'h': ('前缀', 'prefix'),

  91. 'k': ('后缀' 'suffix'),

  92. 'x': ('字符串', 'string', {

  93. 'xe': ('Email字符串', 'email address'),

  94. 'xs': ('微博会话分隔符', 'hashtag'),

  95. 'xm': ('表情符合', 'emoticon'),

  96. 'xu': ('网址URL', 'URL'),

  97. 'xx': ('非语素字', 'non-morpheme character'),

  98. }),

  99. 'w': ('标点符号', 'punctuation mark', {

  100. 'wkz': ('左括号', 'left parenthesis/bracket'),

  101. 'wky': ('右括号', 'right parenthesis/bracket'),

  102. 'wyz': ('左引号', 'left quotation mark'),

  103. 'wyy': ('右引号', 'right quotation mark'),

  104. 'wj': ('句号', 'period'),

  105. 'ww': ('问号', 'question mark'),

  106. 'wt': ('叹号', 'exclamation mark'),

  107. 'wd': ('逗号', 'comma'),

  108. 'wf': ('分号', 'semicolon'),

  109. 'wn': ('顿号', 'enumeration comma'),

  110. 'wm': ('冒号', 'colon'),

  111. 'ws': ('省略号', 'ellipsis'),

  112. 'wp': ('破折号', 'dash'),

  113. 'wb': ('百分号千分号', 'percent/per mille sign'),

  114. 'wh': ('单位符号', 'unit of measure sign'),

  115. }),

  116. }
  117.  

好,这回我们一下子完成了分词、词性标注、关键词提取。命名实体识别、句法分析以及查询问句分类我们之后再研究

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文分词性标注关键词提取是NLP中常用的三个功能,可以通过开源NLP工具包如jieba、THULAC和NLTK等来实现,下面是具体步骤: 1.中文分:将一段文本切分成一个个单独的语。jieba是目前比较流行的Python中文分工具包,使用方法非常简单。首先安装jieba,然后在代码中导入jieba模块,在文本输入时调用jieba模块分函数即可完成中文分操作。 例如,下面展示了在Python中使用jieba对一段中文文本进行分的示例代码: ``` import jieba text = '我喜欢看电影' seg_list = jieba.cut(text, cut_all=False) # cut_all=False表示精确模式 print("分结果:", "/".join(seg_list)) ``` 输出结果为:“分结果:我/喜欢/看/电影” 2.词性标注:给分的每个语附加上其词性的标记,例如“名”、“动”、“形容”等。THULAC是一个高效准确的中文法分析工具,支持中文分词性标注等操作,可以自动识别出中文文本中的人名、地名、各类数字、日期等,并正确定位他们在句子中的位置。使用方法与jieba相似,通过安装THULAC库,并调用相关函数即可完成中文分词性标注。 例如,下面展示了在Python中使用THULAC对一段中文文本进行分词性标注的示例代码: ``` import thulac thu1 = thulac.thulac() #默认模式 text = '我喜欢看电影' seg_list = thu1.cut(text, text=True) #进行分词性标注 print("分词性标注结果:", seg_list) ``` 输出结果为:”分词性标注结果:[['我', 'r'], ['喜欢', 'v'], ['看', 'v'], ['电影', 'n']]“ 3.关键词提取:从一段文本中提取出最具代表性的关键词,常用于文本摘要、文本分类、信息检索等应用场景中。NLTK是Python较为常用的自然语言处理工具包之一,其提供了多种文本预处理功能,其中包括关键词提取功能。只需要按照以下步骤,即可使用NLTK实现关键词提取: - 安装NLTK:在Python命令行或终端中输入命令“pip install nltk”即可完成安装。 - 导入相关模块:使用以下代码导入nltk和nltk.corpus模块,以及相关的停用库。 ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize ``` - 加载和处理文本:首先需要载入一段文本,并进行分处理和词性标注。为了减少干扰项,还需要进行一些过滤操作,例如过滤停用、标点符号等。这里以一个简单的示例为例: ```python text = '我喜欢看电影,特别喜欢科幻电影。' stop_words = set(stopwords.words('chinese')) # 载入中文停用库 word_tokens = word_tokenize(text) # 将句子进行分处理 filtered_sentence = [w for w in word_tokens if not w in stop_words] # 过滤停用 ``` - 提取关键词:使用NLTK提供的Collocations和FreqDist函数,实现对文本关键词提取。其中Collocations可以检查文本中的共现频率最高的对或短语,而FreqDist可以对文本中出现的语进行频率统计,找出出现频率最高的单和短语。 ```python bigram_measures = nltk.collocations.BigramAssocMeasures() finder = nltk.collocations.BigramCollocationFinder.from_words(filtered_sentence) keywords = finder.nbest(bigram_measures.raw_freq, 3) # 提取出现频率前三的语 ``` 输出结果为:[(‘喜欢’, ‘科幻’), (‘科幻’, ‘电影’), (‘看’, ‘电影’)] 综上所述,中文分词性标注关键词提取是常见的NLP功能,在Python中可以通过开源工具库来实现,具体实现流程见上述示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值