假设我有这个字符串
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 = CountVectorizer(analyzer = "word",
strip_accents = "ascii",
lowercase = True,
ngram_range = (2,2))
bigrams_counts = bigrams.fit_transform(my_string)
并会给你所有二进制图的列表(甚至计数),但它只会包括字符串中存在的二进制词,而不是其他组合(即"this an"和"an this"不会存在)。
那么,您知道是否有办法在给定窗口中获取所有双字母吗?
从示例中:
["This is","is an","This an","an this",...]
这些看起来不像双字母,而是窗口外单词的排列。对于 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
,但请注意,重叠将导致给定单词对的计数加倍、三倍等(取决于重叠量,例如窗口的大小)。
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:])))