基于Python的人工智能应用案例系列(20):NER技术实体识别

news2024/10/8 11:38:08

        在这篇案例研究中,我们将构建一个基于神经网络的命名实体识别(NER)模型,专门识别技术相关的术语。通过本案例,将学习如何:

  1. 从原始文本数据中提取技术相关的术语
  2. 使用提取的术语对文本进行标注
  3. 使用这些标注数据来训练NER模型
  4. 测试并可视化模型的输出结果

步骤概览

  1. 加载并处理技术相关文本
  2. 从其他数据源中获取技术术语
  3. 使用这些术语对原始文本进行标注
  4. 训练NER模型
  5. 测试模型并进行可视化展示

1. 加载数据

        我们首先从Google专利中获取了一些技术相关的文本数据,作为模型的训练数据,这些文本来自 Google Patents。为了更好地训练NER模型,我们需要将这些数据划分为多个样本,每个样本作为一个Doc对象。

# 从专利数据文件中加载文本
patent_data = open('data/G06K.txt').read().strip()
print(patent_data[:500])  # 打印前500个字符,查看数据格式

        这些文本是按专利条目分隔的。因此,我们需要将这些文本划分为多个样本,每个样本代表一个专利条目。

# 将数据分割成专利条目,每个条目作为一个样本
patent_texts = patent_data.split('\n\n')
print("样本数量: ", len(patent_texts))
print("第一个专利条目: ", patent_texts[0][:50])

2. 提取技术术语

        接下来,我们将从另一个文件中加载包含技术术语的文本,并使用CountVectorizer从中提取术语。这些术语将用于标注我们的专利文本。

# 从另一个文本文件中加载技术术语
terms = open('data/manyterms.lower.txt').read().lower().strip().split('\n')
print(terms[:10])  # 打印前10个术语
print(f"共 {len(terms)} 个术语")

# 使用CountVectorizer来提取术语,并计算每个术语在文本中的频率
from sklearn.feature_extraction.text import CountVectorizer

cvectorizer = CountVectorizer(vocabulary=terms, lowercase=True, stop_words='english')
X = cvectorizer.fit_transform(patent_texts)

        我们可以统计每个术语在文本中出现的频率:

import numpy as np
# 计算每个术语的出现频率
counts = np.sum(X, axis=0)
vocabs = cvectorizer.get_feature_names_out()

import pandas as pd
# 将结果转为DataFrame,并按频率排序
df = pd.DataFrame(counts, columns=vocabs).T.sort_values(by=0, ascending=False)
print(df.head())  # 打印出现频率最高的术语

3. 使用技术术语进行NER标注

        接下来,我们将利用spaCyPhraseMatcher来根据提取的术语对文本进行NER标注。

import spacy
from spacy.matcher import PhraseMatcher

# 加载空白的spaCy模型
nlp = spacy.blank("en")

# 使用PhraseMatcher创建匹配器
matcher = PhraseMatcher(nlp.vocab)
patterns = list(nlp.pipe(df.index[:25]))  # 将前25个术语作为匹配模式
matcher.add("TECH", patterns)

# 测试PhraseMatcher的效果
doc = nlp("electronic device is very expensive")
matches = matcher(doc)
for match_id, start, end in matches:
    print(f"匹配到的术语: {doc[start:end]}")

4. 创建训练数据集

        我们现在需要创建NER模型的训练和验证数据集。在此过程中,我们使用PhraseMatcher标注每个文本样本中的技术术语。

from spacy.tokens import DocBin, Span
from spacy.util import filter_spans

def create_dataset(texts):
    docs = []
    for doc in nlp.pipe(texts):
        matches = matcher(doc)
        spans = [Span(doc, start, end, label="TECH") for match_id, start, end in matches]
        doc.ents = filter_spans(spans)  # 去除重叠的实体
        docs.append(doc)
    
    # 将数据集按80%/20%划分为训练集和验证集
    train_size = int(len(docs) * 0.8)
    train_docs = docs[:train_size]
    dev_docs = docs[train_size:]
    
    # 将数据保存为spaCy格式
    DocBin(docs=train_docs).to_disk("docs/train.spacy")
    DocBin(docs=dev_docs).to_disk("docs/dev.spacy")

# 创建训练和验证数据集
create_dataset(patent_lines[:10000])  # 使用前10000个样本

5. 生成模型配置文件

        使用spaCy的命令生成训练模型的配置文件。

!python3 -m spacy init config --force configs/tech-config.cfg --lang en --pipeline ner

6. 训练NER模型

        我们可以使用生成的配置文件来训练NER模型。训练时,我们可以选择是否使用GPU。

import spacy
spacy.require_gpu()  # 确保使用GPU加速训练

# 开始训练NER模型
!python3 -m spacy train configs/tech-config.cfg --output ./output --paths.train docs/train.spacy --paths.dev docs/dev.spacy --gpu-id 0

7. 测试模型

训练完成后,我们可以加载训练好的模型,并使用它对新的文本进行标注。

# 加载训练好的模型
nlp = spacy.load("output/model-best")

# 测试模型
doc = nlp("The iPhone is an innovative electronic device.")
print("标注结果:", doc.ents)

# 可视化标注结果
from spacy import displacy
displacy.render(doc, style="ent", jupyter=True)
结语

        在本篇博文中,我们详细展示了如何使用Python和SpaCy从头构建一个技术领域的命名实体识别(NER)模型。通过这一过程,我们涵盖了从数据的获取与清洗、技术术语的提取与匹配、训练集的构建、模型的配置与训练,直到最终的模型测试与可视化。我们结合实际的技术专利文本和技术术语表,成功训练了一个能够识别技术相关实体的NER模型。

        这个项目展示了如何有效地使用自然语言处理技术,结合深度学习来解决实际的文本分析问题。通过这种方法,我们可以自动从技术文档中提取关键信息,为自动化信息提取、文本分类等任务奠定基础。这种方法也可以扩展到其他领域,如医疗、法律、金融等,应用前景广阔。

        《基于Python的人工智能应用案例系列》至此正式完结。从本系列的第一篇开始,我们从基础的机器学习模型逐步深入,涵盖了回归、分类、聚类、生成模型、深度学习网络等多种AI应用场景。在这个过程中,我们不仅讨论了每个算法的理论背景,还通过Python代码实现了这些模型,并展示了如何将它们应用于实际问题中。本系列的最终目标是帮助读者全面了解Python在人工智能领域中的应用,从基础原理到实际项目的完整实现。

        每一篇博文都旨在为技术读者提供深入的技术细节和实用的代码示例。通过这些案例,我们希望读者能够建立起自主解决AI问题的能力,并能将这些知识应用于自己的项目中。我们探讨了从数据科学、机器学习到自然语言处理,再到本篇中的命名实体识别,涵盖了AI应用的多个维度。

        最后,感谢大家的阅读与支持,希望这个系列能够帮助你们在AI之路上走得更远。技术的进步是无止境的,期待大家将所学知识应用到更多创新的项目中,为人工智能的未来贡献自己的力量!

再见,不是结束,而是新的开始!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python进阶--正则表达式

目录 1. 基础匹配 2. 元字符匹配 1. 基础匹配 正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则&#xff…

HyperBDR云容灾“轻装上阵”,露脸魔都写字楼!

回顾今年828,万博智云作为铂金合作伙伴在仪式上惊艳亮相,同时还参与了华为云“云上大咖团”的直播分享,公司明星产品HyperBDR云容灾成功上线了828企业应用一站购平台。就在近日,后续来啦! 一、HyperBDR云容灾楼宇广告…

特斯拉的TTPoE协议到底是啥?比TCP/IP快n倍?真的假的…

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友 最近,在备受瞩目的Hot Chips大会上,特斯拉不仅展示了其最新的DOJO超级计算机项目&#…

叉车AI行人防撞预警系统,提升作业安全与效率

如今,发展飞快的工业蓝海中,叉车作为物流仓储与制造业不可或缺的搬运工具,其安全性一直是行业内外关注的焦点。随着人工智能技术的日益成熟,工业(车辆)叉车AI行人防撞预警系统解决方案应运而生,…

零基础入门AI大模型应用开发,你需要一个系统的学习路径!

前言 随着人工智能技术的迅猛发展,特别是在大型语言模型(LLMs)领域的突破,AI大模型已经成为当今科技领域的热门话题。不论是对于希望转型进入AI行业的职场人士,还是对未来充满憧憬的学生,掌握AI大模型的应…

JS 介绍/书写位置/输入输出语法

目录 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS 的组成 2. JS 书写位置 2.1 内部 JS 2.2 外部 JS 2.3 内联 JS 3. JS 注释和结束符 4. JS 输入输出语法 4.1 输入语法 4.2 输入语句 4.3 执行顺序 5. 字面量 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS …

上海AI Lab视频生成大模型书生.筑梦环境搭建推理测试

引子 最近视频生成大模型层出不穷,上海AI Lab推出新一代视频生成大模型 “书生・筑梦 2.0”(Vchitect 2.0)。根据官方介绍,书生・筑梦 2.0 是集文生视频、图生视频、插帧超分、训练系统一体化的视频生成大模型。OK,那就让我们开始吧。 一、模…

国产长芯微LPQ9008菊花链接口的18单元电池监控器完全P2P替代ADBMS1818

描述 LPQ9008是一款多单元电池堆监控器,可测量多达18个串联连接的电池单元,总测量误差小于3.0 mV。LPQ9008具有0 V至5 V的电池测量范围,适合大多数电池化学应用。可在290 μs内测量所有18个电池单元,并选择较低的数据采集速率以便…

24.10.7(线段树合并,分裂,扫描线,字符串哈希)

星期一: 昨晚熬夜场的div2总算是不负有心人,到C都比较简单,出C后我也没有run的想法,一直在看D,最后5min的时间ac,小小上了波分 贴cf round976 div2 D cf传送门 题意&a…

从学习Java到学习AI大模型,我为什么选择的后者???

我为什么从Java转到AI大模型 在编程的海洋里,Java一直是我信赖的“小船”,载着我航行在代码的世界中。然而,随着行业的不断发展和变化,我开始感受到了一丝的迷茫和不安。我开始担心,随着技术的不断更新,Ja…

银河麒麟桌面操作系统V10 SP1:取消安装应用的安全授权认证

银河麒麟桌面操作系统V10 SP1:取消安装应用的安全授权认证 💖The Begin💖点点关注,收藏不迷路💖 使用银河麒麟V10 SP1安装应用时,若频繁遇到安全授权认证提示,可按以下步骤设置: 打开…

操作系统 | 学习笔记 | 王道 | 4.3 文件系统

4.3 文件系统 4.3.1 文件系统结构 文件系统(File system)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。 用一个例子来辅助记忆文件系统的层次结构: 假设某用户请求删除文件"D:/工作目录/学生信息.xIsx"的最后100条记录。 用户需…

Linux——磁盘分区、挂载

Linux 分区 原理介绍 原理图如下 当我们在/home目录下新建一个文件a.txt时,该文件实际上是存放在硬盘B的分区1中的,这就是图里说的,当进入某个目录,可以进入到该目录下挂载的分区里的意思 硬盘说明 应用实例:挂载一个…

镁稀土中间合金的耐腐蚀性

镁稀土中间合金,也称作镁稀土合金,是一种重要的合金材料,由镁、稀土元素(如镧、铈、镨、钕、钷、钐、铕、钆、铽、镝、钬、铒、镱、镥等)以及其他可能的金属元素(如铝、锶、锆、钙等)组成。以下是对镁稀土中间合金的详细介绍: 一、…

六、索引的数据结构

文章目录 1. 为什么使用索引2. 索引及其优缺点2.1 索引概述2.2 优点2.3 缺点3. InnoDB中索引的推演3.1 索引之前的查找3.1.1 在一个页中的查找3.1.2 在很多页中查找3.2 设计索引3.2.1 一个简单的索引设计方案3.2.2 InnoDB中的索引方案3.3 常见索引概念3.3.1 聚簇索引3.3.2 二级…

CPU Study - Recovery when Prediction Fails

参考来源:《超标量处理器设计》—— 姚永斌 分支预测失败时,这条分支指令之后的所有指令都处在了错误的路径上(mis-prediction)。 这些指令都会被抹除掉 ,从而造成很多bubble,降低处理器性能,称…

数学概念算法-打印100以内的素/质数

素数:只能被1和自己整除的数 暴力破解 埃氏筛选 找到第一个数字,如果它是素数,则把它的倍数全部划掉 比如数字2是素数,那么 4,6,8,10,12。这些数字肯定不是素数,所以不用再考虑,直接划掉即可 第二步&#…

ROS理论与实践学习笔记——3 ROS运行管理之ROS话题名称设置

名称重映射是为名称起别名,为名称添加前缀,该实现比节点重名更复杂些,不单是使用命名空间作为前缀、还可以使用节点名称最为前缀。两种策略的实现途径有多种: (1)rosrun 命令 (2)launch 文件 …

camody卡魔迪-准备新一年双十一推出iPhone快充充电宝

随着双十一购物节的临近,各大品牌纷纷推出创新产品以吸引消费者的目光。近日,知名科技品牌Camody卡魔迪宣布将在今年双十一期间推出一款全新的iPhone快充充电宝。这款充电宝不仅具备快速充电功能,还兼具时尚设计和便携性,预计将成…

ArcGIS中分区统计栅格值前需要进行投影吗(在投影坐标系下进行吗),为什么?

最近,我接到了一个分区统计栅格数值前需要进行投影,或者说是必须需要在投影坐标系下进行吗的咨询。 答案是不需要刻意去变。 但是他又说他把地理坐标系下分区统计结果与投影坐标系下的分区统计结果分别做了一遍,并进行了对比,两个…