哈工大ltp----用户自定义词典
nlp项目正在进行的如火如荼,优点缺点、技术团队等等都提取的差不多了。但技术名词提取还有些差强人意,在技术摄取中想保留原来设计的技术关键字。
为了解决这个问题,我们首先要创建一个文件,保存我们自定义的一些技术关键字,一个关键字占一行,就取名为dict.txt吧。
# 查看自定义关键字
$ cat dict.txt 必须是utf8格式才能生效
隔膜电解法
反渗透法
硫化物沉淀法
离子交换法
1、分词
废话不多说, 先上代码, 大家一看就懂。
#!/usr/bin/python3 # -*- coding: utf-8 -*- from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # 分词 segmentor = Segmentor() model_path = '/home/jupyterhub/ltp_data_v3.4.0/cws.model' user_dict = '/home/jupyterhub/codes/scripts/dict.txt' segmentor.load_with_lexicon(model_path, user_dict) sent='可应用方法如中和沉淀法、硫化物沉淀法、上浮分离法、电解沉淀(或上浮)法、电解法、隔膜电解法等;二是将废水中的重金属在不改变其化学形态的条件下进行浓缩和分离,可应用方法有反渗透法、电渗析法、蒸发法和离子交换法等' words = segmentor.segment(sent) words_str = '\t'.join(words) segmentor.release() # 释放应用 运行结果如下: 可 应用 方法 如 中 和 沉淀法 、 硫化物 沉淀法 、 上浮 分离法 、 电解 沉淀 ( 或 上浮 ) 法 、 隔膜电解法 等 ; 二 是 将 废水 中 的 重金属 在 不 改变 其 化学 形态 的 条件 下 进行 浓缩 和 分离 , 可 应用 方法 有 反渗透法 、 电渗 析法 、 蒸发法 和 离子 交换法 等
运行结果 :
由结果可以看出: 我们自定义了四个技术关键字,有三个技术关键字都正确提取出来了。
2、词性标注
废话不多说, 先上代码, 大家一看就懂。
#!/usr/bin/python3 # -*- coding: utf-8 -*- from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # 分词 segmentor = Segmentor() model_path = '/home/jupyterhub/ltp_data_v3.4.0/cws.model' user_dict = '/home/jupyterhub/codes/scripts/dict.txt' segmentor.load_with_lexicon(model_path, user_dict) sent='可应用方法如中和沉淀法、硫化物沉淀法、上浮分离法、电解沉淀(或上浮)法、电解法、隔膜电解法等;二是将废水中的重金属在不改变其化学形态的条件下进行浓缩和分离,
可应用方法有反渗透法、电渗析法、蒸发法和离子交换法等' words = segmentor.segment(sent) words_str = '\t'.join(words) # 词性标注 postagger = Postagger() postagger.load('/home/jupyterhub/ltp_data_v3.4.0/pos.model') postags = postagger.postag(words) print('\t'.join(postags)) postagger.release()
运行结果: c v n v nd c n wp n n wp v n wp v v wp
c v wp n wpwp n u wp m v p n nd u n p d
v r n n u n nd v v wp c v n v n wp n n
wp n c n u
3、依存句法分析
#!/usr/bin/python3 # -*- coding: utf-8 -*- from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # 分词 segmentor = Segmentor() model_path = '/home/jupyterhub/ltp_data_v3.4.0/cws.model' user_dict = '/home/jupyterhub/codes/scripts/dict.txt' segmentor.load_with_lexicon(model_path, user_dict) sent='可应用方法如中和沉淀法、硫化物沉淀法、上浮分离法、电解沉淀(或上浮)法、电解法、隔膜电解法等;二是将废水中的重金属在不改变其化学形态的条件下进行浓缩和分离,可应用方法有反渗透法、电渗析法、蒸发法和离子交换法等' words = segmentor.segment(sent) words_str = '\t'.join(words) # 词性标注 postagger = Postagger() postagger.load('/home/jupyterhub/ltp_data_v3.4.0/pos.model') postags = postagger.postag(words) # 句法分析 parser = Parser() parser.load('/home/jupyterhub/ltp_data_v3.4.0/parser.model') arcs = parser.parse(words, postags) # 词、 词性 print([(arc.head, arc.relation) for arc in arcs]) parser.release()
运行结果 : [(12, 'ADV'), (3, 'ATT'), (12, 'SBV'), (12, 'ADV'), (4, 'POB'), (7, 'LAD'), (5, 'COO'), (9, 'WP'), (10, 'ATT'), (5, 'COO'), (10, 'WP'),
(0, 'HED'), (12, 'VOB'), (15, 'WP'), (12, 'COO'), (15, 'COO'), (19, 'WP'), (19, 'ADV'), (12, 'COO'), (19, 'WP'), (12, 'COO'), (23, 'WP'),
(21, 'COO'), (25, 'WP'), (21, 'COO'), (21, 'RAD'), (12, 'WP'), (29, 'SBV'), (12, 'COO'), (44, 'ADV'), (32, 'ATT'), (34, 'ATT'), (32, 'RAD'),
(30, 'POB'), (44, 'ADV'), (37, 'ADV'), (43, 'ATT'), (40, 'ATT'), (40, 'ATT'), (42, 'ATT'), (40, 'RAD'), (37, 'VOB'), (35, 'POB'), (29, 'VOB'),
(44, 'VOB'), (47, 'LAD'), (45, 'COO'), (29, 'WP'), (52, 'ADV'), (51, 'ATT'), (52, 'SBV'), (29, 'COO'), (52, 'VOB'), (53, 'WP'), (56, 'ATT'),
(53, 'COO'), (58, 'WP'), (53, 'COO'), (60, 'LAD'), (53, 'COO'), (53, 'RAD')]
4、
#!/usr/bin/python3 # -*- coding: utf-8 -*- from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # 分词 segmentor = Segmentor() model_path = '/home/jupyterhub/ltp_data_v3.4.0/cws.model' user_dict = '/home/jupyterhub/codes/scripts/dict.txt' segmentor.load_with_lexicon(model_path, user_dict) sent='可应用方法如中和沉淀法、硫化物沉淀法、上浮分离法、电解沉淀(或上浮)法、电解法、隔膜电解法等;二是将废水中的重金属在不改变其化学形态的条件下进行浓缩和分离,可应用方法有反渗透法、电渗析法、蒸发法和离子交换法等' words = segmentor.segment(sent) words_str = '\t'.join(words) # 词性标注 postagger = Postagger() postagger.load('/home/jupyterhub/ltp_data_v3.4.0/pos.model') postags = postagger.postag(words) # 句法分析 parser = Parser() parser.load('/home/jupyterhub/ltp_data_v3.4.0/parser.model') arcs = parser.parse(words, postags) # 词、 词性 # 命名实体识别 recognizer = NamedEntityRecognizer() recognizer.load('/home/jupyterhub/ltp_data_v3.4.0/ner.model') netags = recognizer.recognize(words, postags) # 词、词性 netags_str = '\t'.join(netags) 运行结果: $ python ltp_any.py [INFO] 2020-09-14 19:38:49 loaded 4 lexicon entries O O O O O O O O O O O O O O O O O
O O O O O O
5、语义角色标注
#!/usr/bin/python3 # -*- coding: utf-8 -*- from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # 分词 segmentor = Segmentor() model_path = '/home/jupyterhub/ltp_data_v3.4.0/cws.model' user_dict = '/home/jupyterhub/codes/scripts/dict.txt' segmentor.load_with_lexicon(model_path, user_dict) sent='可应用方法如中和沉淀法、硫化物沉淀法、上浮分离法、电解沉淀(或上浮)法、电解法、隔膜电解法等;二是将废水中的重金属在不改变其化学形态的条件下进行浓缩和分离,
可应用方法有反渗透法、电渗析法、蒸发法和离子交换法等' words = segmentor.segment(sent) words_str = '\t'.join(words) # 词性标注 postagger = Postagger() postagger.load('/home/jupyterhub/ltp_data_v3.4.0/pos.model') postags = postagger.postag(words) # 句法分析 parser = Parser() parser.load('/home/jupyterhub/ltp_data_v3.4.0/parser.model') arcs = parser.parse(words, postags) # 词、 词性 # 命名实体识别 recognizer = NamedEntityRecognizer() recognizer.load('/home/jupyterhub/ltp_data_v3.4.0/ner.model') netags = recognizer.recognize(words, postags) # 词、词性 netags_str = '\t'.join(netags) # 语义角色标注 labeller = SementicRoleLabeller() labeller.load('/home/jupyterhub/ltp_data_v3.4.0/pisrl.model') roles = labeller.label(words, postags, arcs) # 词、词性、句法 for role in roles: print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])) 运行结果: $ python ltp_any.py [INFO] 2020-09-14 19:48:06 loaded 4 lexicon entries [dynet] random seed: 2056387269 [dynet] allocating memory: 2000MB [dynet] memory allocation done. 36 ADV:(35,35)A1:(37,41) 43 LOC:(34,42)A1:(44,46) 46 A1:(30,33) 51 A0:(49,50)A1:(52,60)