gpt4 book ai didi

python - NLTK MLE 模型澄清三元组及更多

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:26 26 4
gpt4 key购买 nike

我正在学习 NLTK,并且有一个关于数据预处理和 MLE 模型的问题。目前我正在尝试使用 MLE 模型生成单词。问题是当我选择 n>=3 时。我的模型将完全正常地生成单词,直到它到达句点(“.”)。之后,它只会输出句末填充。

这本质上就是我正在做的事情。


tokenized_text = [list(map(str.lower, word_tokenize(sent)))
for sent in sent_tokenize(MYTEXTINPUT)]

n = 3
train_data, padded_sents = padded_everygram_pipeline(n, tokenized_text)
model = MLE(n)
model.fit(train_data, padded_sents)
model.generate(20)

# OUTPUT:
eg:
blah beep bloop . </s> </s> </s> </s> </s> </s> </s> </s> (continues till 20 words reached)

我怀疑问题的答案在于我的 n 元模型为模型准备的方式。那么有没有一种方法可以格式化/准备数据,以便例如生成三元组,如下所示 --> ( . , </s>, <s> )这样模型就会尝试再次开始另一个句子并输出更多单词?

或者有其他方法可以避免上面写的问题吗?

最佳答案

如果你看the code for fitting the language model你可以看到其核心是什么fit()所做的是根据 train_data 中的文档更新计数:

self.counts.update(self.vocab.lookup(sent) for sent in text)

但是,请注意,它一次更新一个句子的计数。每个句子都是完全独立的。该模型不知道该句子之前发生了什么,也不知道该句子之后发生了什么。另外,请记住,您正在训练三元组模型,因此每个句子中的最后两个单词是 ('</s>', '</s>') 。因此,模型了解到 '</s>'接下来是 '</s>'概率非常高,但它永远不会知道 '</s>'有时后面可以是 '<s>' .

因此,解决问题的最简单方法就是每次看到 generate() 时手动开始一个新句子(即再次调用 '</s>')。 。但假设您不想这样做,并希望模型一次性生成多个句子。

来自docstring for padded_everygram_pipeline :

Creates two iterators:
- sentences padded and turned into sequences of `nltk.util.everygrams`
- sentences padded as above and chained together for a flat stream of words

train_data 非常不同, padded_sents确实包含您的所有句子作为单个条目:

>>> tokenized_text= [['this', 'is', 'sentence', 'one'],
['this', 'is', 'sentence', 'two']
]
>>> train_data, padded_sents = padded_everygram_pipeline(n, tokenized_text)
>>> padded_sents = list(padded_sents) #we need to do this because padded_sents is a generator and can only be gone through once
>>> print(padded_sents)
['<s>', '<s>', 'this', 'is', 'sentence', 'one', '</s>', '</s>', '<s>', '<s>', 'this', 'is', 'sentence', 'two', '</s>', '</s>']
>>> model = MLE(n)
>>> model.fit(padded_sents, padded_sents) #notice that I'm not using train_data

好消息:我们现在有一个 '<s>' 的示例关注'</s>' 。坏消息:包含两个不同句子的 ngram 的唯一可能的三元组是 ('</s>', '</s>', '<s>')('</s>', '<s>', '<s>') 。所以generate现在应该生成多个句子,但这些句子的内容仍然是完全独立的。

如果你想让前一句的内容影响下一句的内容,事情就开始变得复杂了。您可以将语料库作为一系列段落(每个段落包含多个句子)传递给模型,而不是将其作为一系列句子传递给模型:

tokenized_text = [['this', 'is', 'sentence', 'one', '.', 'this', 'is', 'sentence', 'two', '.'],
['this', 'is', 'a', 'second', 'paragraph', '.']
]

这可行,但现在 '<s>''</s>'不是指句子的开始和结束,而是指段落的开始和结束。并且生成的段落仍然是相互独立的。您还可以将其扩展为生成一系列段落或整本书,而不是段落。这在某种程度上取决于什么最适合您的任务。

关于python - NLTK MLE 模型澄清三元组及更多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60295058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com