如何将 python 中的多个句子转换为二元语法
how to convert multiple sentences into bigram in python
我是 python 的新手,我想将一组句子转换为二元语法,有没有办法做到这一点?例如
X = ['I like u', 'u like me', ...]
如果 ngram = 2,我希望词汇表是这样的
[0: 'I ',
1: ' l',
2: 'li',
3: 'ik',
4: 'ke',
5: 'e ',
6: ' u',
7: 'u ',
8: ' m',
9: 'me'...]
所以 X 可以转换为
X_conv = [ '0, 1, 2, 3, 4, 5, 6',
'7, 1, 2, 3, 4, 5, 8, 9',....]
有没有我可以用 countvectorizer 做的功能?
说,你有函数 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()
结合起来,其中 returns 是一个可迭代的计数器。 __next__
魔术方法是可调用的,当第一次调用时 returns 第一个数字,然后是第二个,依此类推。 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'}
我是 python 的新手,我想将一组句子转换为二元语法,有没有办法做到这一点?例如
X = ['I like u', 'u like me', ...]
如果 ngram = 2,我希望词汇表是这样的
[0: 'I ',
1: ' l',
2: 'li',
3: 'ik',
4: 'ke',
5: 'e ',
6: ' u',
7: 'u ',
8: ' m',
9: 'me'...]
所以 X 可以转换为
X_conv = [ '0, 1, 2, 3, 4, 5, 6',
'7, 1, 2, 3, 4, 5, 8, 9',....]
有没有我可以用 countvectorizer 做的功能?
说,你有函数 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()
结合起来,其中 returns 是一个可迭代的计数器。 __next__
魔术方法是可调用的,当第一次调用时 returns 第一个数字,然后是第二个,依此类推。 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'}