pyltp实体识别_基于pyltp进行命名实体识别

本文介绍了如何使用pyltp库进行命名实体识别,特别是针对金庸小说文本中的人物名字提取。首先,通过pip安装pyltp并下载对应版本的LTP模型。接着,加载模型并依次进行分词、词性标注和命名实体识别。最后,筛选出人名并去重,将结果保存到文件NER-JinyongPerson.txt中。
摘要由CSDN通过智能技术生成

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值