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)