文档章节

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

木头释然
 木头释然
发布于 2018/07/06 15:45
字数 1204
阅读 1499
收藏 2
LTP

语言技术平台(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', '')

最终处理结果为:

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

 

© 著作权归作者所有

木头释然
粉丝 17
博文 9
码字总数 5035
作品 0
西青
其他
私信 提问
加载中

评论(1)

zb1495990964920
zb1495990964920
兄弟,留下你 qq 或微信,交流下 LTP。
【开源】C#信息抽取系统【招募C#队友】

FDDC2018金融算法挑战赛02-A股上市公司公告信息抽取 更新时间 2018年7月11日 By 带着兔子去旅行 信息抽取是NLP里的一个实用内容。该工具的目标是打造一个泛用的自动信息抽取工具。使得没有任...

codesnippet.info
2018/07/10
0
0
[开源]开放域实体抽取泛用工具 NetCore2.1

开放域实体抽取泛用工具 https://github.com/magicdict/FDDC 更新时间 2018年7月16日 By 带着兔子去旅行 开发这个工具的起源是天池大数据竞赛,FDDC2018金融算法挑战赛02-A股上市公司公告信...

codesnippet.info
2018/07/17
0
0
hanlp和jieba等六大中文分工具的测试对比

本篇文章测试的哈工大LTP、中科院计算所NLPIR、清华大学THULAC和jieba、FoolNLTK、HanLP这六大中文分词工具是由 水...琥珀 完成的。相关测试的文章之前也看到过一些,但本篇阐述的可以说是比...

左手的倒影
02/25
103
0
美食图谱复现指南之依存句法分析

本文代码开源在:DesertsX/gulius-projects 哈工大语言云的官网有一篇名为《使用语言云分析微博用户饮食习惯》的文章,里面讲到了借助分词、词性标注和依存句法分析等NLP技术,可以从微博文本...

古柳_Deserts_X
02/02
0
0
gensim TF-IDF模型中文关键词抽取

模型:gensim工具包TF-IDF模型 维基百科语料数据(30万词条)+百度百科(500万) 利用jieba分词,使用定义词典提高分词精度,去除停用词,分词效果对最后抽取结果影响很大,一般是构建比较大的分...

sudop
2018/01/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 年迈渔夫遭黑帮袭抢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享Elvis Presley的单曲《White Christmas》: 《White Christmas》- Elvis Presley 手机党少年们想听歌,请使劲...

小小编辑
今天
2.1K
20
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
10
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
12
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
19
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部