【问题标题】:Parser trees comparison: Common sublist in two lists解析器树比较:两个列表中的常见子列表
【发布时间】:2018-12-11 10:53:48
【问题描述】:

我的目标是确定两个句子是否重复。

我正在尝试比较两个句子的解析器树。 我从解析器树中提取了以下格式的标签

['ROOT', 'SBARQ', 'WHADVP', 'WRB', 'SQ', 'VP', 'VBP', 'ADJP', 'RB', 'JJ', 'NP', 'NNP', 'NP', 'NP', 'NNS', 'VP', 'VBG', 'NP', 'NP', 'NNS', 'SBAR', 'WHNP', 'WDT', 'S', 'VP', 'VBP', 'ADVP', 'RB', 'VP', 'VBN', 'PP', 'IN', 'NP', 'NNP', '.']
['ROOT', 'SBARQ', 'WHADVP', 'WRB', 'SQ', 'VBP', 'NP', 'NNS', 'VP', 'VB', 'NP', 'NP', 'NNP', 'NNS', 'SBAR', 'WHNP', 'WDT', 'S', 'VP', 'MD', 'VP', 'VB', 'VP', 'VBN', 'ADVP', 'RB', 'PP', 'IN', 'NP', 'NNP', '.']

我想获取两个列表的公共子列表的长度。在上述情况下,结果将是 4('ROOT', 'SBARQ', 'WHADVP', 'WRB')+5('SBAR', 'WHNP', 'WDT', 'S', 'VP') +2('ADVP', 'RB')+5('PP', 'IN', 'NP', 'NNP', '.')。

或者你有任何其他的解决方案可以利用解析树来计算两个句子的相似度。 另一个问题是,获取解析树的最快方法是什么?因为我有超过 300,000 个句子对要比较...

提前致谢!

【问题讨论】:

  • 这些是 POS 标签,不是解析树。你确定你正在解决正确的问题吗?
  • 这些是我从解析树中得到的 pos 标签。我认为 pos 标签列表的公共子列表会很有用......你有一些见解可以分享我应该如何使用解析树来确定句子是否重复?
  • 由于您不是简单地逐字比较句子,我不知道您所说的“重复”是什么意思。对于“重复的细微变化”,我会对句子进行单词级差异。所以不,我不能提供任何建议。编辑您的问题以澄清您的意思,也许有人可以提出一种方法。

标签: python parsing nlp nltk stanford-nlp


【解决方案1】:

python 标准库包含 difflib 模块用于执行差异,类似这样(尽管结果与您的预期有些不同):

pos1 = ['ROOT', 'SBARQ', 'WHADVP', 'WRB', 'SQ', 'VP', 'VBP', 'ADJP', 'RB', 'JJ', 'NP', 'NNP', 'NP', 'NP', 'NNS', 'VP', 'VBG', 'NP', 'NP', 'NNS', 'SBAR', 'WHNP', 'WDT', 'S', 'VP', 'VBP', 'ADVP', 'RB', 'VP', 'VBN', 'PP', 'IN', 'NP', 'NNP', '.']
pos2 = ['ROOT', 'SBARQ', 'WHADVP', 'WRB', 'SQ', 'VBP', 'NP', 'NNS', 'VP', 'VB', 'NP', 'NP', 'NNP', 'NNS', 'SBAR', 'WHNP', 'WDT', 'S', 'VP', 'MD', 'VP', 'VB', 'VP', 'VBN', 'ADVP', 'RB', 'PP', 'IN', 'NP', 'NNP', '.']

from difflib import SequenceMatcher

sm = SequenceMatcher(a=pos1, b=pos2)
for diff in sm.get_opcodes():
    # uncomment this to see all the diffs
    # print(diff)
    op, f1_from, f1_to, f2_from, f2_to = diff
    if op == 'equal':
        print("{}{}".format(f1_to-f1_from, tuple(pos1[f1_from:f1_to])))

给予:

5('ROOT', 'SBARQ', 'WHADVP', 'WRB', 'SQ')
1('VBP',)
3('NP', 'NNS', 'VP')
2('NP', 'NP')
6('NNS', 'SBAR', 'WHNP', 'WDT', 'S', 'VP')
2('ADVP', 'RB')
5('PP', 'IN', 'NP', 'NNP', '.')

【讨论】:

  • 这就是我想要的!!谢谢!!
【解决方案2】:

我建议你阅读Longest common subsequence problem

这里你有两个例子使用递归和动态编程都写在 python 中

https://rosettacode.org/wiki/Longest_common_subsequence#Python

【讨论】:

  • 感谢您的信息!我想知道有没有更快的方法来做到这一点,因为我有超过 300,000 个句子对......
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2011-06-19
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多