• 哈工大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 = '	'.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 = ' '.join(words) # 词性标注 postagger = Postagger() postagger.load('/home/jupyterhub/ltp_data_v3.4.0/pos.model') postags = postagger.postag(words) print(' '.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 = '	'.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 = '	'.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 = '	'.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 = ' '.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 = ' '.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)

      

  • 相关阅读:
    深入浅出Win32多线程程序设计【2】线程控制
    深入浅出Win32多线程程序设计【1】基本概念
    在两个ASP.NET页面之间传递值
    Javascript基础
    DataGrid的几个小技巧
    推荐取代Visio的中国人的软件——Edraw
    ASP.NET如何防范SQL注入攻击
    软件版本号规定原则
    三层体系结构总结(三)
    .Net工具 .NET文档生成工具2.2
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/13665193.html
Copyright © 2020-2023  润新知