NLTK text.generate()。使用不同的ngram模型执行此操作

时间:2012-11-18 04:43:52

标签: python nlp nltk

我必须使用nltk生成随机句子。但是,看起来text.generate()只给我们带有三元组的句子。有什么方法可以扩展这个包括unigrams和bigrams吗?

我目前的代码是:

exclude = set(string.punctuation)
ln = ''.join(ch for ch in ln if ch not in exclude)


words = nltk.word_tokenize(ln)
my_bigrams = nltk.bigrams(words)
my_trigrams = nltk.trigrams(words)


tText = Text(words)
tText1 = Text(my_bigrams)
tText2 = Text(my_trigrams)
print tText.generate()
print tText1.generate()
print tText2.generate()

更改generate()函数:

def generate(self, length=100, c=3):
    """
    Print random text, generated using a trigram language model.

    :param length: The length of text to generate (default=100)
    :type length: int
    :seealso: NgramModel
    """
    if '_trigram_model' not in self.__dict__:
        print "Building ngram index..."
        estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)
        self._trigram_model = NgramModel(c, self, estimator=estimator)
    text = self._trigram_model.generate(length)
    print tokenwrap(text)

1 个答案:

答案 0 :(得分:1)

阅读完代码后,请注意以下几点:

  • nltk.Text作为参数单词,而不是元组(bigrams,trigrams)。

  • nltk.Text.generate()使用trigrams 专门生成文本,作为documentation will tell you

如果你想使用unigrams和bigrams,你需要自己编写生成函数。它应该是直截了当的,作为起点generate()'s source

您甚至可以将它动态附加到nltk.Text类,以便对象可用:nltk.Text.generate_with_ngrams= my_generation_function(不要忘记将“self”包含为第一个参数)