You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:54:08