合并或将n-gram合并为单个字符串

时间:2014-03-15 16:02:25

标签: python n-gram

如何将下面的双字母组合成一个字符串?

_bigrams=['the school', 'school boy', 'boy is', 'is reading']
_split=(' '.join(_bigrams)).split()
_newstr=[]
_filter=[_newstr.append(x) for x in _split if x not in _newstr]
_newstr=' '.join(_newstr)
print _newstr

Output:'the school boy is reading' ....它是理想的输出但是由于我的数据量很大,这种方法太长而且效率不高。其次,该方法不支持最终字符串中的重复单词,即'the school boy is reading, is he?'。在这种情况下,最终字符串中只允许其中一个'is'

有关如何使这项工作更好的任何建议?感谢。

3 个答案:

答案 0 :(得分:2)

# Multi-for generator expression allows us to create a flat iterable of words
all_words = (word for bigram in _bigrams for word in bigram.split())

def no_runs_of_words(words):
    """Takes an iterable of words and returns one with any runs condensed."""
    prev_word = None
    for word in words:
        if word != prev_word:
            yield word
        prev_word = word

final_string = ' '.join(no_runs_of_words(all_words))

这利用了生成器来懒惰地评估并且不会在内存中同时保留整个单词集,直到生成最后一个字符串。

答案 1 :(得分:2)

如果你真的想要一个oneliner,这样的东西可以工作:

' '.join(val.split()[0] for val in (_bigrams)) + ' ' +  _bigrams[-1].split()[-1]

答案 2 :(得分:1)

会这样做吗?它只是将第一个单词带到最后一个条目

_bigrams=['the school', 'school boy', 'boy is', 'is reading']

clause = [a.split()[0] if a != _bigrams[-1] else a for a in _bigrams]

print ' '.join(clause)

输出

the school boy is reading

然而,关于性能可能Amber的解决方案是一个不错的选择