具体学科下构建数据集进行命名实体识别的方案(整体步骤第二步)

学科领域词性构建
摘要由CSDN通过智能技术生成

项目场景:

提示:这里简述项目相关背景:

上一篇中写到将存在关键词的句子进行定位,因此这篇中主要工作就是将关键词前后存在的具体有用的词语给提取出来。


NLTK词性重新分析定义

NLTK词性分析可以将句子中每个单词的词性用统一的标准呈现,这里我选取了新闻语料库的词性包,那问题来了,你为什么要选择这个包,原因是这样的,当你定义统一的标准,在统一的标准下定义前后词性,那么错的也是对的,对的也会是对的。同理什么是词性,比如NNP代表专有名词,CD代表数字,JJ代表形容词,NN代表名词,例如 5 MA则在词性中代表 CD NN。这样我只要将关键词前后词性重新定义那理论上我就可以拿到我需要的关键词。如果这样,那么将会产生两个新的问题,第一个问题如关键词前面出现两个或多个我需要的怎么半,这里我只定义两个词性,为什么只定义两个,是这样的举个例子,A B Formation 这三个单词是我需要的,在句子中我只需要定义词性为NNP的词组或单词,记住是词组或单词,在词性中这三个单词可能为 CD NN NNP,我定义NN + NNP = NNP,CD + NNP = NNP。这样我就能把前面需要的都拿下。其实依旧存在一个问题是,会多拿一个单词,或者拿错,拿错好处理,我可以用词典在匹配一下,把没有关键词的但符合词性的全部去掉。拿多拿一个呢,这很难处理,目前在没有数据集的情况下,没有人力去打标签的情况下,这已经是最优解了,多错一个在整理上来看是个小事,只要词性定义将正确的标签以远多余错误的,或者数据量足够大,就可以解决。第二个问题,为什么不用市面上现有的命名体识别包,如standfordcorenlp,拿举过 的例子为例 5 MA MA 在地学中代表百万年,但是MA在其他包中代表玛丽的意思。因此我需要重新定义适合具体项目的词性和后面的数据集。基于这两点,这便是我为什么要重新定义词性的原因。这样可以根据自己的需求,而改变最基础的数据集。


代码呈现:

这里有很多额外的功能,如找m|km|kilometer|meter,这里地名的寻找我就用了现有的包,去寻找地名,原因是这是通用词语,而不是地学特殊词语,就不需要弄。这里输出的是Txt文档,原本我想直接输出Doc文档,但是不行,我便在代码里面隐藏去除了。又重新写了Txt写入Doc文档。

__author__ = "Huzhichen"
# coding=UTF-8
import os
from time import sleep

import nltk
from stanfordcorenlp import StanfordCoreNLP

from nltk.corpus import brown
import re
from collections import Counter
from docx import Document
from docx.shared import RGBColor
brown_train = brown.tagged_sents(categories='news')
regexp_tagger = nltk.RegexpTagger(
unigram_tagger = nltk.UnigramTagger(brown_train, backoff=regexp_tagger)
bigram_tagger = nltk.BigramTagger(brown_train, backoff=unigram_tagger)

# This is our semi-CFG; Extend it according to your own needs
#############################################################################
#############################################################################
class NPExtractor(object):
    def __init__(self, sentence):
        self.sentence = sentence
    def dict(self):
        Dict = []
        # 打开字典并去掉换行符
        with open("../duc.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()
            # 去除换行符
            result = ([x.strip() for x in lines if x.strip() != ''])
            # 将整理好字典提取成为全局字典
            for x in result:
                Dict.append(x)
        return Dict

    def geosubstance(self):
        geo = []
        # 打开字典并去掉换行符
        with open("../geosubstance1.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()
            # 去除换行符
            result = ([x.strip() for x in lines if x.strip() != ''])
            # 将整理好字典提取成为全局字典
            for x in result:
                geo.append(x)
        return geo
    # Split the sentence into singlw words/tokens
    def tokenize_sentence(self, sentence):
        tokens = nltk.word_tokenize(sentence)
        return tokens
    # Normalize brown corpus' tags ("NN", "NN-PL", "NNS" > "NN")
    def normalize_tags(self, tagged):
        n_tagged = []
        for t in tagged:
            if t[1] == "NP-TL" or t[1] == "NP":
                n_tagged.append((t[0], "NNP"))
                continue
            if t[1].endswith("-TL"):
                n_tagged.append((t[0], t[1][:-3]))
                continue
            if t[1].endswith("S"):
                n_tagged.append((t[0], t[1][:-1]))
                continue
            n_tagged.append((t[0], t[1]))
        return n_tagged
    # Extract the main topics from the sentence
  
        while merge:
            merge = False
            for x in range(0, len(tags) - 1):
                t1 = tags[x]
                t2 = tags[x + 1]
                key = "%s+%s" % (t1[1], t2[1])
                value = cfg.get(key, '')
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经常喝假酒的胡小臣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值