对xml文件中标题和内容节点做命名实体识别

1.具体步骤:分词,测试标注,实体识别

#  -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import sys

reload(sys)
sys.setdefaultencoding('utf8')
# 要保证正常运行,请参照最后的完整代码附录

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

class extractEntity:

    def __init__(self,persons,locations,institutions):
        #使用set可以避免重复元素
        persons = set()
        locations = set()
        institutions = set()

    # 分句,也就是将一片文本分割为独立的句子
    def sentence_splitter(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):
        sents = SentenceSplitter.split(sentence)  # 分句
        # print '\n'.join(sents)

    # 分词测试
    def segmentor(self,sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):
        segmentor = Segmentor()  # 初始化实例
        segmentor.load('/Users/Zd/Downloads/ltp_data_v3.4.0/cws.model')  # 加载模型
        words = segmentor.segment(sentence)  # 分词
    # #默认可以这样输出
    # print '\t'.join(words)
    # 可以转换成List 输出
        words_list = list(words)
        segmentor.release()  # 释放模型
        return words_list


    # 测试标注
    def posttagger(self,words):
        postagger = Postagger()  # 初始化实例
        postagger.load('/Users/Zd/Downloads/ltp_data_v3.4.0/pos.model')  # 加载模型
        postags = postagger.postag(words)  # 词性标注
        # for word,tag in zip(words,postags):
            # print word+'/'+tag
        postagger.release()  # 释放模型
        return postags


    # 命名实体识别
    def ner(self,words, postags):
        recognizer = NamedEntityRecognizer()  # 初始化实例
        recognizer.load('/Users/Zd/Downloads/ltp_data_v3.4.0/ner.model')  # 加载模型
        netags = recognizer.recognize(words, postags)  # 命名实体识别

        for word, ntag in zip(words, netags):
            # print word + '/' + ntag
            if ntag == 'S-Nh':
                self.persons.add(word)
                # print "人名:"+word
            elif ntag == 'S-Ns':
                self.locations.add(word)
                # print "地名:" + word
            elif ntag == 'S-Ni':
                self.institutions.add(word)
                # print "机构名:" + word

        recognizer.release()  # 释放模型
        return netags


    # 依存语义分析
    def parse(self,words, postags):
        parser = Parser()  # 初始化实例
        parser.load('/Users/Zd/Downloads/ltp_data_v3.4.0/parser.model')  # 加载模型
        arcs = parser.parse(words, postags)  # 句法分析
        print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)
        parser.release()  # 释放模型
        return arcs


    # 角色标注
    def role_label(self,words, postags, netags, arcs):
        labeller = SementicRoleLabeller()  # 初始化实例
        labeller.load('/Users/Zd/Downloads/ltp_data_v3.4.0/srl')  # 加载模型
        roles = labeller.label(words, postags, netags, arcs)  # 语义角色标注
        for role in roles:
            print role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])
        labeller.release()  # 释放模型

tree = ET.parse('/Users/Zd/Desktop/newsSpider/newsSpider/extractEntity/scrawlToXML.xml')
root = tree.getroot()
#实例化,调用类,并赋予参数
ee = extractEntity(set,set,set)
for element in root.iter('head'):

    # add element:persons,locations,institutions
    p = ET.SubElement(element,'persons')
    p.text = ''
    l = ET.SubElement(element, 'locations')
    l.text = ''
    i = ET.SubElement(element, 'institutions')
    i.text = ''

    #str = element.text.encode('utf-8')
    #print element.text
    if element.text is not None:
        #分词
        words = ee.segmentor(element.text.encode('utf-8'))
        #测试标注
        tags = ee.posttagger(words)
        #每条新闻开始,要将set赋予空
        ee.persons = set()
        ee.locations = set()
        ee.institutions = set()
        #命名实体识别
        netags = ee.ner(words, tags)
        for s in ee.persons:
            #print type(s) str
            #拼接人名
            p.text = p.text + ' ' + s
        #print p.text
        for s in ee.locations:
            #print type(s)
            l.text = l.text + ' ' + s
        for s in ee.institutions:
            #print type(s)
            i.text = i.text + ' ' + s
        #print i.text


for element in root.iter('content'):

    # add element:persons,locations,institutions
    p = ET.SubElement(element,'persons')
    p.text = ''
    l = ET.SubElement(element, 'locations')
    l.text = ''
    i = ET.SubElement(element, 'institutions')
    i.text = ''

    #str = element.text.encode('utf-8')
    #print element.text
    if element.text is not None:
        words = ee.segmentor(element.text.encode('utf-8'))
        tags = ee.posttagger(words)
        ee.persons = set()
        ee.locations = set()
        ee.institutions = set()
        netags = ee.ner(words, tags)
        for s in ee.persons:
            #print type(s)
            p.text = p.text + ' ' + s
        #print p.text
        for s in ee.locations:
            #print type(s)
            l.text = l.text + ' ' + s
        for s in ee.institutions:
            #print type(s)
            i.text = i.text + ' ' + s
        #print i.text
#生成新的xml文件
tree.write('entity.xml',encoding='utf-8')

# element.text
# segmentor(element.nodeValue)
# #测试分句子
# print('******************测试将会顺序执行:**********************')

# sentence_splitter()
# print('###############以上为分句子测试###############')

# 测试分词
# words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?还有,微博是MebiuW')
# print('###############以上为分词测试###############')

# 测试标注
# tags = posttagger(words)
# print('###############以上为词性标注测试###############')

# 命名实体识别
#netags = ner(words, tags)
#print('###############以上为命名实体识别测试###############')

# 依存句法识别
# arcs = parse(words,tags)
# print('###############以上为依存句法测试###############')

# #角色标注
# roles = role_label(words,tags,netags,arcs)
# print('###############以上为角色标注测试###############')

# 测试分句子
# sentence_splitter()
# 测试分词
# words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?')
# 测试标注
# tags = posttagger(words)
# 命名实体识别
# ner(words,tags)

2.code参考:

https://blog.csdn.net/MebiuW/article/details/52496920

3.ltp的API:

https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id4

4.xml文档中节点CRUD操作的参考:

https://blog.csdn.net/lihao21/article/details/72891932
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 常用概念: 自然语言处理(NLP) 数据挖掘 推荐算法 用户画像 知识图谱 信息检索 文本分类 常用技术: 词级别...
    御风之星阅读 9,175评论 1 25
  • 国庆节舅舅送给我一个布娃娃,是个越南小女孩布娃娃,她穿着旗袍,头发长长的,非常漂亮。
    刘博瑜阅读 246评论 0 0
  • 人类思维的基本形式 人类的心智活动或者称头脑功能的形式可大致分为情感与理性两大类,广义地可以统称为思维活动,但...
    湖北立春阅读 1,193评论 0 5
  • 学习tint的目的: 1.一张矢量图适配所有颜色(妈妈再也不要担心我找图了)。2.更优雅的selector实现方式...
    阿飞咯阅读 18,795评论 24 64