当前位置:   article > 正文

NLP入门(六)pyltp的介绍与使用

wpnlp

pyltp的简介

  语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台。它提供的功能包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等。

语言技术平台架构

  pyltp 是 LTP 的 Python 封装,同时支持Python2和Python3版本。Python3的安装方法为:

pip3 install pyltp

  在使用该模块前,需要下载完整的模型文件,文件下载地址为:https://pan.baidu.com/share/l... 。pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8。模型的数据文件如下:

模型数据

其中,cws.model用于分词模型,lexicon.txt为分词时添加的用户字典,ner.model为命名实体识别模型,parser.model为依存句法分析模型,pisrl.model为语义角色标注模型,pos为词性标注模型。

pyltp的使用

  pyltp的使用示例项目结构如下:

示例项目

分句

  分句指的是将一段话或一片文章中的文字按句子分开,按句子形成独立的单元。示例的Python代码sentenct_split.py如下:

  1. # -*- coding: utf-8 -*-
  2. from pyltp import SentenceSplitter
  3. # 分句
  4. doc = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。' \
  5. '盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,' \
  6. '盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,' \
  7. '拟定共同应对朝鲜挑衅和核计划的方案。'
  8. sents = SentenceSplitter.split(doc) # 分句
  9. for sent in sents:
  10. print(sent)

输出结果如下:

  1. 据韩联社1228日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011114日访问韩国。
  2. 盖茨原计划从明年19日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。
  3. 莫莱尔表示,盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,拟定共同应对朝鲜挑衅和核计划的方案。
分词

  分词指的是将一句话按词语分开,按词语形成独立的单元。示例的Python代码words_split.py如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from pyltp import Segmentor
  4. cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`
  5. lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
  6. segmentor = Segmentor()
  7. segmentor.load_with_lexicon(cws_model_path, lexicon_path)
  8. sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
  9. words = segmentor.segment(sent) # 分词
  10. print('/'.join(words))
  11. segmentor.release()

输出的结果如下:

/韩联社/12/28/反映///国防部/发言人/杰夫·莫莱尔/27/表示///国防部长/盖茨///2011/1/14/访问/韩国/
词性标注

  词性标注指的是一句话分完词后,制定每个词语的词性。示例的Python代码postagger.py如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from pyltp import Segmentor, Postagger
  4. # 分词
  5. cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`
  6. lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
  7. segmentor = Segmentor()
  8. segmentor.load_with_lexicon(cws_model_path, lexicon_path)
  9. sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
  10. words = segmentor.segment(sent) # 分词
  11. # 词性标注
  12. pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
  13. postagger = Postagger() # 初始化实例
  14. postagger.load(pos_model_path) # 加载模型
  15. postags = postagger.postag(words) # 词性标注
  16. for word, postag in zip(words, postags):
  17. print(word, postag)
  18. # 释放模型
  19. segmentor.release()
  20. postagger.release()
  21. '''
  22. 词性标注结果说明
  23. https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
  24. '''

输出结果如下:

  1. 据 p
  2. 韩联社 ni
  3. 12月 nt
  4. 28日 nt
  5. 反映 v
  6. , wp
  7. 美 j
  8. 国防部 n
  9. 发言人 n
  10. 杰夫·莫莱尔 nh
  11. 27日 nt
  12. 表示 v
  13. , wp
  14. 美 j
  15. 国防部长 n
  16. 盖茨 nh
  17. 将 d
  18. 于 p
  19. 2011年 nt
  20. 1月 nt
  21. 14日 nt
  22. 访问 v
  23. 韩国 ns
  24. 。 wp

词性标注结果可参考网址:https://ltp.readthedocs.io/zh...

命名实体识别

  命名实体识别(NER)指的是识别出一句话或一段话或一片文章中的命名实体,比如人名,地名,组织机构名。示例的Python代码ner.py如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from pyltp import Segmentor, Postagger
  4. # 分词
  5. cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`
  6. lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
  7. segmentor = Segmentor()
  8. segmentor.load_with_lexicon(cws_model_path, lexicon_path)
  9. sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
  10. words = segmentor.segment(sent) # 分词
  11. # 词性标注
  12. pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
  13. postagger = Postagger() # 初始化实例
  14. postagger.load(pos_model_path) # 加载模型
  15. postags = postagger.postag(words) # 词性标注
  16. ner_model_path = os.path.join(os.path.dirname(__file__), 'data/ner.model') # 命名实体识别模型路径,模型名称为`pos.model`
  17. from pyltp import NamedEntityRecognizer
  18. recognizer = NamedEntityRecognizer() # 初始化实例
  19. recognizer.load(ner_model_path) # 加载模型
  20. # netags = recognizer.recognize(words, postags) # 命名实体识别
  21. # 提取识别结果中的人名,地名,组织机构名
  22. persons, places, orgs = set(), set(), set()
  23. netags = list(recognizer.recognize(words, postags)) # 命名实体识别
  24. print(netags)
  25. # print(netags)
  26. i = 0
  27. for tag, word in zip(netags, words):
  28. j = i
  29. # 人名
  30. if 'Nh' in tag:
  31. if str(tag).startswith('S'):
  32. persons.add(word)
  33. elif str(tag).startswith('B'):
  34. union_person = word
  35. while netags[j] != 'E-Nh':
  36. j += 1
  37. if j < len(words):
  38. union_person += words[j]
  39. persons.add(union_person)
  40. # 地名
  41. if 'Ns' in tag:
  42. if str(tag).startswith('S'):
  43. places.add(word)
  44. elif str(tag).startswith('B'):
  45. union_place = word
  46. while netags[j] != 'E-Ns':
  47. j += 1
  48. if j < len(words):
  49. union_place += words[j]
  50. places.add(union_place)
  51. # 机构名
  52. if 'Ni' in tag:
  53. if str(tag).startswith('S'):
  54. orgs.add(word)
  55. elif str(tag).startswith('B'):
  56. union_org = word
  57. while netags[j] != 'E-Ni':
  58. j += 1
  59. if j < len(words):
  60. union_org += words[j]
  61. orgs.add(union_org)
  62. i += 1
  63. print('人名:', ','.join(persons))
  64. print('地名:', ','.join(places))
  65. print('组织机构:', ','.join(orgs))
  66. # 释放模型
  67. segmentor.release()
  68. postagger.release()
  69. recognizer.release()

输出的结果如下:

  1. ['O', 'S-Ni', 'O', 'O', 'O', 'O', 'B-Ni', 'E-Ni', 'O', 'S-Nh', 'O', 'O', 'O', 'S-Ns', 'O', 'S-Nh', 'O', 'O', 'O', 'O', 'O', 'O', 'S-Ns', 'O']
  2. 人名: 杰夫·莫莱尔,盖茨
  3. 地名: 美,韩国
  4. 组织机构: 韩联社,美国防部

命名实体识别结果可参考网址:https://ltp.readthedocs.io/zh...

依存句法分析

  依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。示例的Python代码parser.py代码如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from pyltp import Segmentor, Postagger, Parser
  4. # 分词
  5. cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`
  6. lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
  7. segmentor = Segmentor()
  8. segmentor.load_with_lexicon(cws_model_path, lexicon_path)
  9. sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
  10. words = segmentor.segment(sent) # 分词
  11. # 词性标注
  12. pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
  13. postagger = Postagger() # 初始化实例
  14. postagger.load(pos_model_path) # 加载模型
  15. postags = postagger.postag(words) # 词性标注
  16. # 依存句法分析
  17. par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model') # 模型路径,模型名称为`parser.model`
  18. parser = Parser() # 初始化实例
  19. parser.load(par_model_path) # 加载模型
  20. arcs = parser.parse(words, postags) # 句法分析
  21. rely_id = [arc.head for arc in arcs] # 提取依存父节点id
  22. relation = [arc.relation for arc in arcs] # 提取依存关系
  23. heads = ['Root' if id == 0 else words[id-1] for id in rely_id] # 匹配依存父节点词语
  24. for i in range(len(words)):
  25. print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')
  26. # 释放模型
  27. segmentor.release()
  28. postagger.release()
  29. parser.release()

输出结果如下:

  1. ADV(据, 表示)
  2. SBV(韩联社, 反映)
  3. ATT(12月, 28日)
  4. ADV(28日, 反映)
  5. POB(反映, 据)
  6. WP(,, 据)
  7. ATT(美, 国防部)
  8. ATT(国防部, 发言人)
  9. ATT(发言人, 杰夫·莫莱尔)
  10. SBV(杰夫·莫莱尔, 表示)
  11. ADV(27日, 表示)
  12. HED(表示, Root)
  13. WP(,, 表示)
  14. ATT(美, 国防部长)
  15. ATT(国防部长, 盖茨)
  16. SBV(盖茨, 访问)
  17. ADV(将, 访问)
  18. ADV(于, 访问)
  19. ATT(2011年, 14日)
  20. ATT(1月, 14日)
  21. POB(14日, 于)
  22. VOB(访问, 表示)
  23. VOB(韩国, 访问)
  24. WP(。, 表示)

依存句法分析结果可参考网址:https://ltp.readthedocs.io/zh...

语义角色标注

  语义角色标注是实现浅层语义分析的一种方式。在一个句子中,谓词是对主语的陈述或说明,指出“做什么”、“是什么”或“怎么样,代表了一个事件的核心,跟谓词搭配的名词称为论元。语义角色是指论元在动词所指事件中担任的角色。主要有:施事者(Agent)、受事者(Patient)、客体(Theme)、经验者(Experiencer)、受益者(Beneficiary)、工具(Instrument)、处所(Location)、目标(Goal)和来源(Source)等。示例的Python代码rolelabel.py如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from pyltp import Segmentor, Postagger, Parser, SementicRoleLabeller
  4. # 分词
  5. cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`
  6. lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
  7. segmentor = Segmentor()
  8. segmentor.load_with_lexicon(cws_model_path, lexicon_path)
  9. sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
  10. words = segmentor.segment(sent) # 分词
  11. # 词性标注
  12. pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
  13. postagger = Postagger() # 初始化实例
  14. postagger.load(pos_model_path) # 加载模型
  15. postags = postagger.postag(words) # 词性标注
  16. # 依存句法分析
  17. par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model') # 模型路径,模型名称为`parser.model`
  18. parser = Parser() # 初始化实例
  19. parser.load(par_model_path) # 加载模型
  20. arcs = parser.parse(words, postags) # 句法分析
  21. # 语义角色标注
  22. srl_model_path = os.path.join(os.path.dirname(__file__), 'data/pisrl.model') # 语义角色标注模型目录路径
  23. labeller = SementicRoleLabeller() # 初始化实例
  24. labeller.load(srl_model_path) # 加载模型
  25. roles = labeller.label(words, postags, arcs) # 语义角色标注
  26. # 打印结果
  27. for role in roles:
  28. print(words[role.index], end=' ')
  29. print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
  30. # 释放模型
  31. segmentor.release()
  32. postagger.release()
  33. parser.release()
  34. labeller.release()

输出结果如下:

  1. 反映 4 A0:(1,1)A0:(2,3)
  2. 表示 11 MNR:(0,5)A0:(6,9)TMP:(10,10)A1:(13,22)
  3. 访问 21 A0:(13,15)ADV:(16,16)TMP:(17,20)A1:(22,22)

总结

  本文介绍了中文NLP的一个杰出工具pyltp,并给出了该模块的各个功能的一个示例,希望能给读者一些思考与启示。本文到此结束,感谢大家阅读~

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/249367?site
推荐阅读
相关标签
  

闽ICP备14008679号