在python中的Bigram

时间:2014-09-21 13:47:52

标签: python python-3.3

我想把一个句子分成二元组。例如:

"My name is really nice. This is so awesome." 

- >

["My name","name is", "is really", "really nice.", "This is", "is so", "so awesome."]

任何帮助?

3 个答案:

答案 0 :(得分:0)

首先,您可以再次使用split('.')在您的字符串中分割句子split每个句子,然后使用zip()连接它们!

>>> [' '.join(i) for s2 in s.split('.') for i in zip(s2.split(),s2.split()[1:])]
['My name', 'name is', 'is really', 'really nice', 'This is', 'is so', 'so awesome']
>>> 

答案 1 :(得分:0)

你可以通过积极的前瞻来做到这一点,

>>> import re
>>> s = "My name is really nice. This is so awesome."
>>> m = re.findall(r'(?=(\b\w+\b \S+))', s)
>>> m
['My name', 'name is', 'is really', 'really nice.', 'This is', 'is so', 'so awesome.']

模式说明:

  • (?=...)前瞻是零长度断言,就像行的开头和结尾,以及单词的开头和结尾一样。它不会消耗字符串中的字符,但只断言是否可以匹配。
  • ()捕获用于捕获符合()内部模式的字符的组。
  • \b字边界。它匹配单词字符和非单词字符。
  • \w+匹配一个或多个单词字符。
  • \S+匹配空格和以下非空格字符。
  • findall函数通常会在捕获的组内打印字符。如果没有捕获组,那么它将打印匹配。在我们的例子中,它将打印组索引1中存在的字符。要匹配重叠的字符,您需要将模式放在前瞻中。

答案 2 :(得分:0)

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

输出:

In [67]: ngrams("My name is really nice".split(),2)
Out[67]: [['My', 'name'], ['name', 'is'], ['is', 'really'], ['really', 'nice']]