精华内容
下载资源
问答
  • 序列模型实现词性标注
    2020-09-22 11:57:17

    今天我们来看看 NLP 中一个很重要且基本的问题:POS。

    什么是 POS?

    POS:Part-of-speech tagging,即词性标注,这是一种序列标注问题,就是输入一个句子,输出每个词在这句话中的词性是什么。例如,“我喜欢吃酸辣的热狗”这句话中,“我”和“热狗”是名词,“喜欢”和“吃”是动词,“酸辣的”是个形容词。

    词性种类集合是预先定义好的,单词的词性也是取决于上下文的,即同样的词在不同的语境中词性可能会有所不同。

    为什么要做 POS?

    正确地识别词性会有助于理解一些语言问题,比如当我们遇到了有歧义的句子,有时通过标出词性就能知道真正的意思。知道了哪个是名词,我们就知道这句话涉及了哪些主体,知道了动词是什么,就知道主体之间要做什么,知道哪些是形容词,就可以了解事物的属性如何。

    词性标注还经常作为其他自然语言处理任务的特征,例如在 parsing 解析,relation extraction 关系提取,命名实体识别,情感分析,问答系统,自动生成文本等任务中都会用到词性标注。

    此外 POS 还经常和词形还原一起作为预处理的步骤, 例如在情感分析任务中,如果我们想要识别讽刺性的话语,在预处理中就可以做下面几步:

    • 文字清洗:将对任务没有帮助的信息去掉,如去掉标点数字等字符。
    • 标记:将一串文本分解为单词,短语,符号等有意义的元素。
    • 词形还原:
    更多相关内容
  • #名词介宾短语 } map_dict = {} for flag, tags in tag_dict.items(): for tag in tags: map_dict[tag] = flag return map_dict """根据定义的标签,对词性进行标签化""" def transfer_tags(self, postags): tags = ...

    书山有路勤为径,学海无涯苦作舟

    1.基于Jieba实现文本的三元组抽取

    定义函数

    # coding=utf-8
    import re, os
    import jieba.posseg as pseg
    
    class ExtractEvent:
        def __init__(self):
            self.map_dict = self.load_mapdict()
            self.minlen = 2
            self.maxlen = 30
            self.keywords_num = 20
            self.limit_score = 10
            self.IP = "(([NERMQ]*P*[ABDP]*)*([ABDV]{1,})*([NERMQ]*)*([VDAB]$)?([NERMQ]*)*([VDAB]$)?)*"
            self.IP = "([NER]*([PMBQADP]*[NER]*)*([VPDA]{1,}[NEBRVMQDA]*)*)"
            self.MQ = '[DP]*M{1,}[Q]*([VN]$)?'
            self.VNP = 'V*N{1,}'
            self.NP = '[NER]{1,}'
            self.REN = 'R{2,}'
            self.VP = 'P?(V|A$|D$){1,}'
            self.PP = 'P?[NERMQ]{1,}'
            self.SPO_n = "n{1,}"
            self.SPO_v = "v{1,}"
            self.stop_tags = {'u', 'wp', 'o', 'y', 'w', 'f', 'u', 'c', 'uj', 'nd', 't', 'x'}
            self.combine_words = {"首先", "然后", "之前", "之后", "其次", "接着"}
    
        """构建映射字典"""
        def load_mapdict(self):
            tag_dict = {
                'B': 'b'.split(),  # 时间词
                'A': 'a d'.split(),  # 时间词
                'D': "d".split(),  # 限定词
                'N': "n j s zg en l r".split(),  #名词
                "E": "nt nz ns an ng".split(),  #实体词
                "R": "nr".split(),  #人物
                'G': "g".split(),  #语素
                'V': "vd v va i vg vn g".split(), #动词
                'P': "p f".split(),  #介词
                "M": "m t".split(),  #数词
                "Q": "q".split(), #量词
                "v": "V".split(), #动词短语
                "n": "N".split(), #名词介宾短语
            }
            map_dict = {}
            for flag, tags in tag_dict.items():
                for tag in tags:
                    map_dict[tag] = flag
            return map_dict
    
        """根据定义的标签,对词性进行标签化"""
        def transfer_tags(self, postags):
            tags = [self.map_dict.get(tag[:2], 'W') for tag in postags]
            return ''.join(tags)
    
        """抽取出指定长度的ngram"""
        def extract_ngram(self, pos_seq, regex):
            ss = self.transfer_tags(pos_seq)
            def gen():
                for s in range(len(ss)):
                    for n in range(self.minlen, 1 + min(self.maxlen, len(ss) - s)):
                        e = s + n
                        substr = ss[s:e]
                        if re.match(regex + "$", substr):
                            yield (s, e)
            return list(gen())
    
        '''抽取ngram'''
        def extract_sentgram(self, pos_seq, regex):
            ss = self.transfer_tags(pos_seq)
            def gen():
                for m in re.finditer(regex, ss):
                    yield (m.start(), m.end())
            return list(gen())
    
        """指示代词替换,消解处理"""
        def cite_resolution(self, words, postags, persons):
            if not persons and 'r' not in set(postags):
                return words, postags
            elif persons and 'r' in set(postags):
                cite_index = postags.index('r')
                if words[cite_index] in {"其", "他", "她", "我"}:
                    words[cite_index] = persons[-1]
                    postags[cite_index] = 'nr'
            elif 'r' in set(postags):
                cite_index = postags.index('r')
                if words[cite_index] in {"为何", "何", "如何"}:
                    postags[cite_index] = 'w'
            return words, postags
    
        """抽取量词性短语"""
        def extract_mqs(self, wds, postags):
            phrase_tokspans = self.extract_sentgram(postags, self.MQ)
            if not phrase_tokspans:
                return []
            phrases = [''.join(wds[i[0]:i[1]])for i in phrase_tokspans]
            return phrases
    
        '''抽取动词性短语'''
        def get_ips(self, wds, postags):
            ips = []
            phrase_tokspans = self.extract_sentgram(postags, self.IP)
            if not phrase_tokspans:
                return []
            phrases = [''.join(wds[i[0]:i[1]])for i in phrase_tokspans]
            phrase_postags = [''.join(postags[i[0]:i[1]]) for i in phrase_tokspans]
            for phrase, phrase_postag_ in zip(phrases, phrase_postags):
                if not phrase:
                    continue
                phrase_postags = ''.join(phrase_postag_).replace('m', '').replace('q','').replace('a', '').replace('t', '')
                if phrase_postags.startswith('n') or phrase_postags.startswith('j'):
                    has_subj = 1
                else:
                    has_subj = 0
                ips.append((has_subj, phrase))
            return ips
    
        """分短句处理"""
        def split_short_sents(self, text):
            return [i for i in re.split(r'[,,]', text) if len(i)>2]
        """分段落"""
        def split_paras(self, text):
            return [i for i in re.split(r'[\n\r]', text) if len(i) > 4]
    
        """分长句处理"""
        def split_long_sents(self, text):
            return [i for i in re.split(r'[;。:; :??!!【】▲丨|]', text) if len(i) > 4]
    
        """移出噪声数据"""
        def remove_punc(self, text):
            text = text.replace('\u3000', '').replace("'", '').replace('“', '').replace('”', '').replace('▲','').replace('” ', "”")
            tmps = re.findall('[\(|(][^\((\))]*[\)|)]', text)
            for tmp in tmps:
                text = text.replace(tmp, '')
            return text
    
        """保持专有名词"""
        def zhuanming(self, text):
            books = re.findall('[<《][^《》]*[》>]', text)
            return books
    
        """对人物类词语进行修正"""
        def modify_nr(self, wds, postags):
            phrase_tokspans = self.extract_sentgram(postags, self.REN)
            wds_seq = ' '.join(wds)
            pos_seq = ' '.join(postags)
            if not phrase_tokspans:
                return wds, postags
            else:
                wd_phrases = [' '.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
                postag_phrases = [' '.join(postags[i[0]:i[1]]) for i in phrase_tokspans]
                for wd_phrase in wd_phrases:
                    tmp = wd_phrase.replace(' ', '')
                    wds_seq = wds_seq.replace(wd_phrase, tmp)
                for postag_phrase in postag_phrases:
                    pos_seq = pos_seq.replace(postag_phrase, 'nr')
            words = [i for i in wds_seq.split(' ') if i]
            postags = [i for i in pos_seq.split(' ') if i]
            return words, postags
    
        """对人物类词语进行修正"""
        def modify_duplicate(self, wds, postags, regex, tag):
            phrase_tokspans = self.extract_sentgram(postags, regex)
            wds_seq = ' '.join(wds)
            pos_seq = ' '.join(postags)
            if not phrase_tokspans:
                return wds, postags
            else:
                wd_phrases = [' '.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
                postag_phrases = [' '.join(postags[i[0]:i[1]]) for i in phrase_tokspans]
                for wd_phrase in wd_phrases:
                    tmp = wd_phrase.replace(' ', '')
                    wds_seq = wds_seq.replace(wd_phrase, tmp)
                for postag_phrase in postag_phrases:
                    pos_seq = pos_seq.replace(postag_phrase, tag)
            words = [i for i in wds_seq.split(' ') if i]
            postags = [i for i in pos_seq.split(' ') if i]
            return words, postags
    
        '''对句子进行分词处理'''
        def cut_wds(self, sent):
            wds = list(pseg.cut(sent))
            postags = [w.flag for w in wds]
            words = [w.word for w in wds]
            return self.modify_nr(words, postags)
    
        """移除噪声词语"""
        def clean_wds(self, words, postags):
            wds = []
            poss =[]
            for wd, postag in zip(words, postags):
                if postag[0].lower() in self.stop_tags:
                    continue
                wds.append(wd)
                poss.append(postag[:2])
            return wds, poss
    
        """检测是否成立, 肯定需要包括名词"""
        def check_flag(self, postags):
            if not {"v", 'a', 'i'}.intersection(postags):
                return 0
            return 1
    
        """识别出人名实体"""
        def detect_person(self, words, postags):
            persons = []
            for wd, postag in zip(words, postags):
                if postag == 'nr':
                    persons.append(wd)
            return persons
    
        """识别出名词性短语"""
        def get_nps(self, wds, postags):
            phrase_tokspans = self.extract_sentgram(postags, self.NP)
            if not phrase_tokspans:
                return [],[]
            phrases_np = [''.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
            return phrase_tokspans, phrases_np
    
        """识别出介宾短语"""
        def get_pps(self, wds, postags):
            phrase_tokspans = self.extract_sentgram(postags, self.PP)
            if not phrase_tokspans:
                return [],[]
            phrases_pp = [''.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
            return phrase_tokspans, phrases_pp
    
        """识别出动词短语"""
        def get_vps(self, wds, postags):
            phrase_tokspans = self.extract_sentgram(postags, self.VP)
            if not phrase_tokspans:
                return [],[]
            phrases_vp = [''.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
            return phrase_tokspans, phrases_vp
    
        """抽取名动词性短语"""
        def get_vnps(self, s):
            wds, postags = self.cut_wds(s)
            if not postags:
                return [], []
            if not (postags[-1].endswith("n") or postags[-1].endswith("l") or postags[-1].endswith("i")):
                return [], []
            phrase_tokspans = self.extract_sentgram(postags, self.VNP)
            if not phrase_tokspans:
                return [], []
            phrases_vnp = [''.join(wds[i[0]:i[1]]) for i in phrase_tokspans]
            phrase_tokspans2 = self.extract_sentgram(postags, self.NP)
            if not phrase_tokspans2:
                return [], []
            phrases_np = [''.join(wds[i[0]:i[1]]) for i in phrase_tokspans2]
            return phrases_vnp, phrases_np
    
        """提取短语"""
        def phrase_ip(self, content):
            try:
                spos = []
                events = []
                content = self.remove_punc(content)
                paras = self.split_paras(content)
                for para in paras:
                    long_sents = self.split_long_sents(para)
                    for long_sent in long_sents:
                        persons = []
                        short_sents = self.split_short_sents(long_sent)
                        for sent in short_sents:
                            words, postags = self.cut_wds(sent)
                            person = self.detect_person(words, postags)
                            words, postags = self.cite_resolution(words, postags, persons)
                            words, postags = self.clean_wds(words, postags)
                            #print(words,postags)
                            ips = self.get_ips(words, postags)
                            persons += person
                            for ip in ips:
                                events.append(ip[1])
                                wds_tmp = []
                                postags_tmp = []
                                words, postags = self.cut_wds(ip[1])
                                verb_tokspans, verbs = self.get_vps(words, postags)
                                pp_tokspans, pps = self.get_pps(words, postags)
                                tmp_dict = {str(verb[0]) + str(verb[1]): ['V', verbs[idx]] for idx, verb in enumerate(verb_tokspans)}
                                pp_dict = {str(pp[0]) + str(pp[1]): ['N', pps[idx]] for idx, pp in enumerate(pp_tokspans)}
                                tmp_dict.update(pp_dict)
                                sort_keys = sorted([int(i) for i in tmp_dict.keys()])
                                for i in sort_keys:
        #                             print(i)
                                    if i < 10:
                                        i = '0' + str(i)
                                    wds_tmp.append(tmp_dict[str(i)][-1])
                                    postags_tmp.append(tmp_dict[str(i)][0])
                                wds_tmp, postags_tmp = self.modify_duplicate(wds_tmp, postags_tmp, self.SPO_v, 'V')
                                wds_tmp, postags_tmp = self.modify_duplicate(wds_tmp, postags_tmp, self.SPO_n, 'N')
                                if len(postags_tmp) < 2:
                                    continue
                                seg_index = []
                                i = 0
                                for wd, postag in zip(wds_tmp, postags_tmp):
                                    if postag == 'V':
                                        seg_index.append(i)
                                    i += 1
                                spo = []
                                for indx, seg_indx in enumerate(seg_index):
                                    if indx == 0:
                                        pre_indx = 0
                                    else:
                                        pre_indx = seg_index[indx-1]
                                    if pre_indx < 0:
                                        pre_indx = 0
                                    if seg_indx == 0:
                                        spo.append(('', wds_tmp[seg_indx], ''.join(wds_tmp[seg_indx+1:])))
                                    elif seg_indx > 0 and indx < 1:
                                        spo.append((''.join(wds_tmp[:seg_indx]), wds_tmp[seg_indx], ''.join(wds_tmp[seg_indx + 1:])))
                                    else:
                                        spo.append((''.join(wds_tmp[pre_indx+1:seg_indx]), wds_tmp[seg_indx], ''.join(wds_tmp[seg_indx + 1:])))
                                spos += spo
            except:
                    print('报错')
    
            return events, spos
    
    
    主函数路口
    
    import time
    handler = ExtractEvent()
    start = time.time()
    
    content='我购买了一件玩具,孩子非常喜欢这个玩具,但是质量不太好。希望商家能够保障商品质量,不要再出现类似问题。'
    events, spos = handler.phrase_ip(content)
    spos = [i for i in spos if i[0] and i[2]]
    for spo in spos:
        print(spo)
    

    输出

    在这里插入图片描述

    展开全文
  • 文章目录自然语言处理系列二十二词性标注词性介绍总结 自然语言处理系列二十二 词性标注 词性标注(Part-Of-Speech tagging, POS tagging)也被称为语法标注(grammatical tagging)或词类消疑(word-category ...

    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】

    自然语言处理系列二十二

    词性标注

    词性标注(Part-Of-Speech tagging, POS tagging)也被称为语法标注(grammatical tagging)或词类消疑(word-category disambiguation),是语料库语言学(corpus linguistics)中将语料库内单词的词性按其含义和上下文内容进行标记的文本数据处理技术。
    词性标注可以由人工或特定算法完成,使用机器学习(machine learning)方法实现词性标注是自然语言处理(Natural Language Processing, NLP)的研究内容。常见的词性标注算法包括隐马尔可夫模型(Hidden Markov Model, HMM)、条件随机场(Conditional random fields, CRFs)等。词性标注主要被应用于文本挖掘(text mining)和NLP领域,是各类基于文本的机器学习任务,例如语义分析(semantic analysis)和指代消解(coreference resolution)的预处理步骤。下面我们分别从原理和实战工具给大家详细讲解。

    词性介绍

    词性指以词的特点作为划分词类的根据。词类是一个语言学术语,是一种语言中词的语法分类,是以语法特征(包括句法功能和形态变化)为主要依据、兼顾词汇意义对词进行划分的结果,现代汉语的词可以分为13种词类。从组合和聚合关系来说,一个词类是指:在一个语言中,众多具有相同句法功能、能在同样的组合位置中出现的词,聚合在一起形成的范畴。词类是最普遍的语法的聚合。词类划分具有层次性。如汉语中,词可以分成实词和虚词,实词中又包括体词、谓词等,体词中又可以分出名词和代词等。
    1.词类区分
    词类根据表示实际意义以及语法结构可以分为实词和虚词,按照是否吸收其它词性的词分为开放词类和闭合词类(例如汉语的动词可以直接作为“某种动作的名字”当成名词使用,所以汉语的名词是一个开放词类)。以上大类以下还可以按照词的具体用法和功能分为小类。
    2.实词
    实词是表示具体概念的词,实词以下分为:
    1)名词
    名词表示实体和概念名称的词。在大多数屈折语中,名词有以下性质:
    性:对于大多数印欧语言都分——或部分地分——阴,阳,中;一些小语种用“动物性”或“非动物性”区分词性,如格鲁吉亚语。某些语言还有更多分类方式,或交叉地采用上述的分类方式
    数:表示物体是单个,特定的几个或多个,即单数或复数。有些语种包括双数等特定数的词法
    格:表示名词在句子中的成分,即主格(第一格),与格(第二格),属格(第三格),宾格(第四格)等。部分语言如希腊语,俄语等还分更多的词格。
    在屈折语中,需要注意主谓一致,即谓语的形式需要根据主语的性和数屈折变化。
    2)代词
    代词是在句子结构中代替其它词的词,包括人称代词(代替某一人称人或事物的词,如“你”,“我”,“他”),疑问代词(包括“5W1H”),指示代词(“这”,“那”等)。代表名词的代词通常也具有名词的性,数,格规律。
    3)动词
    动词表示动作的词。根据是否带宾语可以分为“及物”与“不及物”,“及物动词”以下还包括“双宾语动词(他给了我一块糖中的“给”需要“我”和“糖”两个宾语)”和“双及物动词(需要宾语和补语的动词,例如“他觉得我很好”需要“我”这个宾语和“很好”这个描述性的补语)”,有些语言存在不需要主语的动词(尤其是表天气的词如“下雪了”这一说法中,英语必须有it这个主语,汉语和西班牙语则不需要),有些涉及到“交易”的动词需要三个宾语:Pat1sold Chris2a lawnmower3for $204。
    表示“某种动作的名称”的词称作“动名词”,在某些语言中有特定的词法。
    在屈折语中,动词根据时态(过去时,现在时,将来时,一般动作,进行时,完成时,及其交叉)和语态(主动,被动)变化。
    4)形容词
    形容词用来修饰名词,表示人或事物的性质、状态、特征或属性的词。在屈折语中形容词根据所修饰的词语性质屈折变化。
    5)数词
    数词表示数量(基数词)和序数(序数词)的词。
    6)量词
    量词(measure word/numeral classifier/counter word)是表示数量单位的词。汉语和日语在大多数描述数量的语境下都使用“数词+量词”构成的数量短语。
    量词下面还分为“数量词”(表示可数名词数量单位的词,如“个”,“条”等),“体量词”(表示一个整体的不可数名词的数量单位的词,如“堆”),“动量词”(表示动作次数的词,如“下”,“次”等)。
    英语对不特定数目的物使用“集合名词”,如“一叠纸”(a stack of paper)中的“叠”属于集合名词。
    7)区别词
    区别词是一类不能单独充当谓语的“形容词”,即不能不加助词地组成“S是V”句子的形容词。每个区别词通常有一个反义词,表示互相对立的两种属性之一。区别词通常可以后加“的”组成“的字短语”作为谓语。
    3.虚词
    虚词泛指没有完整意义的词汇,但有语法意义或功能的词。具有必须依附于实词或语句,表示语法意义、不能单独成句,不能单独作语法成分、不能重叠的特点。虚词有以下几种:
    1)副词
    副词修饰动词,表示动作的特征,状态等的词。有些副词是形容词变化而来的,实际地表示动作的特征状态等(如大多数“形容词+地”格式的副词短语和英文以“形容词+ly”构成的副词),有些副词特别地构成句法成分。
    2)介词
    介词用在句子的名词成分之前,说明该成分与句子其它成分关系的词。
    3)连词
    连词连接两句话,表示其中逻辑关系的词。
    4)助词
    助词表示语气,句子结构和时态等语法和逻辑性的“小词”。在有词语屈折的语言中助词一般不屈折。
    5)叹词
    叹词表示感叹的小词,通常独立成句。不少粗话都以叹词的形式独立存在。
    6)拟声词
    拟声词是模拟声音的小词,如“砰”“啪”等。英语中某些拟声词同时也是“表示这种声音的名词”,如“roar”既是摹仿动物的吼声的拟声词,又是名词“吼叫”。

    对词性了解后,我们下一步就需要从一个完整的句子中怎么把词性标注和识别出来,这就会用到算法,接下面我们介绍三种算法:HMM感知机CRF

    总结

    此文章有对应的配套视频,其它更多精彩文章请大家下载充电了么app,可获取千万免费好课和文章,配套新书教材请看陈敬雷新书:《分布式机器学习实战》(人工智能科学与技术丛书)

    【新书介绍】
    《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
    新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目

    【新书介绍视频】
    分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】
    视频特色:重点对新书进行介绍,最新前沿技术热点剖析,技术职业规划建议!听完此课你对人工智能领域将有一个崭新的技术视野!职业发展也将有更加清晰的认识!

    【精品课程】
    《分布式机器学习实战》大数据人工智能AI专家级精品课程

    【免费体验视频】:
    人工智能百万年薪成长路线/从Python到最新热点技术

    从Python编程零基础小白入门到人工智能高级实战系列课

    视频特色: 本系列专家级精品课有对应的配套书籍《分布式机器学习实战》,精品课和书籍可以互补式学习,彼此相互补充,大大提高了学习效率。本系列课和书籍是以分布式机器学习为主线,并对其依赖的大数据技术做了详细介绍,之后对目前主流的分布式机器学习框架和算法进行重点讲解,本系列课和书籍侧重实战,最后讲几个工业级的系统实战项目给大家。 课程核心内容有互联网公司大数据和人工智能那些事、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)、就业/面试技巧/职业生涯规划/职业晋升指导等内容。

    【充电了么公司介绍】

    充电了么App是专注上班族职业培训充电学习的在线教育平台。

    专注工作职业技能提升和学习,提高工作效率,带来经济效益!今天你充电了么?

    充电了么官网
    http://www.chongdianleme.com/

    充电了么App官网下载地址
    https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app

    功能特色如下:

    【全行业职位】 - 专注职场上班族职业技能提升

    覆盖所有行业和职位,不管你是上班族,高管,还是创业都有你要学习的视频和文章。其中大数据智能AI、区块链、深度学习是互联网一线工业级的实战经验。

    除了专业技能学习,还有通用职场技能,比如企业管理、股权激励和设计、职业生涯规划、社交礼仪、沟通技巧、演讲技巧、开会技巧、发邮件技巧、工作压力如何放松、人脉关系等等,全方位提高你的专业水平和整体素质。

    【牛人课堂】 - 学习牛人的工作经验

    1.智能个性化引擎:

    海量视频课程,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习课程。

    2.听课全网搜索

    输入关键词搜索海量视频课程,应有尽有,总有适合你的课程。

    3.听课播放详情

    视频播放详情,除了播放当前视频,更有相关视频课程和文章阅读,对某个技能知识点强化,让你轻松成为某个领域的资深专家。

    【精品阅读】 - 技能文章兴趣阅读

    1.个性化阅读引擎:

    千万级文章阅读,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习文章。

    2.阅读全网搜索

    输入关键词搜索海量文章阅读,应有尽有,总有你感兴趣的技能学习文章。

    【机器人老师】 - 个人提升趣味学习

    基于搜索引擎和智能深度学习训练,为您打造更懂你的机器人老师,用自然语言和机器人老师聊天学习,寓教于乐,高效学习,快乐人生。

    【精短课程】 - 高效学习知识

    海量精短牛人课程,满足你的时间碎片化学习,快速提高某个技能知识点。

    上一篇:自然语言处理系列二十一》词性标注》词性标注原理
    下一篇:自然语言处理系列二十三》词性标注》词性标注原理》HMM词性标注

    展开全文
  • 词性标注学习笔记

    2021-09-12 15:25:34
    1 词性标注概述 1.1 简介 词性(Par-Of-Speech,Pos)是词汇基本的语法属性,通常也称为词类。词性标注就是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。 1.2 难点 1)汉语是一种缺乏词形态...

    1 词性标注概述 

    1.1 简介

    词性(Par-Of-Speech,Pos)是词汇基本的语法属性,通常也称为词类。词性标注就是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。

    1.2 难点

    1)汉语是一种缺乏词形态变化的语言,词的类别不能像印欧语那样,直接从词的形态变化上来判别。

    2)常用词兼类现象严重,具有多个词性的兼类词的占比高达22.5%。而且越是常用的词,多词性的现象越严重。

    3)词性划分标准不统一。词类划分粒度和标记符号等,目前还没有一个广泛认可的统一的标准。比如LDC标注语料中,将汉语一级词性划分为33类,而北京大学语料库则将其划分为26类。

    4)未登录词问题。和分词一样,未登录词的词性也是一个比较大的课题。

    1.3 ICTCLAS汉语词性标注集

    代码名称说明举例
    a形容词取英语形容词adjective的第1个字母。最/d 大/a 的/u
    ad副形词直接作状语的形容词。形容词代码a和副词代码d并在一起。

    一定/d 能够/v 顺利/ad 实现/v 。/w

    ag形语素形容词性语素。形容词代码为a,语素代码g前面置以A。喜/v 煞/ag 人/n
    an名形词具有名词功能的形容词。形容词代码a和名词代码n并在一起。人民/n 的/u 根本/a 利益/n 和/c 国家/n 的/u 安稳/an 。/w
    b区别词取汉字“别”的声母。副/b 书记/n 王/nr 思齐/nr
    c连词取英语连词conjunction的第1个字母。全军/n 和/c 武警/n 先进/a 典型/n 代表/n
    d副词取adverb的第2个字母,因其第1个字母已用于形容词。两侧/f 台柱/n 上/ 分别/d 雄踞/v 着/u
    dg副语素副词性语素。副词代码为d,语素代码g前面置以D。用/v 不/d 甚/dg 流利/a 的/u 中文/nz 主持/v 节目/n 。/w
    e叹词取英语叹词exclamation的第1个字母。嗬/e !/w
    f方位词取汉字“方” 的声母。从/p 一/m 大/a 堆/q 档案/n 中/f 发现/v 了/u
    g语素绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。例如dg 或ag
    h前接成分取英语head的第1个字母。目前/t 各种/r 非/h 合作制/n 的/u 农产品/n
    i成语取英语成语idiom的第1个字母。提高/v 农民/n 讨价还价/i 的/u 能力/n 。/w
    j简称略语取汉字“简”的声母。民主/ad 选举/v 村委会/j 的/u 工作/vn
    k后接成分权责/n 明确/a 的/u 逐级/d 授权/v 制/k
    l习用语习用语尚未成为成语,有点“临时性”,取“临”的声母。是/v 建立/v 社会主义/n 市场经济/n 体制/n 的/u 重要/a 组成部分/l 。/w
    m数词取英语numeral的第3个字母,n,u已有他用。科学技术/n 是/v 第一/m 生产力/n
    n名词取英语名词noun的第1个字母。希望/v 双方/n 在/p 市政/n 规划/vn
    ng名语素名词性语素。名词代码为n,语素代码g前面置以N。就此/d 分析/v 时/Ng 认为/v
    nr人名名词代码n和“人(ren)”的声母并在一起。建设部/nt 部长/n 侯/nr 捷/nr
    ns地名名词代码n和处所词代码s并在一起。北京/ns 经济/n 运行/vn 态势/n 喜人/a
    nt机构团体“团”的声母为t,名词代码n和t并在一起。[冶金/n 工业部/n 洛阳/ns 耐火材料/l 研究院/n]nt
    nx字母专名ATM/nx 交换机/n
    nz其他专名“专”的声母的第1个字母为z,名词代码n和z并在一起。德士古/nz 公司/n
    o拟声词取英语拟声词onomatopoeia的第1个字母。汩汩/o 地/u 流/v 出来/v
    p介词取英语介词prepositional的第1个字母。往/p 基层/n 跑/v 。/w
    q量词取英语quantity的第1个字母。不止/v 一/m 次/q 地/u 听到/v ,/w
    r代词取英语代词pronoun的第2个字母,因p已用于介词。有些/r 部门/n
    s处所词取英语space的第1个字母。移居/v 海外/s 。/w
    t时间词取英语time的第1个字母。当前/t 经济/n 社会/n 情况/n
    tg时语素时间词性语素。时间词代码为t,在语素的代码g前面置以T。秋/Tg 冬/tg 连/d 旱/a
    u助词取英语助词auxiliary 的第2个字母,因a已用于形容词。工作/vn 的/u 政策/n
    ud结构助词有/v 心/n 栽/v 得/ud 梧桐树/n
    ug时态助词你/r 想/v 过/ug 没有/v
    uj结构助词的迈向/v 充满/v 希望/n 的/uj 新/a 世纪/n
    ul时态助词了完成/v 了/ ul
    uv结构助词地满怀信心/l 地/uv 开创/v 新/a 的/u 业绩/n
    uz时态助词着眼看/v 着/uz
    v动词取英语动词verb的第一个字母。举行/v 老/a 干部/n 迎春/vn 团拜会/n
    vd副动词直接作状语的动词。动词和副词的代码并在一起。强调/vd 指出/v
    vg动语素动词性语素。动词代码为v。在语素的代码g前面置以V。做好/v 尊/vg 干/j 爱/v 兵/n 工作/vn
    vn名动词指具有名词功能的动词。动词和名词的代码并在一起。股份制/n 这种/r 企业/n 组织/vn 形式/n ,/w
    w标点符号生产/v 的/u 5G/nx 、/w 8G/nx 型/k 燃气/n 热水器/n
    x非语素字非语素字只是一个符号,字母x通常用于代表未知数、符号。
    y语气词取汉字“语”的声母。已经/d 30/m 多/m 年/q 了/y 。/w
    z状态词取汉字“状”的声母的前一个字母。势头/n 依然/z 强劲/a ;/w

    2 常见方法

    2.1 基于字符串匹配的字典查找

    从字典中查找每个词语的词性,对其进行标注。这种方法比较简单,但是不能解决一词多词性的问题,因此存在一定的误差。

    2.2 基于统计的算法

    通过机器学习模型,从数据中学习规律,进行词性标注。此类方法可以根据词的上下文进行词性标注,解决一词多词性的问题。常见模型如HMM、CRF、神经网络等。

    根据输入的粒度,可以分为基于词的方法,和基于字的方法。基于词的方法需要首先对句子进行分词,然后对分词的结果进行词性标注。基于字的方法把分词和词性标注两个任务联合训练。

    3 数据集、评价指标

    3.1 常用数据集

    • 宾州中文树库CTB 5~9
    • PFR人民日报标注语料库
    • UD-Chinese-GSD数据集

    3.2 评价指标

    一般采用精确率(precision)、召回率 (recall)和F1值进行测评。

    基于词的方法, 可以直接计算以上三个指标。基于字的方法,只有当分词和词性标注同时正确时,才算标注正确。

    3 论文笔记

    ================================================================================================

    ACL 2017:Character-based Joint Segmentation and POS Tagging for Chinese using Bidirectional RNN-CRF
    ================================================================================================

    概述

    文本提出一个基于BiRNN-CRF的中文分词和词性标注联合标注模型,模型在字符的表示上进行改进,可以提供更加丰富的信息。 

    模型架构

    模型的核心是传统的双向RNN加CRF架构,RNN选用GRU。标签体系使用BIES和词性标签的组合,可以在一个标签中同时包含两种信息(如B-DEG、I-DEG、E-DEG )。

    本文的关键创新是在字符的表示上。

    1)Concatenated N-gram

    首先对于每个字符,提取以该字符为中心的n-gram信息,其中m为开始位置,n为结束位置。为对应n-gram字符串的embedding。然后把多个n-gram的进行拼接,得到该字符的表示。

    2)Radicals and Orthographical Features(偏旁和字形特征)

    对于汉字,偏旁包含了丰富的信息,每个偏旁使用一个embedding表示,然后拼接到该字符的表示当中。

    汉字的字形也提供了重要的信息,使用两层的CNN+Max pooling卷积网络提取字形信息,拼接到该字符的表示当中。

    3)Pre-trained Character Embeddings

    本文测试了使用预训练的embedding和随机embedding的区别。

    4)Ensemble Decoding

    本文测试了使用多个模型进行联合解码的效果。

    实验结果

    特征分析

     

     

    ================================================================================================

    IEEE 2018:A Simple and Effective Neural Model for Joint Word Segmentation and POS Tagging
    ================================================================================================

    概述

    由于中文分词和词性标注具有高度的关联性,传统的首先进行分词再进行词性标注的二阶段模式会造成错误的累积。文本提出一个简单高效的,基于Seq2Seq架构的神经网络模型,对中文分词和词性标注进行联合标注。 

    模型架构

    1) Transition System

    由于本模型的解码方式参考传统的Transition System,所以首先对其进行简单介绍。Transition System主要包含两部分:状态(State)和动作(Action)。开始时,有一个空的开始状态,然后通过一系列的动作逐渐改变状态的值,直到得到一个表示最终结果的结束状态。

    通过设计一个针对分词和词性标注联合解码的Transition System,可以把解码过程表示为一系列动作组成的序列,并使用Seq2Seq模型预测得出。系统包含两类动作:1)SEP(t):将当前字作为词性(t)开始的第一个字放入状态当中;2)APP:将当前字添加到状态当中,作为当前状态顶端的词性所表示的字当中。具体可以参考下图例子。

     

    2)Seq2Seq模型

    本模型包含Encoder和Decoder两部分。

    2.1)Encoder

    2.1.1)Embedding Layer

    本层包含字()的unigram和bigram的Embedding,其中bigram包含正向()和反向()两种。

    每种Embedding又分别包含两种类型:1)随机初始化并随着网络训练调整;2)使用外部数据预训练得到并固定权重。最终的Embedding由两种类型拼接而成。

    其中使用外部数据预训练Embedding时,考虑两种方式:1)只使用字信息训练的Basic Embeddings;2)结合分词、词性标签训练的Word-Context Embeddings。实验结果表明,Word-Context Embeddings效果更好。

    2.1.2)LSTM Input

    Encoder由正向和反向两个LSTM组成,所以需要分别为两个LSTM提供输入。输入由unigram和对应的bigram的Embedding拼接后,通过一个简单的线性变换得到:

    2.1.3)Bi-Directional LSTM

    经过输入层,分别得到正向和反向两部分输入:。然后分别输入到两个LSTM当中,Encoder的最终输出由两个LSTM的输出拼接得到:

    2.2)Decoder

    Decoder由一个基于动态解码的词为输入的单向LSTM构成。和传统的Seq2Seq模型对比,本模型具有两方面的区别。第一,由于基于Transition System的解码系统自带了注意力的属性,所以本模型不需要显式的注意力结构。第二,本模型的Decoder基于动态解码的word-level特征作为输入,而不是原始输入的character-level特征。

    2.2.1)Word Representation

    Decoder的输入为词列表,其中每个词由两部分组成:1)组成词的每个字的Encoder输出的组合;2)预测的词性标签的Embedding。

    Decoder的输入的词可以表示为:

    其中有几种可选的计算方式:

    由于Encoder的输出由两个方向分别组成,所以词的表示也分别由两个方向的组合拼接得到:

    然后把词表示和词性标签的Embedding拼接,通过一个简单的线性变换得到

    2.2.2)LSTM

    输入到单向LSTM当中,得到每一步的隐藏状态,然后经过两次线性变换,得到每一步的输出:

    2.3)Training

    使用交叉熵作为损失函数:

    实验结果

    特征分析

    1)Word Representation

    2)Feature

     

    3)Pretrain Embedding

    ================================================================================================

    ACL 2020:Joint Chinese Word Segmentation and Part-of-speech Tagging via Two-way Attentions of Auto-analyzed Knowledge
    ================================================================================================

    概述

    当前的词性标注模型只关注n-gram等上下文信息,忽略了其他语法知识。然而,句法结构、依存关系等知识可以提供单词之间的距离依赖信息。使用现成的工具自动生成的语法知识,可以对词性标注模型起到辅助作用。本文提出一个中文分词和词性标注联合标注模型,使用双向注意机制整合每个输入字符的上下文特征及其相应的语法知识。

    模型架构

    设输入为,输出为的上下文特征为,语法知识为。每个字符对应的特征表示为

    1)Auto-analyzed Knowledge

    人工标注的语法知识比较难以获取,但是自动分析得到的语法知识可以通过工具生成,虽然自动生成的知识有一定噪声,但是如果可以让模型学习如何利用这些知识,可以有效提升模型效果。本模型通过注意力机制,从自动生成的语法知识中提取特征。

    本文使用三种语法知识:1)自动生成的词性标注标签;2)句法结构;3)依存关系。

    1.1)自动生成的词性标注标签

    对于每个字符 ,取包含该字符的词,以及其相邻2个词范围内的所有词,的上下文和词性标注标签特征。

    1.2)句法结构

    首先定义一组需要关注的句法标签。对于每个字符 ,从包含该字符的词开始往根节点回溯,直到遇到第一个在预定义的句法标签的词为止,取该词下的所有叶子节点的词的上下文和句法标签特征。

    1.3)依存关系

    对于每个字符 ,取包含该字符的词以及与其存在依存关系的所有词的上下文和依存关系标签特征。

    2)Two-Way Attentions

    之前的研究直接把上下文特征和语法知识进行拼接,容易受噪声干扰,本模型分别使用两个attention提取上下文和语法知识特征。以上下文特征为例,计算方式为:

    其中是编码器提取的特征,的上下文特征中的第j项,的embedding。

    使用同样的方式提取语法知识特征,最后把上下文和语法知识特征拼接,得到本层输出

    3)Joint Tagging with Two-way Attentions

    把编码器和双向注意机制提取的特征拼接后输入到一个线性变换层,然后输入到CRF层得到最终输出:

    实验结果

    本文测试使用Stanford CoreNLP Toolkit(SCT)和Berkeley Neural Parser(BNP)两个工具本身进行词性标注的结果,和基于它们提取的语法特征在本模型下的结果。

    同时也对比使用Bi-LSTM、BERT、ZEN三种编码器的结果。

    特征分析

    展开全文
  • 今天总结一下自然语言处理基础技术之词性标注,后附现有比较好的开源实现工具(基于python实现包)~~~词性定义百度百科定义:词性指以词的特点作为划分词类的根据。词类是一个语言学术语,是一种语言中词的语法分类,...
  • 词类是一个语言学术语,是一种语言中词的语法分类,是以语法特征(包括句法功能和形态变化)为主要依据、兼顾词汇意义对词进行划分的结果。英语词性的分类词类又叫词性,英语单词根据其在句子中的功用,可以分成十个大...
  • topK=20, withWeight=False, allowPOS=(), withFlag=False)#topK 表示返回最大权重关键词的个数,None表示全部#withWeight表示是否返回权重,是的话返回(word,weight)的list#allowPOS仅包括指定词性的词,默认为空...
  • 文章目录自然语言处理系列二十一词性标注词性标注原理总结 自然语言处理系列二十一 词性标注 词性标注(Part-Of-Speech tagging, POS tagging)也被称为语法标注(grammatical tagging)或词类消疑(word-category ...
  • 借助世界上最大的多语种语料库,HanLP2.1支持包括简繁中英日俄法德在内的104种语言上的10种联合任务:分词(粗分、细分2个标准,强制、合并、校正3种)、词性标注(PKU、863、CTB、UD四套词性规范)、命名实体识别...
  • 词性标注 简介 简单的说明一下什么是词性标注,词性(词类)是词汇中剧本的语法属性,而词性标注是在给定句子中判定每个词的语法范畴,确定它的词性并加以标注的过程。 比如给定句子“她很漂亮”,对应的词性标注...
  • 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该模型可以使用已经正确标注好词性的句子进行训练,从而识别由该字典中其他词组成的新句子中所有词的词性。NLTK 和 ...
  • Python3自然语言处理——词性标注

    千次阅读 2020-12-22 16:54:57
    词性标注是对给定句子中的单词进行词性(Parts of Speech,POS)分类的过程。实现标注目的的软件称为词性标注器(tagger)。NLTK支持多种标注器。1.内置的词性标注器创建一个新文件,命名为Exploring.py,输入以下代码:...
  • 中文的词性与中文的语言构成和语言使用具有严格上的对应关系,而且词性作为概念的抽象,对于语言的泛化具有重要意义。 二、搞自然语言处理的是否要懂词性标记体系? 作为课题组的自然语言处理面试官,我出了一道...
  • 结巴分词(jieba)词性标注表

    千次阅读 2020-03-31 21:04:40
     当我们进行关键词的选择时,也要考虑词语的词性,关键词以名词或者名词性词组居多,而jieba为自然语言语言中常用工具包,具有对分词的词性进行标注的功能,词性类别如下(重要的词性符号已标记): 符号 词性 ...
  • 英语词性介绍

    2020-06-03 08:05:47
    词性又叫词类,英语单词根据其在句子中的功用,可以分成十个大类。 词性 全称 缩写 示例 示例翻译 名词 noun n. student 学生 代词 pronoun pron. you 你 形容词 adjective adj. happy 高兴的 副词 ...
  • 维基百科上对词性的定义为:In traditional grammar, a part of speech (abbreviated form: PoS or POS) is a category of words (or, more generally, of lexical items) which have similar grammati.
  • 命名实体识别以及词性自动标注

    千次阅读 2018-07-09 12:04:26
    词性标注具体方法包括:基于统计模型的方法、基于规则的方法和两者结合的方法。下面我们分别来介绍。   基于统计模型的词性标注方法 提到基于统计模型,势必意味着我们要利用大量已经标注好的语料库来做训练,同时...
  • 前面两篇文章详细讲解了哈工大Pyltp工具,包括中文分词、词性标注、实体识别、依存句法分析和语义角色标注等。但是其中文分词效果不是很理想,如“贵州财经大学”总是切分成“贵州”、“财经”和“大学”,这是因为...
  • 关系提取是指从文本中提取语义关系,这种语义关系通常发生在两个或多个实体之间。这些关系可以是不同类型的。" Paris is in France "表示巴黎与法国之间的" is in "关系。这可以用三元组(Paris, is in, France)来...
  • NLP5:NLTK词性标注

    2021-12-07 08:29:16
    使用NLTK和结巴分词完成词性标注。
  • NLTK中文词性标注

    2020-12-10 13:36:54
    1.说明学习自然语言处理,一定会参考NLTK,主要是学习它的思路,从设计地角度看看能做什么.其本质就是把语言看成字符串,字符串组,...下面来看看怎样通过数据训练来实现中文词性自动标注.可以利用它来标注中本,也可...
  • 一、(4) 结巴分词词性提取

    千次阅读 2019-05-15 11:22:56
    ※ 结巴分词词性提取 代码如下: # -*- coding: utf-8 -*- """ Created on Tue May 14 14:45:01 2019 @author: sun """ import jieba.posseg as psg import codecs # 建立结果保存路径 result = codecs.open("带...
  • ChineseEmbedding Chinese Embedding ...中文自然语言处理向量合集,包括字向量,拼音向量,词向量,词性向量,依存关系向量.共5种类型的向量. 项目地址:https://github.com/liuhuanyong 项目简介 目前不同于on...
  • 使用斯坦福分词器进行词性标注 文章目录使用斯坦福分词器进行词性标注前言中文分词是中文文本处理的一个基础步骤,同时也是中文人机自然语言交互的基础模块,与英文不同的是,中文句子中没有词的界限,因此在进行...
  • 文章目录自然语言处理系列二十五词性标注CRF词性标注总结 自然语言处理系列二十五 词性标注 词性标注(Part-Of-Speech tagging, POS tagging)也被称为语法标注(grammatical tagging)或词类消疑(word-category ...
  • python3.6-制作一个包含NLP基本功能系统(Windows exe)自然语言处理系统。系统功能:分词,词性标注,关键字提取,文本分类;由于要打包成exe的关系,我将原本的项目的多一个文件的集成到一个python文件(合并文件...
  • 文章目录自然语言处理系列二十三词性标注HMM词性标注总结 自然语言处理系列二十三 词性标注 词性标注(Part-Of-Speech tagging, POS tagging)也被称为语法标注(grammatical tagging)或词类消疑(word-category ...
  • 语义依存关系分析 深度学习与句法分析 词向量 词袋模型(bag of words) 词嵌入-共现矩阵(Concurrence matrix) Word2Vec skip-gram CBOW(continous-bag-of-words) 词性标注 词性作为词语基本的语法属性,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,724
精华内容 4,289
关键字:

包含的词性关系