我们说我有这个字符串
my_string = "This is an example string"
我想知道是否有一种快速计算给定"窗口内所有双字母组合的方法"
例如,如果窗口是两个单词,则所有可能的双字母都是
["This is","is This","is an","an is","an example","example an","example string","string example"]
但是,如果窗口中有三个单词我们将这些双字母组合用于第一个三字窗口
["This is","is an","This an","an this",...]
使用sklearn很容易获得bigrams。例如,可以做
bigrams = CountVectorizer(analyzer = "word",
strip_accents = "ascii",
lowercase = True,
ngram_range = (2,2))
bigrams_counts = bigrams.fit_transform(my_string)
并且会给你所有双字母组的列表(甚至是计数),但它只包括字符串中存在的双字母组,而不包括其他组合(即"这个"和&#34 ;这个"不会在那里。)
那么,你知道是否有办法在给定的窗口内获得所有的双字母组合?
答案 0 :(得分:4)
来自示例:
["This is","is an","This an","an this",...]
这些看起来不像是bigrams,而是来自窗口的单词排列。对于3个单词:
from itertools import permutations, chain
from functools import partial
my_string = "This is an example string".split()
set(chain.from_iterable(map(partial(permutations,
r=2),
zip(my_string,
my_string[1:],
my_string[2:]))))
如果您需要计数,请使用Counter
,但要注意重叠会导致给定单词对的计数加倍,三倍等(取决于重叠的数量,例如窗口的大小)。 / p>
from collections import Counter
Counter(chain.from_iterable(map(partial(combinations, r=2),
zip(my_string,
my_string[1:],
my_string[2:]))))
结果:
Counter({('is', 'an'): 2, ('an', 'example'): 2, ('This', 'is'): 1, ('This', 'an'): 1, ('example', 'string'): 1, ('an', 'string'): 1, ('is', 'example'): 1})
最后,如果您需要将窗口作为单独的结果,请跳过链接:
list(map(partial(permutations, r=2),
zip(my_string, my_string[1:], my_string[2:])))