美食图谱复现指南之依存句法分析
哈工大语言云的官网有一篇名为《使用语言云分析微博用户饮食习惯》的文章,里面讲到了借助分词、词性标注和依存句法分析等NLP技术,可以从微博文本内容中提取出用户饮食习惯等数据。
进而可以结合用户性别、地区、发微博时间等不同维度信息,展现出许多有趣的结果,比如下图分别是上海、重庆、以及广东(男性)的特色饮食习惯:
那么如何抽取出上述食物呢?原文给出了由三个条件组成的规则:一条微博里含有词语“吃”+与“吃”相关的句法关系为VOB(动宾关系)+“吃”的宾语为名词,就可以判断发生饮食行为,进而提取出“吃”的宾语就是相关的食物。
作为解释,给出了三个例句:“我刚吃了一块巧克力”、“今天我去电影院看了浓情巧克力”、“我吃了个巧克力味冰淇淋”。
句子经过分词,并在下方标注了词性,依存弧表明每个词语之间的关系,比如主谓关系(SBV)、动宾关系(VOB)等等。
由上述规则可以判断出第二句没有饮食行为,于是进行过滤;而从另外两句中可以分别抽取出“巧克力”和“冰淇淋”(当然第三句更细粒度、更准确地应该是“巧克力味冰淇淋”,如何改进上面的规则,后面再提)。
经过上面的介绍,看起来这条规则还蛮符合逻辑,应该能行的吧?但不知怎的脑海中突然浮现出张学友这张表情包,呼之欲出就是这句......
于是用语言云官方的在线演示试了下:出现“吃”这个字+与“吃”相关的有VOB动宾关系+宾语是名词“n”......过于完美地符合所有条件。
扯回来,总得来看,给出的判断逻辑还是靠谱的,那么该如何实现呢?“章口就莱”甩下一句:Talk is cheap. Show me the code. 然而翻遍原文也没找到实现代码。
很早以前就看过这篇文章,一直不会,重新试了下,发现非常简单,果然是“难者不会,会者不难”,核心代码也就两行。
以下是代码部分(本文代码开源在:DesertsX/gulius-projects),原本不必讲pip install pyltp
这种基础安装第三方库的事,但因为windows下可能会出现Microsoft Visual C++
等相关错误,所以建议参考:《哈工大自然语言处理ltp在windows10下的安装使用》一文的方案二,亲测可行。
再是pyltp的入门介绍此处略过,看官方文档使用 pyltp一文就够了。
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
pyltp 安装成功,并下载好相应的 LTP 模型文件后,分别加载分词、词性标注和依存句法分析的模型。
import os
from pyltp import Segmentor
LTP_DATA_DIR = '/path/to/your/ltp_data' # ltp模型目录的路径# 加载分词模型
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
segmentor = Segmentor()
segmentor.load(cws_model_path)# 加载词性标注模型
from pyltp import Postagger
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger()
postagger.load(pos_model_path)# 加载依存句法分析模型
from pyltp import Parser
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')
parser = Parser()
parser.load(par_model_path)
对每个句子分别进行分词、词性标注和依存句法分析,并对分词后的每个词语依次提取依存弧的父节点id(Root 的 id 为0,其他按分词结果依次递增)、依存关系以及依存父节点对应的词语。最后写出进行饮食行为判断的核心代码即可。
def extract_food(sentence):words = segmentor.segment(sentence)print(" ".join(words))postags = postagger.postag(words)for word, postag in zip(words, postags):print(word + '/'+ postag, end=' ')arcs = parser.parse(words, postags)# 例句:我 刚 吃 了 一 块 巧克力 。# 提取依存父节点id# 3, 3, 0, 3, 6, 7, 3, 3rely_id = [arc.head for arc in arcs]# 提取依存关系# ['SBV', 'ADV', 'HED', 'RAD', 'ATT', 'ATT', 'VOB', 'WP']relation = [arc.relation for arc in arcs]# 匹配依存父节点词语# ['吃', '吃', 'Root', '吃', '块', '巧克力', '吃', '吃']heads = ['Root' if id==0 else words[id-1] for id in rely_id]print("\n")for i in range(len(words)):if postags[i] == 'n' and heads[i] == '吃' and relation[i] == 'VOB':print("找到了一种食物:" + words[i])print("=" * 30)
对依存关系这部分还不太理解的可以看下此文:依存句法分析结果的输出怎么看
接着三个例句进行测试,结果和原文相符。
sentences = ['我刚吃了一块巧克力。', '今天我去电影院看了浓情巧克力。', '我吃了个巧克力味冰淇淋。']
for sent in sentences:extract_food(sent)
以上算是简单复现了下这篇博客的思路。还有个问题就是,现实中大家讨论饮食的方式可能并不像例句中那么规整简单。
以以前爬取的知乎想法里与“#好吃的杭州#”相关的言论为例(该话题知乎想法API),各种表述方式应有尽有,理想与现实的差距可见一斑。
再者是复现的代码,对于食物宾语的提取逻辑过于简单,以致诸如“巧克力味冰淇淋”、“西湖醋鱼”等带有前缀修饰的词语都无法提取。当然宾语补全也能实现,此处暂且不表。
美食图谱复现指南之依存句法分析相关推荐
- 知识图谱--实体关系抽取,依存句法分析
我爱自然语言处理 https://www.52nlp.cn/tag/%E4%BE%9D%E5%AD%98%E5%8F%A5%E6%B3%95%E5%88%86%E6%9E%90 基于Hanlp的依存句 ...
- 百度开源的依存句法分析系统
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 依存句法分析是自然语言处理核心技术之一,旨在通过分析句子中词语之间的依存关系来确定句子的句法结 ...
- 基于依存句法分析的开放式中文实体关系抽取
参考: HanLP自然语言处理 基于依存分析的开放式中文实体关系抽取方法 命名实体三元组抽取参考自fact_triple_extraction 这一段时间一直在做知识图谱,卡在实体关系抽取这里几个月了 ...
- 自然语言处理(NLP)之依存句法分析的可视化及图分析
依存句法分析的效果虽然没有像分词.NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道.如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析. 我们使用的NLP工 ...
- 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)
pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...
- 句法分析是什么?成分句法分析、依存句法分析又是什么?他们之间有什么区别?
句法分析是什么?成分句法分析.依存句法分析又是什么?他们之间有什么区别? 目录
- 实体链接(Entity Linking)、依存句法分析、成分句法树、词袋模型、文本向量空间模型(TF-IDF)、
实体链接(Entity Linking).依存句法分析.成分句法树.词袋模型.文本向量空间模型(TF-IDF) 目录
- 句法依存分析_恭喜 | 黑龙江大学自然语言处理实验室获得NLPCC2019跨领域移植中文依存句法分析封闭测试第一名!...
点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要3分钟 跟随小博主,每天进步一丢丢 欢送师兄师姐毕业 任务介绍 我们做的实验为Task1的closed任务 任务设置 任务描述: 输入一个自然语 ...
- 语义角色标注视为依存句法分析任务:探索论元内部的隐式树结构
©作者 | 张宇 单位 | 苏州大学博士生 研究方向 | 句法分析/语义分析 语义角色标注(SRL)是 NLP 中一个基础且重要的任务,主要涉及谓词和论元的识别,以及相应的角色标签标注等等. 最近主流 ...
最新文章
- 【计算摄影】计算机如何学会自动裁剪图片(自动构图)?
- 多线程系列之学习多线程下载的基本原理和基本用法(1)
- MAC通过SSH使用PEM文件登录
- vm15 安装 mac虚拟机的过程 转载的
- LeetCode 581. Shortest Unsorted Continuous Subarray
- varnish与squid比较
- DEA的简单介绍以及Matlab做题例子
- gg修改器怎么修改服务器数值,gg修改器怎么修改数值 | 手游网游页游攻略大全...
- SLAM从入门到放弃——学习SLAM 学习机器人 书籍推荐
- mysql 查询当前时间到毫秒_MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
- 计算机系统的主要性能指标有哪些?,计算机系统组成及主要性能指标
- newLISP你也行 --- 字符串
- 如何使用python 执行命令行传入的代码
- 华为公有云接口的问题
- vue 评论区回复无限嵌套实现代码
- Y470N 显卡超频了GT550m 完美2.10 bios
- Android源码学习------SystemUI(二)
- python 获取list特定元素下标
- ios平台触动精灵lua调用C语言
- 深度学习中的注意力机制(2017版)
热门文章
- 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具与包嗅探
- 黑白琴键 java_【琴键巧记】记住钢琴的88个键,其实很简单!
- HarmonyOS应用开发:UI界面-路由Router
- jQuery 表单验证插件jQuery Validation Engine用法详解
- android数据恢复实现,安卓手机的数据恢复与备份
- 说说 Redis 缓存穿透场景与相应的解决方法
- Python打包发布
- uni-app如何跨页面传参
- Java字节数组转换成十六进制字符串的几种方法
- 使用Glimpse 监测ASP.NET MVC网站