【问题标题】:Compare bigrams and trigrams from same text比较来自相同文本的二元组和三元组
【发布时间】:2018-09-14 10:49:21
【问题描述】:

我有 2 个来自同一文本的标准化二元组和三元组列表。 我需要的是一个三元组列表,其中前两个单词包含来自同一文本的一个二元组。例如['spam eggs blabla'] 应该与[spam eggs] 匹配。有什么想法吗?

【问题讨论】:

  • 嘿@Alex Nitikin,要明确一点:你有两个列表,一个是二元组,一个是三元组。您正在寻找您的三元组列表的子列表,这样每个元素在您的二元组列表中也包含一个二元组,对吗?
  • @Peter Dolan 感谢您的回复。 trigram 的前两个元素应包含与 bigrams 的完全匹配。
  • 嘿@AlexNikitin,没问题。 bigrams/trigrams 是字符串,还是列表本身?三元组看起来像['Hello', 'there', 'sir'] 还是['hello there sir']
  • 我不喜欢这个想法,但如果您考虑 ngram 相似性,一个简单的方法是使用 BLEU。

标签: python list nlp nltk


【解决方案1】:

您可以使用prefix tree (also known as trie)

这是一个运行示例:

In [1]: import pygtrie

In [2]: pygtrie?

In [3]: trie = pygtrie.StringTrie()

In [4]: pygtrie.StringTrie?

In [5]: trie['/spam/egg'] = True

In [6]: trie['/foo/bar/baz'] = True

In [7]: trie.prefixes('/spam/egg/one')
Out[7]: <generator object Trie.prefixes at 0x7f18e91d9bf8>

In [8]: list(trie.prefixes('/spam/egg/one'))
Out[8]: [('/spam/egg', True)]

In [9]: list(trie.prefixes('/spam/egg/two'))
Out[9]: [('/spam/egg', True)]

In [10]: list(trie.prefixes('/spam/egg/three'))
Out[10]: [('/spam/egg', True)]

In [11]: list(trie.prefixes('/foo/bar/baz/python'))
Out[11]: [('/foo/bar/baz', True)]

【讨论】:

  • 应该将 / 用作插入分隔符,同时在 trie 中插入 key_or_slice 代替空格。
  • 可以使用空格作为分隔符
【解决方案2】:

拆分您的trigrams 以选择前 2 个和最后两个单词(以防万一您想分析。然后您可以进行比较,在较高级别您可以尝试 String Fuzzy Matching 以匹配 100% 匹配。首选数据结构我会说List。从trigrams 中列出所有以上两个包含2 个单词的列表列表,然后执行匹配操作。例如:

li = ['spam eggs blabla']
li[0].split()[0:2]
output >> ['spam', 'eggs']

现在你可能想转换成字符串

li1 = li[0].split()[0:2]
str1 = ' '.join(li1)

现在您对bigrams 执行类似操作并尝试比较。

供参考String Fuzzy MatchHere

【讨论】:

  • 谢谢!您能否建议我如何将三元组列表拆分为单词子列表?
  • @AlexNikitin 已添加,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2014-12-26
  • 2013-11-30
相关资源
最近更新 更多