将字符串分为单词和短语

时间:2015-03-08 18:53:32

标签: python python-2.7

假设我有一个包含多个以空格分隔的单词的字符串,例如

words = "foo bar baz qux"

如果我想要一个单词列表,我可以致电words.split()并获取

['foo','bar','baz','qux']

但是,如果我想让每个单词每组(相邻)单词,比如

['foo bar baz qux', 'foo bar baz', 'bar baz qux', 
'foo bar', 'bar baz', 'baz qux', 'foo', 'bar',
'baz', 'qux']

我该如何解决这个问题?我确定我可以编写一个很大的丑陋函数,它接受一个像words这样的字符串,并迭代每组相邻元素以返回上面的内容,但是我在那里预感了更多优雅的方式来解决它。有吗?

3 个答案:

答案 0 :(得分:1)

漂亮"丑陋"和itertools

合并"Find all consecutive sub-sequences of length n in a sequence""concatenating sublists python"

from itertools import chain

words = "foo bar baz qux"

w = words.split()
print map(' '.join, chain.from_iterable(zip(*(w[i:] for i in range(i))) for i in range(1, len(w) + 1)))

输出:

['foo', 'bar', 'baz', 'qux', 'foo bar', 'bar baz', 'baz qux', 'foo bar baz', 'bar baz qux', 'foo bar baz qux']

不那么丑陋和纯粹的Python:

我找到了一个非常简短的解决方案 - 虽然它有两个嵌套的for循环。

print [' '.join(w[i:j+1]) for i in range(len(w)) for j in range(i, len(w))]

输出:

['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']

答案 1 :(得分:0)

您可以使用nltk库 - 用于自然语言处理。 e.g。

from nltk.util import ngrams
sentence = 'foo bar baz qux'

adj = [3, 2, 1]
for n in adj:
    print ngrams(sentence.split(), n) 

答案 2 :(得分:0)

第一原则方法(即不需要输入任何东西)确实是“丑陋的”#34;但不是太多"大",真的......

list = ['foo','bar','baz','qux']
length = len(list)
newlist = []
for item in list:
    string = item
    newlist.append(item)
    # assuming we're not on the last element, there's more strings to add starting with this
    startfrom = list.index(item) + 1
    for i in range(startfrom, length):
        string = string + ' ' + list[i]
        newlist.append(string)

print newlist

结果

['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']