使用bigram模型生成5词以上句子,for循环实现逻辑问题求助
Bigram句子生成实现方案
核心逻辑
你已经完成了bigram频率统计,得到了「前词-后词-出现频率」的映射表,生成句子的迭代逻辑如下:
- 句子初始状态为用户输入的第一个词
- 每一轮拿当前句子的最后一个词作为前词,从映射表里筛选所有匹配的后词,按频率加权随机抽取一个后词加入句子
- 重复迭代直到句子长度达到要求(不低于5个词)
完整可运行代码
已修正原始代码的缩进问题,并补充生成循环部分:
from collections import Counter import pandas as pd import string import random file_name = 'Textbook.txt' fd = open(file_name, encoding='utf8') book = fd.read() fd.close() def clean_words(text): unwanted = str.maketrans('', '', string.punctuation) return text.translate(unwanted) def bigram(book): book = clean_words(book) book = book.lower() words = book.split() pairs = zip(words,words[1:]) bigram_words = Counter(pairs) freq = list(bigram_words.values()) bigram = list(bigram_words) first = [] second = [] for i in bigram: first.append(i[0]) second.append(i[1]) return pd.DataFrame({'First':first,'Second':second,'Frequency':freq}) bigram_df = bigram(book) print(bigram_df) # 输入初始词 First_Word = input("请输入初始词:").lower() # 初始化句子列表 sentence = [First_Word] # 设定目标句子长度,可自行调整,不低于5即可 target_len = 8 # 生成循环:因为已经有1个初始词,所以循环target_len-1次 for _ in range(target_len - 1): current_word = sentence[-1] # 筛选当前词对应的所有后词和频率 match_df = bigram_df[bigram_df['First'] == current_word] # 边界处理:如果当前词没有匹配的后词,随机选一个语料中的词 if len(match_df) == 0: next_word = random.choice(list(bigram_df['First'].unique())) else: # 按频率加权抽样后词 next_word = random.choices( population = list(match_df['Second']), weights = list(match_df['Frequency']), k = 1 )[0] sentence.append(next_word) # 输出完整句子 print("生成的句子:", ' '.join(sentence))
关键部分说明
random.choices的weights参数直接传入对应后词的频率,频率越高的后词被抽到的概率越大,符合bigram模型的统计规则- 加入了边界兼容逻辑,避免遇到语料中没有后续搭配的词时报错
- 可以修改
target_len的数值调整生成句子的长度,设置为5即可满足最低要求
内容的提问来源于stack exchange,提问作者Taylor Wratten
相关产品推荐
相关产品推荐

