如何在python中将多个句子转换为bigram

时间:2017-10-08 06:48:20

标签: python text-mining n-gram countvectorizer

我对python很新,我想将一系列句子转换为双字母,有没有办法做到这一点?例如

[0: 'I ',
 1: ' l',
 2: 'li',
 3: 'ik',
 4: 'ke',
 5: 'e ',
 6: ' u',
 7: 'u ',
 8: ' m',
 9: 'me'...]

如果ngram = 2,我希望词汇表有类似

的内容
 X_conv = [ '0, 1, 2, 3, 4, 5, 6',
            '7, 1, 2, 3, 4, 5, 8, 9',....]

所以X可以转换为

setTimeout

是否有一个函数我可以用countvectorizer做什么?

1 个答案:

答案 0 :(得分:1)

说,你有ngrams函数:

def ngrams(text, n=2):
    return [text[i:i+n] for i in range(len(text)-n+1)]

现在将此应用于列表中的所有元素非常简单:

>>> sentences = ['I like u', 'u like me']
>>> processed = [ngrams(sentence, n=2) for sentence in sentences]
>>> processed
[['I ', ' l', 'li', 'ik', 'ke', 'e ', ' u'], 
 ['u ', ' l', 'li', 'ik', 'ke', 'e ', ' m', 'me']]

所以这很容易。要编写ngram,您可以构建嵌套的for循环,但它看起来不太好。

相反,我们可以使用一个技巧:collections.defaultdict,如果在第一次访问它时它不存在,它将创建一个新项目。我们将此与itertools.count()结合,返回一个可迭代的计数器。 __next__魔法方法是可调用的,当第一次调用时返回第一个数字,然后是第二个,依此类推。 defaultdict会针对每个新项目调用此方法一次

from collections import defaultdict
from itertools import count

reverse_vocabulary = defaultdict(count().__next__)
numbered = [[reverse_vocabulary[ngram] for ngram in sentence]
            for sentence in processed]
print(numbered)
# [[0, 1, 2, 3, 4, 5, 6], [7, 1, 2, 3, 4, 5, 8, 9]]

现在反向词汇与你想要的相反:

defaultdict(<...>, {' m': 8, ' u': 6, 'I ': 0, 'li': 2, 'u ': 7, 'e ': 5, 'ke': 4, 'ik': 3, 
                    ' l': 1, 'me': 9})

我们制作一个普通的词典by inverting the mapping

vocabulary = {number: ngram for ngram, number in reverse_vocabulary.items()}

导致词汇量成为普通词典

{0: 'I ', 1: ' l', 2: 'li', 3: 'ik', 4: 'ke', 5: 'e ', 6: ' u', 7: 'u ', 8: ' m', 9: 'me'}