如何获得给定窗口大小内的所有双字母组合?

时间:2016-03-22 21:01:24

标签: python nlp scikit-learn

我们说我有这个字符串

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 ;这个"不会在那里。)

那么,你知道是否有办法在给定的窗口内获得所有的双字母组合?

1 个答案:

答案 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:])))