美文网首页
基于pyltp进行命名实体识别

基于pyltp进行命名实体识别

作者: sirenyunpan | 来源:发表于2019-03-12 16:06 被阅读0次

    pyltp简介

    pyltp 是 LTP 的 Python 封装。LTP是哈尔滨工业大学社会计算与信息检索研究中心研发的一款自然语言处理工具,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注等功能。
    ==》ptltp的使用文档

    pyltp的安装

    使用pip install pyltp指令即可安装,如有报错,可参考这篇教程(python3.6 安装pyltp)中的解决方法。

    在正式开始使用之前还应下载完整的LTP模型文件,官方给出的下载链接:百度云
    值得注意的是下载的模型版本与当前版本的 pyltp 对应,否则会导致程序无法正确加载模型。本文中下载的是3.4.0版本的模型文件。

    编写代码调用pyltp进行命名实体识别

    需要注意:①命名实体识别是在分词及词性标注的基础之上进行的;②输入文本的编码格式一定要是UTF-8

    下面的代码的功能是对金庸小说文本中的人名进行识别

    # -*- coding: utf-8 -*-
    import os
    # 引入模型文件
    LTP_DATA_DIR = 'D:\MoreProgram\ltp_data_v3.4.0'  # ltp模型目录的路径
    
    cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
    pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
    ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 命名实体识别模型路径,模型名称为`ner.model`
    
    
    
    #打开需要命名实体识别的文本,编码一定要是 UTF-8
    with open(r'金庸全集.txt', encoding="UTF-8", errors='ignore') as file_object:
        jinyong = file_object.read()
    
    
    #分词
    from pyltp import Segmentor
    segmentor = Segmentor()  # 初始化实例
    segmentor.load(cws_model_path)  # 加载模型
    words = segmentor.segment(jinyong)  # 分词
    words_list = list(words)   #words_list列表保存着分词的结果
    segmentor.release()  # 释放模型
    
    #词性标注
    from pyltp import Postagger
    postagger = Postagger()  # 初始化实例
    postagger.load(pos_model_path)  # 加载模型
    postags = postagger.postag(words)  # 词性标注
    postags_list = list(postags)  #postags_list保存着词性标注的结果
    postagger.release()  # 释放模型
    
    #命名实体识别
    from pyltp import NamedEntityRecognizer
    recognizer = NamedEntityRecognizer()  # 初始化实例
    recognizer.load(ner_model_path)  # 加载模型
    netags = recognizer.recognize(words, postags)  # 命名实体识别
    netags_list = list(netags)  #netags_list保存着命名实体识别的结果
    recognizer.release()  # 释放模型
    
    
    #去除非命名实体
    a = len(words_list)
    words_list_1=[]
    postags_list_1=[]
    netags_list_1=[]
    i = 0
    while i < a:
        if netags_list[i] != 'O':
            words_list_1.append(words_list[i])
            postags_list_1.append(postags_list[i])
            netags_list_1.append(netags_list[i])
        i += 1
    a1 = len(words_list_1)
    
    #提取人名
    i = 0
    names=[]
    while i<a1:
        if netags_list_1[i] == 'S-Nh':
            names.append(words_list_1[i])
        elif netags_list_1[i] == 'B-Nh':
            temp_s3 = ''
            temp_s3 += words_list_1[i]
            j = i+1
            while (j<a1) and (netags_list_1[j]=='I-Nh' or netags_list_1[j]=='E-Nh'):
                temp_s3 += words_list_1[j]
                j += 1
            names.append(temp_s3)
        i += 1
    
    #去除重复的人名后写入文件
    name_list = set(names)
    name_file=open('NER-JinyongPerson.txt','w', encoding='UTF-8',errors='ignore')
    for name in name_list:
        name_file.write(name+'\n')
    

    结果部分截图如下:


    image.png

    相关文章

      网友评论

          本文标题:基于pyltp进行命名实体识别

          本文链接:https://www.haomeiwen.com/subject/nfggpqtx.html