为什么使用markovify马尔可夫链生成器从语料生成的句子存在大量重复?
markovify生成大量重复句子的原因及解决方法
核心原因
- 语料库规模过小:你当前使用的训练语料仅为单段几百字的文本,默认2阶马尔可夫链依赖的二元词组组合数量极为有限,模型可选择的序列路径太少,自然会高频生成重复句子。
- 默认无生成结果去重逻辑:markovify的
make_sentence()方法默认仅校验生成的句子是否与训练语料中的原句完全一致,不会校验多次调用方法时生成的句子之间是否重复,循环调用时很容易出现重复输出。 - 默认尝试次数不足:
make_sentence()默认的尝试生成次数仅为10次,当可选路径少时,模型很难在有限尝试次数内生成新的有效句子,会直接返回已经生成过的可行结果。
解决方法
- 扩大训练语料规模,补充更多同主题文本,丰富二元词组的组合路径,从根源降低重复概率。
- 自行维护已生成句子的去重集合,每次生成句子后先判断是否已存在,存在则重新生成。
- 可根据语料规模适当调整
state_size参数,比如训练语料足够大时可设置为3,生成的句子连贯性更高、重复率更低。 - 调用
make_sentence()时增大tries参数,比如设置为50或更高,让模型每次生成时尝试更多路径。
优化后示例代码
import markovify # 读取语料,明确指定编码避免乱码 with open("testtekst.txt", encoding="ANSI") as f: text = f.read() # 构建模型,可根据语料规模调整state_size text_model = markovify.Text(text, state_size=2) # 维护去重集合保证输出不重复 generated_sentences = set() target_count = 20 while len(generated_sentences) < target_count: # 增大尝试次数提升生成新句子的概率 sentence = text_model.make_sentence(tries=50) if sentence and sentence not in generated_sentences: generated_sentences.add(sentence) print(sentence)
内容的提问来源于stack exchange,提问作者Allar
相关产品推荐
相关产品推荐

