使用哈工大LTP进行文本命名实体识别并保存到txt

本文介绍如何使用哈工大的pyltp工具对中文文本进行分词、词性标注及命名实体识别,并将处理结果保存至本地。通过具体代码示例展示了从加载模型、文本预处理到最终结果输出的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求说明
(1)将计算机本地文档集中的文本进行分词、词性标注,最后进行命名实体识别。
(2)将(1)中处理结果保存到本地txt文件中。

技术选择:
本需求的实现使用了哈工大的pyltp,如果你对ltp还不太了解,请点击这里或者去哈工大语言云官网了解相关内容。

完整代码展示

# -*- coding: utf-8 -*-
import os
import jieba

LTP_DATA_DIR = 'D:\pyprojects\LTP\ltp_data'  # 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`
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 依存句法分析模型路径,模型名称为`parser.model`
srl_model_path = os.path.join(LTP_DATA_DIR, 'srl')  # 语义角色标注模型目录路径,模型目录为`srl`。注意该模型路径是一个目录,而不是一个文件。

from pyltp import SentenceSplitter
from pyltp import Segmentor
from pyltp import Postagger
from pyltp import NamedEntityRecognizer
from pyltp import Parser
from pyltp import SementicRoleLabeller

#创建停用词表
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords


# 分句,也就是将一片文本分割为独立的句子
def sentence_splitter(sentence):
    sents = SentenceSplitter.split(sentence)  # 分句
    print('\n'.join(sents))


# 分词
def segmentor(sentence):
    segmentor = Segmentor()  # 初始化实例
    segmentor.load(cws_model_path)  # 加载模型
    #segmentor.load_with_lexicon('cws_model_path', 'D:\pyprojects\LTP\ltp_data\dict.txt') #加载模型   使用用户自定义字典的高级分词
    words = segmentor.segment(sentence)  # 分词
    # 默认可以这样输出
   # print('/'.join(words))
    # 可以转换成List 输出
    words_list = list(words)
    segmentor.release()  # 释放模型
    return words_list


# 词性标注
def posttagger(words):
    postagger = Postagger()  # 初始化实例
    postagger.load(pos_model_path)  # 加载模型
    postags = postagger.postag(words)  # 词性标注
    #for word, tag in zip(words, postags):
     #   print(word + '/' + tag)
    postagger.release()  # 释放模型
    return postags


# 命名实体识别
def ner(words, postags):
    recognizer = NamedEntityRecognizer()  # 初始化实例
    recognizer.load(ner_model_path)  # 加载模型
    netags = recognizer.recognize(words, postags)  # 命名实体识别
    #for word, ntag in zip(words, netags):
     #   print(word + '/' + ntag)
    recognizer.release()  # 释放模型
    return netags

stopwords = stopwordslist('D:/2181729/stop_words.txt')
final = ''
f1=open('D:/2181729/nerfcdata/30.txt','w', encoding='UTF-8')
with open('D:/2181729/data/30.txt', 'r', encoding='UTF-8') as f:

       for line in f:
           segs = jieba.cut(line, cut_all=False)
           for seg in segs:
              if seg not in stopwords:
                 final += seg

words = segmentor(final)
postags = posttagger(words)
netags = ner(words,postags)

tags = []
dict = []

for word, ntag in zip(words, netags):
    if(ntag != 'O'):#过滤非命名实体
        tags.append(ntag)
        if (ntag not in dict):
             dict.append(ntag)
       # print(word + '/' + ntag)
        f1.write(word + ':' + ntag + '\r\n')


for tag in dict:
    num = tags.count(tag)
    print(tag + ":"+str(num))
    f1.write(tag + ":"+str(num) + '\r\n')
f1.close()

效果展示
在这里插入图片描述

参考
https://blog.youkuaiyun.com/informationscience/article/details/76850652

### 哈工大命名实体识别技术实现与下载使用教程 #### 工具概述 哈工大开发了一系列自然语言处理工具,其中包括支持中文分词、词性标注以及命名实体识别等功能的开源项目 LTP (Language Technology Platform)[^2]。该平台提供了多种编程语言接口的支持,例如 Python、Java 和 C++。 #### 安装指南 对于 Python 用户来说,可以利用 `pip` 来安装 pyltp 库,这是 LTP 的官方 Python 接口之一[^3]。以下是具体的安装命令: ```bash pip install pyltp ``` 完成库的安装之后,还需要下载对应的模型文件。这些模型包含了用于分词、词性标注和命名实体识别等任务所需的训练数据。可以通过以下链接访问下载所需资源: [LTP Model Download](http://ltp.ai/download.html) #### 使用示例 下面是一个简单的例子展示如何加载模型对一段文本执行命名实体识别操作: ```python from pyltp import NamedEntityRecognizer, Postagger, Segmentor # 初始化实例对象 segmentor = Segmentor() postagger = Postagger() recognizer = NamedEntityRecognizer() # 加载模型路径 cws_model_path = 'path_to_your_cws.model' pos_model_path = 'path_to_your_pos.model' ner_model_path = 'path_to_your_ner.model' segmentor.load(cws_model_path) postagger.load(pos_model_path) recognizer.load(ner_model_path) sentence = "李华去了北京" words = segmentor.segment(sentence) postags = postagger.postag(words) netags = recognizer.recognize(words, postags) print("\t".join(netags)) # 卸载模型释放内存 segmentor.release() postagger.release() recognizer.release() ``` 上述代码展示了从初始化模块到加载预训练模型的过程,最终实现了对输入句子 `"李华去了北京"` 进行命名实体识别的功能[^4]。 #### 数据存储 如果需要将处理后的结果保存至本地 `.txt` 文件中,则可以在程序结束前加入如下写入逻辑: ```python with open('output.txt', mode='w', encoding='utf-8') as file: for word, ner_tag in zip(words, netags): line = f"{word}\t{ner_tag}\n" file.write(line) ``` 此部分脚本会逐行记录单词及其对应标签于指定位置下的纯文本档内。 #### 停用词过滤 为了提高效率或者减少干扰项,在实际应用过程中可能还会涉及到停用词列表的应用场景。可以从公开渠道获取通用版本作为基础参考资料[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值