如何根据依赖解析器的输出创建一棵树?

2024-02-12

我试图从依赖解析器的输出中创建一棵树(嵌套字典)。这句话是“我在睡梦中射杀了一头大象”。我能够获得链接中所述的输出:如何在 NLTK 中进行依存解析? https://stackoverflow.com/questions/7443330/how-do-i-do-dependency-parsing-in-nltk

nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)

为了将此元组列表转换为嵌套字典,我使用了以下链接:如何将Python的元组列表转换为树? https://stackoverflow.com/questions/39495924/how-to-convert-python-list-of-tuples-into-tree

def build_tree(list_of_tuples):
    all_nodes = {n[2]:((n[0], n[1]),{}) for n in list_of_tuples}
    root = {}    
    print all_nodes
    for item in list_of_tuples:
        rel, gov,dep = item
        if gov is not 'ROOT':
            all_nodes[gov][1][dep] = all_nodes[dep]
        else:
            root[dep] = all_nodes[dep]
    return root

输出如下:

{'shot': (('ROOT', 'ROOT'),
  {'I': (('nsubj', 'shot'), {}),
   'elephant': (('dobj', 'shot'), {'an': (('det', 'elephant'), {})}),
   'sleep': (('nmod', 'shot'),
    {'in': (('case', 'sleep'), {}), 'my': (('nmod:poss', 'sleep'), {})})})}

为了找到根到叶路径,我使用了以下链接:从嵌套字典树中将根返回到特定叶子 https://stackoverflow.com/questions/47302382/return-root-to-specific-leaf-from-a-nested-dictionary-tree

[制作树和查找路径是两件独立的事情]第二个目标是像完成的那样找到根到叶节点的路径从嵌套字典树中将根返回到特定叶子 https://stackoverflow.com/questions/47302382/return-root-to-specific-leaf-from-a-nested-dictionary-tree%5D。 但我想得到根到叶(依赖关系路径) 因此,例如,当我调用 recurse_category(categories, 'an') 时,其中categories 是嵌套树结构,'an' 是树中的单词,我应该得到ROOT-nsubj-dobj(依赖关系直到根)作为输出。


首先,如果您只是使用斯坦福 CoreNLP 依赖解析器的预训练模型,则应该使用CoreNLPDependencyParser from nltk.parse.corenlp并避免使用旧的nltk.parse.stanford界面。

See 斯坦福解析器和 NLTK https://stackoverflow.com/questions/13883277/stanford-parser-and-nltk/51981566#51981566

下载并在终端中运行 Java 服务器后,在 Python 中:

>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> sent = "I shot an elephant with a banana .".split()
>>> parses = list(dep_parser.parse(sent))
>>> type(parses[0])
<class 'nltk.parse.dependencygraph.DependencyGraph'>

现在我们看到解析的类型DependencyGraph from nltk.parse.dependencygraph https://github.com/nltk/nltk/blob/develop/nltk/parse/dependencygraph.py#L36 https://github.com/nltk/nltk/blob/develop/nltk/parse/dependencygraph.py#L36

要转换DependencyGraph to a nltk.tree.Tree通过简单地做来反对DependencyGraph.tree():

>>> parses[0].tree()
Tree('shot', ['I', Tree('elephant', ['an']), Tree('banana', ['with', 'a']), '.'])

>>> parses[0].tree().pretty_print()
          shot                  
  _________|____________         
 |   |  elephant      banana    
 |   |     |       _____|_____   
 I   .     an    with         a 

要将其转换为括号解析格式:

>>> print(parses[0].tree())
(shot I (elephant an) (banana with a) .)

如果您正在寻找依赖三元组:

>>> [(governor, dep, dependent) for governor, dep, dependent in parses[0].triples()]
[(('shot', 'VBD'), 'nsubj', ('I', 'PRP')), (('shot', 'VBD'), 'dobj', ('elephant', 'NN')), (('elephant', 'NN'), 'det', ('an', 'DT')), (('shot', 'VBD'), 'nmod', ('banana', 'NN')), (('banana', 'NN'), 'case', ('with', 'IN')), (('banana', 'NN'), 'det', ('a', 'DT')), (('shot', 'VBD'), 'punct', ('.', '.'))]

>>> for governor, dep, dependent in parses[0].triples():
...     print(governor, dep, dependent)
... 
('shot', 'VBD') nsubj ('I', 'PRP')
('shot', 'VBD') dobj ('elephant', 'NN')
('elephant', 'NN') det ('an', 'DT')
('shot', 'VBD') nmod ('banana', 'NN')
('banana', 'NN') case ('with', 'IN')
('banana', 'NN') det ('a', 'DT')
('shot', 'VBD') punct ('.', '.')

在 CONLL 格式中:

>>> print(parses[0].to_conll(style=10))
1   I   I   PRP PRP _   2   nsubj   _   _
2   shot    shoot   VBD VBD _   0   ROOT    _   _
3   an  a   DT  DT  _   4   det _   _
4   elephant    elephant    NN  NN  _   2   dobj    _   _
5   with    with    IN  IN  _   7   case    _   _
6   a   a   DT  DT  _   7   det _   _
7   banana  banana  NN  NN  _   2   nmod    _   _
8   .   .   .   .   _   2   punct   _   _
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据依赖解析器的输出创建一棵树? 的相关文章

  • 如何使用playsound模块停止音频?

    如何在Python代码中通过playaudio模块停止音频播放 我播放过音乐 但我无法停止音乐 我怎样才能阻止它 playsound playsound name of file 您可以使用多处理模块将声音作为后台进程播放 然后随时终止它
  • 在 Python 中同时插入行

    我正在尝试对我的代码进行矢量化 但遇到了障碍 我有 nxd x 值数组 x1 xn 其中每一行 x1 有很多点 x11 x1d nxd y 值数组 y1 y2 y3 其中每一行 y1 有很多点 y11 y1d x 值的 nx1 数组 x 1
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • 将数字转换为整数列表[重复]

    这个问题在这里已经有答案了 我该如何写magic下面的函数 gt gt gt num 123 gt gt gt lst magic num gt gt gt gt gt gt print lst type lst 1 2 3
  • Python 中嵌套列表的排序和分组

    我有以下数据结构 列表的列表 4 21 1 14 2008 10 24 15 42 58 3 22 4 2somename 2008 10 24 15 22 03 5 21 3 19 2008 10 24 15 45 45 6 21 1 1
  • 手动安装开放多语言世界网 (NLTK)

    我正在使用一台只能访问专用网络并且无法从命令行发送指令的计算机 因此 每当我必须安装 Python 包时 我都必须手动安装 我什至不能使用 Pypi 幸运的是 NLTK 允许我手动下载语料库 从here https www nltk org
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • 完全定制的Python帮助用法

    我正在尝试使用 Python 创建完全自定义的 帮助 用法 我计划将其导入到许多我想要具有风格一致性的程序中 但遇到了一些麻烦 我不知道为什么我的描述忽略换行符 尝试过 和 我无法让 出现在 ARGS 行的 换行符之后 显然它们坐在自己的行
  • Django Rest Framework 序列化器中的聚合(和其他带注释的)字段

    我正在尝试找出添加带注释字段的最佳方法 例如将任何聚合 计算 字段添加到 DRF 模型 序列化器 我的用例只是一种情况 端点返回的字段未存储在数据库中 而是从数据库计算得出 让我们看下面的例子 模型 py class IceCreamCom
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • t /= d 是什么意思? Python 和错误

    t current time b begInnIng value c change In value d duration def easeOutQuad swing function x t b c d alert jQuery easi
  • 模拟类:Mock() 还是 patch()?

    我在用mock http www voidspace org uk python mock index html使用Python 想知道这两种方法中哪一种更好 阅读 更Pythonic 方法一 只需创建一个模拟对象并使用它 代码如下 def
  • 导入我自己的模块时出现“ImportError:没有名为...的模块”

    我正在尝试导入模块 但不断收到导入错误 在 PortfolioStatus py 文件中 我有以下代码 它从 share data py 模块导入 share data 类 from Shares share data import sha
  • Tkinter 如何根据此组合框自动更新第二个组合框

    我在 Tkinter Python 中遇到了组合框更新的问题 我有两个组合框 组合框A with values A B C and 组合框B 我想要的是 当值A在组合框中选择A然后在组合框中B显示值 1 2 3 当值B在组合框中选择A然后在
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • Python 对列表中的值求和(如果它存在于另一个列表中)

    我有一个列表和一组 a list 1 2 2 1 1 1 b list 1 2 我正在寻找对应 b list 中的项目并将它们从 a list 中的值相加 以便输出为 1 3 2 1 我尝试过的 sum 0 for i in a list
  • python 相当于 sed

    有没有一种方法 无需双循环即可完成以下 sed 命令的操作 Input Time Banana spinach turkey sed i Banana s Toothpaste file Output Time BananaToothpas
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20

随机推荐

  • 当其中一个容器失败时,SSIS 包是否失败

    我有一个包含 1 个容器的包 如果该容器失败 ssis 包是否会失败 该物业 失败时失败包 对于容器来说是 false 这是否意味着只有当该属性设置为 TRUE 时包才会失败 否则只有容器状态失败 而包状态不是 是的 如果序列容器失败 则整
  • 获取webclient中通过AJAX生成的html

    我经常去某个网站查找资料 我心想 等等 我可以编程 当我可以编写一个为我做这件事的软件时 为什么我要手动访问这个网站呢 于是我开始了 我使用的是 C 所以我找到了 WebClient 和 Uri 我已经设法获取该网站的源代码 但出现的问题是
  • “弱参考”:需要脚踏实地的解释

    有人可以解释一下吗弱引用在德尔福 我注意到这个概念经常在我仔细检查的一些库 框架源代码中提到 我陷入了困境 想要对其有一个清晰的了解 通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态 弱引用用于打破 让彼此活着 的熊抱
  • 无法实例化 DatePipe

    我正在尝试实例化一个DatePipe我的 Angular2 应用程序中要使用的对象transform 我正在开发的组件中的功能 import DatePipe from angular common Component export cla
  • Android SecurityException:uid xxxxx 无法显式添加帐户

    我收到错误消息 java lang SecurityException uid 10178 cannot explicitly add accounts of type net roughdesign swms 即使是我可以创建的最基本的示
  • 带有 RuntimeWarning 的 numpy 除法:double_scalars 中遇到无效值

    我写了以下脚本 import numpy d numpy array 1089 1093 e numpy array 1000 4443 answer numpy exp 3 d answer1 numpy exp 3 e res answ
  • Python从大型文本文件中读取完整行的块(列值拆分为多行)

    我想分块读取一个大的 txt 文件 c 2 5GB 然后在加载到数据库之前执行一些操作 该文件只有 2 列 列分隔符为 并且有资格double quotes 第二列中的值可以跨越多行 下面的示例 我想用这个answer https stac
  • 如何减少大量包装类的实现代码?

    我正在开发一个包含一些类的库 我们称它们为C1 C2 and Cn 这些类中的每一个都实现一些接口 即I1 I2 Im n gt m 库中对象之间的关系很复杂 我必须 为我的库用户提供一些 API 以使用智能指针访问这些对象 经过一番讨论
  • 由于 org.eclipse.core.runtime 无法启动 eclipse

    我将一些插件复制到我的 eclipse 安装中 特别是 Green 和 ObjectAid answer https stackoverflow com questions 14772602 create class diagram aut
  • iOS 中 UITouch 时间戳的精度是多少?

    iOS 中 UITouch 类的时间戳属性有多精确 毫秒 几十毫秒 我正在将 iPad 的内部测量值与贴在屏幕上的自定义触摸检测电路进行比较 发现两者之间存在相当大的差异 标准偏差约 15 毫秒 我已经看到它建议时间戳根据帧刷新间隔进行离散
  • 将电子表格的一半格式化为红色,然后向下填充直到最后一行

    我有一个宏 它成功地获取了一个有 44 列的表格 并将其减少到 12 列 它分割了顶部部分 我们的供应商没有发送任何库存 总列中的单元格将显示 0 并将其粘贴在工作表的顶部 并插入复选框 在一定程度上 我非常努力地制作一个降价表 但它无法正
  • 没有 if 的语言?

    一位同事说他听说过一种没有 如果 概念的语言 那可能吗 如果是的话 它是什么语言 也许除了 Prolog 之外 我不知道任何特定的语言 但我可以想到一种没有语言的语言的几种方法if 语句可能有效 事实上 您也不需要循环构造 显然 您需要某种
  • 如何从linux中完全删除jenkins

    我已经删除了不同文件夹中的詹金斯所有目录 但当我访问 URL 时 它仍然显示 jenkins 登录 我想完全卸载詹金斯 已经尝试了来自互联网的许多命令 但服务器上仍然有詹金斯 我只能通过 putty 进行命令行访问 所以我尝试通过命令尽可能
  • 为什么我的 iPhone 应用程序的图标在构建后被划掉?

    我刚刚构建了我的第一个 iPhone 应用程序 但它的图标似乎被划掉了 当我构建代码时确实有一些警告 但为什么它们会导致应用程序图标交叉 我的应用程序没有错误 图标如下所示 这完全没问题 这只是意味着您的应用程序无法在您的 Mac 上执行
  • 在gvim中,是否可以有多行文件选项卡?

    在gvim中 是否可以有多行文件选项卡 也就是说 它不应该显示左 右箭头来围绕选项卡行导航 对于不适合选项卡行的选项卡 而是应该 开始 新的一行选项卡 AFAIK 不 除非你打算改变 vim 的源代码 但是 如果您需要那么多选项卡 请不要误
  • JavaScript:具有 SRC 属性的内联脚本?

    我习惯于像这样包含和使用 JS 出于好奇 有谁知道带有 src 属性的内联脚本的规则 例如
  • Scala 中的 forSome 关键字有什么用?

    我找到了以下代码片段 List T forSome type T The forSome看起来像一个方法 但我的朋友告诉我这是一个关键字 我用谷歌搜索了一下 但发现很少有关于forSome 它是什么意思 我在哪里可以获得相关文档 The f
  • 为什么这两种情况下putty中tmux的分割线显示不同(xxxxx,qqqqqq)?

    Why the split line of tmux within PuTTY shows different xxxxx qqqqqq in these tow cases If I do not set PuTTY any thing
  • 如何在 xsl if 中使用 xsl 变量

    我正在尝试将 xsl 变量中的值分配给 xml 文件中的新节点 此代码有效 但当 lbi GetCooperatives PVAL 的值为空时添加一个空的 PROP PVAL 节点
  • 如何根据依赖解析器的输出创建一棵树?

    我试图从依赖解析器的输出中创建一棵树 嵌套字典 这句话是 我在睡梦中射杀了一头大象 我能够获得链接中所述的输出 如何在 NLTK 中进行依存解析 https stackoverflow com questions 7443330 how d