Python 比较同一文本中的bigram和trigram

Python 比较同一文本中的bigram和trigram,python,list,nlp,nltk,Python,List,Nlp,Nltk,我有两个来自同一个文本的标准化的二元图和三元图列表。 我需要的是一个三角形列表,它的前两个单词包含来自同一文本的一个二元形。例如,['spam egs blabla']应该与[spam egs]匹配。有什么想法吗?拆分您的三叉图,选择前两个单词和后两个单词(以防万一你想分析。然后你可以做比较,在高层你可以尝试字符串模糊匹配进行100%匹配。首选的数据结构我会说List。列出上面两个列表,其中包含三角形中的两个单词,然后执行匹配操作。例如: li = ['spam eggs blabla'] li

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

拆分您的
三叉图
,选择前两个单词和后两个单词(以防万一你想分析。然后你可以做比较,在高层你可以尝试
字符串模糊匹配
进行
100%
匹配。首选的数据结构我会说
List
。列出上面两个列表,其中包含
三角形中的两个单词,然后执行匹配操作。例如:

li = ['spam eggs blabla']
li[0].split()[0:2]
output >> ['spam', 'eggs']
现在您可能需要转换为字符串

li1 = li[0].split()[0:2]
str1 = ' '.join(li1)
现在,您可以对
bigrams
执行类似的操作,并尝试进行比较


参考
字符串模糊匹配

拆分您的
三叉图
以选择前两个单词和后两个单词(以防万一你想分析。然后你可以做比较,在高层你可以尝试
字符串模糊匹配
进行
100%
匹配。首选的数据结构我会说
List
。列出上面两个列表,其中包含
三角形中的两个单词,然后执行匹配操作。例如:

li = ['spam eggs blabla']
li[0].split()[0:2]
output >> ['spam', 'eggs']
现在您可能需要转换为字符串

li1 = li[0].split()[0:2]
str1 = ' '.join(li1)
现在,您可以对
bigrams
执行类似的操作,并尝试进行比较

作为参考,您可以使用

下面是一个运行示例:

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)]
[1]中的
:导入pygtrie
在[2]:皮格特里?
在[3]中:trie=pygtrie.StringTrie()
在[4]:pygtrie.StringTrie?
在[5]中:trie['/spam/egg']=True
在[6]中:trie['/foo/bar/baz']=True
[7]中:trie.前缀('/spam/egg/one')
出[7]:
在[8]中:列表(trie.前缀('/spam/egg/one'))
Out[8]:[('/spam/egg',True)]
在[9]中:列表(trie.前缀('/spam/egg/two'))
Out[9]:[('/spam/egg',True)]
在[10]中:列表(trie.前缀('/spam/egg/three'))
Out[10]:[('/spam/egg',True)]
在[11]中:列表(trie.前缀('/foo/bar/baz/python'))
Out[11]:[('/foo/bar/baz',True)]
您可以使用

下面是一个运行示例:

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)]
[1]中的
:导入pygtrie
在[2]:皮格特里?
在[3]中:trie=pygtrie.StringTrie()
在[4]:pygtrie.StringTrie?
在[5]中:trie['/spam/egg']=True
在[6]中:trie['/foo/bar/baz']=True
[7]中:trie.前缀('/spam/egg/one')
出[7]:
在[8]中:列表(trie.前缀('/spam/egg/one'))
Out[8]:[('/spam/egg',True)]
在[9]中:列表(trie.前缀('/spam/egg/two'))
Out[9]:[('/spam/egg',True)]
在[10]中:列表(trie.前缀('/spam/egg/three'))
Out[10]:[('/spam/egg',True)]
在[11]中:列表(trie.前缀('/foo/bar/baz/python'))
Out[11]:[('/foo/bar/baz',True)]

Hey@Alex Nitikin,需要澄清的是:您有两个列表,一个是二元图,另一个是三元图。您正在寻找三元图列表的子列表,以便每个元素在二元图列表中都包含一个二元图,对吗?@Peter Dolan感谢您的回答。三元图的前两个元素应该包含与二元图完全匹配的元素。Hey@AlexNikitin,没问题。是bigrams/trigrams字符串还是列表本身?一个trigram看起来像
['Hello','there','sir']
还是
['Hello there sir']
?我不喜欢这个想法,但如果你考虑到ngram的相似性,一个简单的方法是使用BLEU。嘿@Alex Nitikin,我想说清楚:你有两个列表,一个是双元图,一个是三元图。你在寻找三元图列表的子列表,这样每个元素在双元图列表中也包含一个双元图,对吗?@Peter Dolan谢谢请回答。三角形的前两个元素应该包含与bigrams完全匹配的元素。嘿@AlexNikitin,没问题。bigrams/trigrams是字符串还是列表?三角形看起来像
['Hello'、'there'、'sir']
还是
['Hello there sir']
?我不喜欢这个想法,但如果你考虑到ngram的相似性,一个简单的方法是使用BLEU。谢谢!你能建议我如何将一个三角形列表拆分为单词的子列表吗?@AlexNikitin补充道,我希望这有帮助。谢谢!你能建议我如何将一个三角形列表拆分为单词的子列表吗?@AlexNikitin补充道,我希望这有帮助。s应将
/
用作分隔符,以便在trie中插入和同时插入密钥或密钥片以代替空格。您可以将空格用作分隔符应将
/
用作分隔符,以便在trie中插入和同时插入密钥或密钥片以代替空格。您可以将空格用作分隔符