前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「Python实战项目」针对医疗数据进行命名实体识别

「Python实战项目」针对医疗数据进行命名实体识别

作者头像
小小科
修改于 2020-08-13 09:57:20
修改于 2020-08-13 09:57:20
1.8K0
举报
文章被收录于专栏:北京马哥教育北京马哥教育

一.什么是命名实体识别

二.基于NLTK的命名实体识别

三.基于Stanford的NER

四.【实战案例】医学糖尿病数据命名实体识别

一 、什么是命名实体识别?

命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。通常包括两部分:(1)实体边界识别;(2) 确定实体类别(人名、地名、机构名或其他)。

命名实体识别通常是知识挖掘、信息抽取的第一步,被广泛应用在自然语言处理领域。接下来,我们将介绍常用的两种命名实体识别的方法。

二 、基于NLTK的命名实体识别:

NLTK:由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项NLP领域的功能。

使用前需要先下载NLTK,下载地址为:http://pypi.python.org/pypi/nltk,安装完成后,在python环境下输入import nltk测试是否安装成功,然后输入nltk.download()下载nltk所需要的数据包,完成安装。

Python代码实现(注意文件的编码格式为utf-8无BOM格式):

– coding: utf-8 –

import sys

reload(sys)

sys.setdefaultencoding(‘utf8’) #让cmd识别正确的编码

import nltk

newfile = open(‘news.txt’)

text = newfile.read() #读取文件

tokens = nltk.word_tokenize(text) #分词

tagged = nltk.pos_tag(tokens) #词性标注

entities = nltk.chunk.ne_chunk(tagged) #命名实体识别

a1=str(entities) #将文件转换为字符串

file_object = open(‘out.txt’, ‘w’)

file_object.write(a1) #写入到文件中

file_object.close( )

print entities

具体的方法可参考NLTK官网介绍:http://www.nltk.org/,输出的结果为:

>>> entities = nltk.chunk.ne_chunk(tagged)

>>> entities

Tree(‘S’, [(‘At’, ‘IN’), (‘eight’, ‘CD’), (“o’clock”, ‘JJ’),

(‘on’, ‘IN’), (‘Thursday’, ‘NNP’), (‘morning’, ‘NN’),

Tree(‘PERSON’, [(‘Arthur’, ‘NNP’)]),

(‘did’, ‘VBD’), (“n’t”, ‘RB’), (‘feel’, ‘VB’),

(‘very’, ‘RB’), (‘good’, ‘JJ’), (‘.’, ‘.’)])

当然为了方便查看,我们可以以树结构的形式把结果绘制出来:

>>> from nltk.corpus import treebank

>>> t = treebank.parsed_sents(‘wsj_0001.mrg’)[0]

>>> t.draw()

三 、基于Stanford的NER:

Stanford Named Entity Recognizer (NER)是斯坦福大学自然语言研究小组发布的成果之一,主页是:http://nlp.stanford.edu/software/CRF-NER.shtml。Stanford NER 是一个Java实现的命名实体识别(以下简称NER))程序。NER将文本中的实体按类标记出来,例如人名,公司名,地区,基因和蛋白质的名字等。

NER基于一个训练而得的Model(模型可识别出 Time, Location, Organization, Person, Money, Percent, Date)七类属性,其用于训练的数据即大量人工标记好的文本,理论上用于训练的数据量越大,NER的识别效果就越好。

因为原始的NER是基于java实现的,所以在使用Python编程之前,要确保自己电脑上已经安装了jar1.8的环境(否则会报关于Socket的错误)。

然后我们使用Pyner使用python语言实现命名实体识别。下载地址为:https://github.com/dat/pyner

安装Pyner:解压下载的Pyner,命令行中将工作目录切换到Pyner文件夹下, 输入命令 :python setup.py install 完成安装.

接下来,还需要下载StanfordNER工具包,下载地址为:http://nlp.stanford.edu/software/stanford-ner-2014-01-04.zip,然后在解压后的目录打开cmd命令窗体,执行,java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer -loadClassifier classifiers/english.muc.7class.distsim.crf.ser.gz -port 8080 -outputFormat inlineXML,直到结果为:Loading classifier from classifiers/english.muc.7class.distsim.crf.ser.gz … done [1.2 sec].

以上操作是因为斯坦福的命名实体识别是基于java的socket写的,所以必要保证有一个窗题与我们执行的命令通信。最后,我们终于可以使用python编程实现NER了:

import ner

import sys

import nltk

reload(sys)

sys.setdefaultencoding(‘utf8’)

newfile = open(‘news.txt’)

text = newfile.read()

tagger = ner.SocketNER(host=’localhost’, port=8080)#socket编程

result=tagger.get_entities(text) #stanford实现NER

a1=str(result)

file_object = open(‘outfile.txt’, ‘w’)

file_object.write(a1)

file_object.close( )

print result

文章转载于马哥教育官网!

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
Java 并发编程中,锁是避免并发冲突的重要机制,但如果使用不当,容易产生死锁和活锁等问题,甚至导致饥饿等高级问题。下面将对死锁、活锁以及饥饿这三个问题进行详细的介绍和区分。
用户1289394
2023/08/22
3300
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
深入理解 Java 多线程核心知识:跳槽面试必备
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。
小柒2012
2018/04/20
9430
深入理解 Java 多线程核心知识:跳槽面试必备
java高并发系列-第1天:必须知道的几个概念
接下来一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。
路人甲Java
2019/12/10
8560
java高并发系列-第1天:必须知道的几个概念
你了解 Java 的各种锁吗?
安全性和活跃度通常相互牵制。我们使用锁来保证线程安全,但是滥用锁可能引起锁顺序死锁。类似地,我们使用线程池和信号量来约束资源的使用。
JavaFish
2019/10/17
6400
你了解 Java 的各种锁吗?
java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。 举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这样一直争执下去等待对方还而又得不到解决,老师知道此事后就让他们相互还给对方,这样在外力的干预下他们才解决,当然
Java技术栈
2018/03/30
9410
计算机操作系统——锁的进化
相信大家都知道金鱼是不知道饥饿的,如果有食物吃,金鱼就会不停的填饱肚子,哪怕被撑死。在计算机中锁的进化可以用金鱼生存的例子来引入。
陌无崖
2020/07/27
5960
死锁、活锁、饥饿锁、无锁
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。
一个会写诗的程序员
2020/05/26
2.1K0
JAVA并发之加锁导致的活跃性问题剖析
但是加锁也为我们带来了诸多问题 如:死锁,活锁,线程饥饿等问题 这一章我我们主要处理锁带来的问题. 首先就是最出名的死锁
Java宝典
2020/12/04
1.1K0
死锁、饥饿和活锁
死锁: 经典例子:“哲学家进餐”问题。 死锁的解决: 数据库服务器解决死锁:数据库系统中考虑了检测死锁和从死锁中恢复。当数据库服务器检测到死锁时(通常在表示等待关系的有向图中搜索循环),将选择一个牺牲者并放弃这个事务。作为牺牲者的事务会放弃它持有的所有资源,从而使其他事务继续执行。然后可以重新执行被强制终止的事务。 JVM解决死锁:JVM在解决死锁只能终止并重启。 死锁的产生: 锁顺序死锁: 两个线程试图以不同的顺序来获得相同的锁,那么就用可能发生死锁。 public class LeftRightLock
SuperHeroes
2018/05/31
1.3K0
Java并发编程实战 05等待-通知机制和活跃性问题
Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 Java并发编程实战 04死锁了怎么办
Johnson木木
2020/05/21
4900
Java多线程编程(三)一>详解synchronized, 死锁,wait和notify
synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行 到同⼀个对象 synchronized 就会阻塞等待.
用户11305962
2024/11/21
1790
Java多线程编程(三)一>详解synchronized, 死锁,wait和notify
聊聊Java中的那些锁
说到Java中锁的分类,有很多种。本文就来聊聊公平锁、非公平锁、可重入锁、独占锁、共享锁和自旋锁。
贪挽懒月
2019/05/14
3320
聊聊Java中的那些锁
【Linux】:多线程(读写锁 && 自旋锁)
🔥 读写锁(Read-Write Lock)是一种用于多线程环境下同步访问共享资源的锁。它与传统的互斥锁(Mutex)有所不同,提供了更细粒度的控制,以便提高并发性能。它允许多个线程同时 读取 数据,但在写入数据时,必须确保只有一个线程可以进行写操作,并且在写操作期间,所有的读操作都必须等待。
IsLand1314
2024/12/20
2600
【Linux】:多线程(读写锁 && 自旋锁)
我是一个线程 0x3704
转自新浪博客,来自百度搜索。 原作者:2016-03-30 IBM刘欣 程序猿      我是一个线程, 我一出生就被编了个号: 0x3704,  然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴。我身边的同伴0x6900 待的时间比较长, 他带着沧桑的口气对我说:我们线程的宿命就是处理包裹。 把包裹处理完以后还得马上回到这里,否则可能永远回不来了。我一脸懵懂,包裹,什么包裹?”不要着急,马上你就会明白了, 我们这里是不养闲人的。“        果然,没多久,屋子的门开了, 一个
霡霂
2018/06/04
8440
Python3 与 C# 并发编程之~ 线程篇3
在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的,eg:一个线程获取了第一个锁,然后在获取第二个锁的 时候发生阻塞,那么这个线程就可能阻塞其他线程的执行,从而导致整个程序假死。
逸鹏
2018/09/07
4760
Python3 与 C# 并发编程之~ 线程篇3
Java并发编程与高并发解决方案
并发:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,高速切换感觉同时执行。如果运行多核处理器上,此时,程序中的每个线程将分配到一个处理器核上,因此可以真正的同时运行。
用户1212940
2022/04/13
1.1K0
Java并发编程与高并发解决方案
Java死锁、活锁,悲观锁、乐观锁
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 
红目香薰
2022/11/29
4910
以生活例子说明单线程与多线程
在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能与用户体验。
哲洛不闹
2018/09/18
4350
以生活例子说明单线程与多线程
Java多线程-线程唤醒机制详解
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法放弃cpu执行权,进入WAITTING状态;
訾博ZiBo
2025/01/06
660
Java多线程-线程唤醒机制详解
死锁与活锁的区别,死锁与饥饿的区别
死锁:是指两个或两个以上的进程( 或线程) 在执行过程中,因争夺资源而造成的一种==互相等待==的现象,若无外力作用, 它们都将无法推进下去。
鳄鱼儿
2024/05/21
1720
推荐阅读
相关推荐
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档