Python建模与NLPMachine Learning & Recommendation & NLP & DL自然语言处理(NLP)

基于依存句法分析的关键短语抽取算法实战

2020-02-14  本文已影响0人  王同学死磕技术

由于最近在做一些无监督的关键词短语(实体)抽取工作,其实最大的背景还是没有标注好的实体识别训练数据;所以想到采用无监督的关键短语抽取算法折中去抽取一些实体,于是调研了一波关键短语抽取算法和工具。目前无监督关键短语抽取算法和关键词抽取算法差不多:主要是TFIDF,Textrank 等特征为候选短语的打分。然后抽取得分高的候选短语。

算法流程

关键词短抽取成算法主要分为两部分:1.候选短语抽取;2.候选短语打分

ngram

引入依存句法分析

依存句法分析这里笔者不做过多的介绍,有兴趣的同学可以去百度一波.但是这里笔者展示一下依存句法分析的结果,通过依存句法分析,我们可以得到一颗如下的依存树,树的每条边记录了连接节点的对于关系,比如 “青年”的定语是“男性”,所以青年和男性是定中关系。具有定中关系的相邻词组就是一个短语,同时被修饰的词通常比较重要(这是笔者的一个假设),所以,笔者认为:具有定中关系的相邻词组是关键词。

dependency tree

下方是笔者在百度百科中搜索出来的“借款费用”的定义,用依存句法分析了一波,也确实发现具有定中关系的词组组合起来就是关键短语,比如:借款费用,借款利息,外币借款等。

"借款费用是企业因借入资金所付出的代价,包括借款利息、折价或者溢价的摊销、辅助费用以及因外币借款而发生的汇兑差额等"
的依存句法分析结果如下:
1,借款-->定中关系-->2 ,费用
2,费用-->主谓关系-->3 ,是
3,是-->核心关系-->0 ,##核心##
4,企业-->主谓关系-->9 ,付出
5,因-->状中结构-->9 ,付出
6,借入-->介宾关系-->5 ,因
7,资金-->动宾关系-->6 ,借入
8,所-->左附加关系-->9 ,付出
9,付出-->定中关系-->11 ,代价
10,的-->右附加关系-->9 ,付出
11,代价-->动宾关系-->3 ,是
12,,-->标点符号-->3 ,是
13,包括-->并列关系-->3 ,是
14,借款-->定中关系-->15 ,利息
15,利息-->动宾关系-->13 ,包括
16,、-->标点符号-->17 ,折价
17,折价-->并列关系-->15 ,利息
18,或者-->左附加关系-->21 ,摊销
19,溢价-->定中关系-->21 ,摊销
20,的-->右附加关系-->19 ,溢价
21,摊销-->并列关系-->17 ,折价
22,、-->标点符号-->23 ,辅助
23,辅助-->定中关系-->24 ,费用
24,费用-->并列关系-->21 ,摊销
25,以及-->左附加关系-->33 ,差额
26,因-->状中结构-->30 ,发生
27,外币-->定中关系-->28 ,借款
28,借款-->介宾关系-->26 ,因
29,而-->状中结构-->30 ,发生
30,发生-->定中关系-->33 ,差额
31,的-->右附加关系-->30 ,发生
32,汇兑-->定中关系-->33 ,差额
33,差额-->并列关系-->21 ,摊销
34,等-->右附加关系-->13 ,包括

实战部分

实战部分笔者的思路如下:

from pyhanlp import *
import ckpe

def extract_key_phrase(sentence):
    key_phrase = []
    ckpe_obj = ckpe.ckpe()
    entity = ckpe_obj.extract_keyphrase(sentence,top_k=10)
    for i in entity:
        CustomDictionary.insert(i)
    print(entity)
    tree = HanLP.parseDependency(sentence)
    for word in tree.iterator():  # 通过dir()可以查看sentence的方法
        print("%d,%s-->%s-->%d ,%s" % (word.ID, word.LEMMA, word.DEPREL, word.HEAD.ID, word.HEAD.LEMMA))
        if word.DEPREL == "定中关系":
            key_phrase.append(word.LEMMA + word.HEAD.LEMMA)
    
    return [ phrase for phrase in key_phrase if phrase  in sentence]

输入一下句子:
sentence= "借款费用是企业因借入资金所付出的代价,包括借款利息、折价或者溢价的摊销、辅助费用以及因外币借款而发生的汇兑差额等"

extract_key_phrase(sentence)

最后结果如下:

结论

所以在关键短语抽取算法中引入依存句法分析似乎有着不错的效果,其实也是利用了句法特征。做为一个nlper 如果能够善于使用词性特征,句法特征等这些传统特征也能够做很酷的事情,比如无监督抽取出这么好效果的关键短语。当然无监督会产生较多的错误,我们可以采用这种算法辅助去标注数据,最终通过有监督的深度模型训练达到最佳效果。

参考

https://github.com/dongrixinyu/chinese_keyphrase_extractor
https://mp.weixin.qq.com/s/fBSEtM4gQ6-5jQpy0JaQvw

上一篇下一篇

猜你喜欢

热点阅读