项目介绍: SceneGraphParser
SceneGraphParser(简称sng_parser
)是一个用Python编写的工具包,旨在将自然语言中的句子解析为场景图,这些场景图是基于符号表示的图形结构。该项目受到了斯坦福场景图解析器的启发,不同的是,这个解析器是完全用Python语言开发的,拥有简便的用户界面和易于配置的设计。
项目特色
SceneGraphParser通过依赖解析方法,将句子解析为图形。这些图中的节点代表名词(并包括描述性的修饰词如定冠词或形容词),而边则表示名词之间的关系。需注意,该项目仍在开发中,所有的API可能会随时变动,开发者欢迎各种形式的反馈和帮助,尤其对于程序在解析异常或边缘情况时所遇到的问题。
项目用途
该工具是为了辅助研究在2019年计算机视觉与模式识别会议(CVPR)上口头报告的《统一视觉-语义嵌入:利用结构化意义表示连接视觉与语言》而开发的。论文合著者包括吴昊、毛嘉元、张宇峰、姜琬寗、李磊、孙伟伟和马维英。
软件安装
可以通过pip来安装SceneGraphParser。在安装后,由于此工具目前仅支持spaCy作为后端,需要下载相应的英文语言包。
pip install SceneGraphParser
python -m spacy download en # 用于解析英文
使用示例
SceneGraphParser最简单的用法是使用parse
函数。目前它支持spaCy作为后端。
import sng_parser
graph = sng_parser.parse('A woman is playing the piano in the room.')
解析后的场景图可以通过pprint模块进行输出:
from pprint import pprint
pprint(graph)
输出的场景图如下:
{'entities': [{'head': 'woman', 'lemma_head': 'woman', 'lemma_span': 'a woman', 'modifiers': [{'dep': 'det', 'lemma_span': 'a', 'span': 'A'}], 'span': 'A woman'},
{'head': 'piano', 'lemma_head': 'piano', 'lemma_span': 'the piano', 'modifiers': [{'dep': 'det', 'lemma_span': 'the', 'span': 'the'}], 'span': 'the piano'},
{'head': 'room', 'lemma_head': 'room', 'lemma_span': 'the room', 'modifiers': [{'dep': 'det', 'lemma_span': 'the', 'span': 'the'}], 'span': 'the room'}],
'relations': [{'object': 1, 'relation': 'playing', 'subject': 0},
{'object': 2, 'relation': 'in', 'subject': 0}]}
此外,还可以使用sng_parser
提供的tprint
函数对解析的图进行表格式的输出:
sng_parser.tprint(graph)
其输出为:
Entities:
+--------+-----------+-------------+
| Head | Span | Modifiers |
|--------+-----------+-------------|
| woman | a woman | a |
| piano | the piano | the |
| room | the room | the |
+--------+-----------+-------------+
Relations:
+-----------+------------+----------+
| Subject | Relation | Object |
|-----------+------------+----------|
| woman | playing | piano |
| woman | in | room |
+-----------+------------+----------+
自定义解析器
用户还可以自定义解析器的配置,针对不同的需求和后端进行调整:
import sng_parser
parser = sng_parser.Parser('spacy', model='en')
graph = parser.parse('A woman is playing the piano in the room.')
场景图的规范
本工具使用Python的dict
和list
来表示图结构。尽管这种灵活性可能带来一定的问题,但这种表示方法让Python项目更容易集成进来,而无需担心结果的序列化问题。
解析生成的场景图遵循以下规格:
{
'entities': [ # 一组实体
{
'span': "名词短语的完整跨度",
'lemma_span': "跨度的词元化版本",
'head': "主名词",
'lemma_head': "主名词的词元化版本",
'modifiers': [
{
'dep': "依存类型",
'span': "修饰词的跨度",
'lemma_span': "跨度的词元化版本"
},
# 其他修饰词...
]
},
# 其他实体...
],
'relations': [ # 一组关系
{
'subject': "主体的实体ID",
'object': "客体的实体ID",
'relation': "关系"
}
# 其他关系...
]
}