哈工大语言云的官网有一篇名为《使用语言云分析微博用户饮食习惯》的文章,里面讲到了借助分词、词性标注和依存句法分析等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),各种表述方式应有尽有,理想与现实的差距可见一斑。

再者是复现的代码,对于食物宾语的提取逻辑过于简单,以致诸如“巧克力味冰淇淋”、“西湖醋鱼”等带有前缀修饰的词语都无法提取。当然宾语补全也能实现,此处暂且不表。

美食图谱复现指南之依存句法分析相关推荐

  1. 知识图谱--实体关系抽取,依存句法分析

    我爱自然语言处理 https://www.52nlp.cn/tag/%E4%BE%9D%E5%AD%98%E5%8F%A5%E6%B3%95%E5%88%86%E6%9E%90 基于Hanlp的依存句 ...

  2. 百度开源的依存句法分析系统

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 依存句法分析是自然语言处理核心技术之一,旨在通过分析句子中词语之间的依存关系来确定句子的句法结 ...

  3. 基于依存句法分析的开放式中文实体关系抽取

    参考: HanLP自然语言处理 基于依存分析的开放式中文实体关系抽取方法 命名实体三元组抽取参考自fact_triple_extraction 这一段时间一直在做知识图谱,卡在实体关系抽取这里几个月了 ...

  4. 自然语言处理(NLP)之依存句法分析的可视化及图分析

    依存句法分析的效果虽然没有像分词.NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道.如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析. 我们使用的NLP工 ...

  5. 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)

    pyltp的简介   语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...

  6. 句法分析是什么?成分句法分析、依存句法分析又是什么?他们之间有什么区别?

    句法分析是什么?成分句法分析.依存句法分析又是什么?他们之间有什么区别? 目录

  7. 实体链接(Entity Linking)、依存句法分析、成分句法树、词袋模型、文本向量空间模型(TF-IDF)、

    实体链接(Entity Linking).依存句法分析.成分句法树.词袋模型.文本向量空间模型(TF-IDF) 目录

  8. 句法依存分析_恭喜 | 黑龙江大学自然语言处理实验室获得NLPCC2019跨领域移植中文依存句法分析封闭测试第一名!...

    点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要3分钟 跟随小博主,每天进步一丢丢 欢送师兄师姐毕业 任务介绍 我们做的实验为Task1的closed任务 任务设置 任务描述: 输入一个自然语 ...

  9. 语义角色标注视为依存句法分析任务:探索论元内部的隐式树结构

    ©作者 | 张宇 单位 | 苏州大学博士生 研究方向 | 句法分析/语义分析 语义角色标注(SRL)是 NLP 中一个基础且重要的任务,主要涉及谓词和论元的识别,以及相应的角色标签标注等等. 最近主流 ...

最新文章

  1. 【计算摄影】计算机如何学会自动裁剪图片(自动构图)?
  2. 多线程系列之学习多线程下载的基本原理和基本用法(1)
  3. MAC通过SSH使用PEM文件登录
  4. vm15 安装 mac虚拟机的过程 转载的
  5. LeetCode 581. Shortest Unsorted Continuous Subarray
  6. varnish与squid比较
  7. DEA的简单介绍以及Matlab做题例子
  8. gg修改器怎么修改服务器数值,gg修改器怎么修改数值 | 手游网游页游攻略大全...
  9. SLAM从入门到放弃——学习SLAM 学习机器人 书籍推荐
  10. mysql 查询当前时间到毫秒_MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
  11. 计算机系统的主要性能指标有哪些?,计算机系统组成及主要性能指标
  12. newLISP你也行 --- 字符串
  13. 如何使用python 执行命令行传入的代码
  14. 华为公有云接口的问题
  15. vue 评论区回复无限嵌套实现代码
  16. Y470N 显卡超频了GT550m 完美2.10 bios
  17. Android源码学习------SystemUI(二)
  18. python 获取list特定元素下标
  19. ios平台触动精灵lua调用C语言
  20. 深度学习中的注意力机制(2017版)

热门文章

  1. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具与包嗅探
  2. 黑白琴键 java_【琴键巧记】记住钢琴的88个键,其实很简单!
  3. HarmonyOS应用开发:UI界面-路由Router
  4. jQuery 表单验证插件jQuery Validation Engine用法详解
  5. android数据恢复实现,安卓手机的数据恢复与备份
  6. 说说 Redis 缓存穿透场景与相应的解决方法
  7. Python打包发布
  8. uni-app如何跨页面传参
  9. Java字节数组转换成十六进制字符串的几种方法
  10. 使用Glimpse 监测ASP.NET MVC网站