基于哈工大LTP句子主干提取

原创
2018/07/06 15:45
阅读数 1.2W

语言技术平台(LTP) 提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术。经过 哈工大社会计算与信息检索研究中心 11 年的持续研发和推广,LTP 已经成为国内外最具影响力的中文处理基础平台,曾获 CoNLL 2009七国语言句法语义分析评测 总成绩第一名,中文信息学会钱伟长一等奖等重要成绩和荣誉。目前,LTP 已经被 500 多家国内外研究机构和企业使用,多家大企业和科研机构付费使用。

文档地址:语言技术平台(LTP)

以上文档介绍的已经比较清楚再此就不赘述了,下面以“总理那高大的形象总是浮现在我眼前”,“我把苹果吃了”,“苹果被我吃了”几种经典句型为例对提取句子主干进行分析。

①通过对“总理那高大的形象总是浮现在我眼前”进行分词、词性标注、依存句法分析得到如下结果:

分词结果:总理    那      高大    的      形象    总是    浮现    在      我      眼前  
词性分析结果:总理/n  那/r  高大/a  的/u  形象/n  总是/d  浮现/v  在/p  我/r  眼前/nt
依存句法分析结果:5:ATT   5:ATT   5:ATT   3:RAD   7:SBV   7:ADV   0:HED   7:CMP   10:ATT  8:POB

将以上结果绘制成语法树得出:

②通过对“我把苹果吃了”进行分词、词性标注、依存句法分析得到如下结果:

分词结果:你      把      苹果    吃      了
词性分析结果:你/r  把/p  苹果/n  吃/v  了/u
依存句法分析结果:4:SBV   4:ADV   2:POB   0:HED   4:RAD

将以上结果绘制成语法树得出:

③通过对“苹果被我吃了”进行分词、词性标注、依存句法分析得到如下结果:

分词结果:苹果    被      我      吃      了
词性分析结果:苹果/n  被/p  我/r  吃/v  了/u
依存句法分析结果:4:FOB   4:ADV   2:POB   0:HED   4:RAD

将以上结果绘制成语法树得出:

以上结果都是基于LTP分析得出,分词和词性分析也可以通过结巴分词实现,不过经本人测试效果不如LTP自带分词,可能因为语料和适配问题,大家可以尝试下。

现在已经得到语法树了,在汉语中句子主干一般为主谓宾结构,也可能部分缺失。通过LTP文档可以发现:

一般情况下LTP会选取谓语作为ROOT,SBV为主谓关系,VOB为动宾关系,FOB为前置宾语。可以把ROOT视作谓语,SBV作为主语,VOB或FOB作为宾语。当主语缺失或宾语缺失时,也可能表现为ADV-POB(状中-定宾)结构。

由于本人已把LTP作为服务,返回结果格式为:

{
    "code": 200,
    "result": [
        {
            "dep": "总理",
            "gov": "形象",
            "pos": "ATT"
        },
        {
            "dep": "那",
            "gov": "形象",
            "pos": "ATT"
        },
        {
            "dep": "高大",
            "gov": "形象",
            "pos": "ATT"
        },
        {
            "dep": "的",
            "gov": "高大",
            "pos": "RAD"
        },
        {
            "dep": "形象",
            "gov": "浮现",
            "pos": "SBV"
        },
        {
            "dep": "总是",
            "gov": "浮现",
            "pos": "ADV"
        },
        {
            "dep": "浮现",
            "gov": "ROOT",
            "pos": "HED"
        },
        {
            "dep": "在",
            "gov": "浮现",
            "pos": "CMP"
        },
        {
            "dep": "我",
            "gov": "眼前",
            "pos": "ATT"
        },
        {
            "dep": "眼前",
            "gov": "在",
            "pos": "POB"
        }
    ],
    "ts": 1530862633
}

首先通过ROOT提取谓语结点,然后后再通过谓语获取主语和宾语:

class Sentence(object):

    def __init__(self, url):
        self.url = url

    def getLTPAnalysis(self, sentence):
        data = bytes(json.dumps({'sentence': sentence}), encoding='utf8')
        headers = {'Content-Type': 'application/json'}
        req = urllib.request.Request(self.url, data, headers)
        resp = urllib.request.urlopen(req)
        respStr = resp.read()
        respJson = json.loads(respStr)
        return respJson

    def getHED(self, words):
        root = None
        for word in words:
            if word['gov'] == 'ROOT':
                root = word['dep']
        return root

    def getWord(self, words, HED, wType):
        sbv = None
        for word in words:
            if word['pos'] == wType and word['gov'] == HED:
                sbv = word['dep']
        return sbv

    def getFirstNotNone(self, array):
        for word in array:
            if word is not None:
                return word
        return None

    def getMain(self, sentence):
        re = ''
        result = self.getLTPAnalysis(sentence)
        if result['code'] == 200:
            array = result['result']
            if len(array) > 0:
                hed = self.getHED(array)
                if hed is not None:
                    sbv = self.getWord(array, hed, 'SBV')  # 主语
                    vob = self.getWord(array, hed, 'VOB')  # 宾语
                    fob = self.getWord(array, hed, 'FOB')  # 后置宾语

                    adv = self.getWord(array, hed, 'ADV')  # 定中
                    pob = self.getWord(array, adv, 'POB')  # 介宾如果没有主语可做主语

                    zhuWord = self.getFirstNotNone([sbv, pob])  # 最终主语
                    weiWord = hed # 最终谓语
                    binWord = self.getFirstNotNone([vob, fob, pob])  # 最终宾语

                    re = '{}{}{}'.format(zhuWord, weiWord, binWord)
        return re.replace('None', '')

最终处理结果为:

由于本人刚接触自然语言处理,如果错误欢迎指正!

 

展开阅读全文
LTP
打赏
7
3 收藏
分享
加载中
请问用的模型是哪个版本的?报错:urllib.error.HTTPError: HTTP Error 400: EMPTY SENTENCE
2019/08/30 16:59
回复
举报
兄弟,留下你 qq 或微信,交流下 LTP。
2019/08/07 14:47
回复
举报
更多评论
打赏
2 评论
3 收藏
7
分享
返回顶部
顶部