You need to enable JavaScript to run this app. Python 基于文本文件生成连续双词键字典的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Python 基于文本文件生成连续双词键字典的实现方法

实现核心思路

你已经完成了文本清洗、统一小写、拆分词列表的前置步骤,剩下的逻辑只需要用固定大小的滑动窗口遍历拆分好的词列表,逐个收集相邻二元词对的后续跟随词即可,完全匹配示例的输出规则。

滑动窗口的运行逻辑

我们要收集的核心关系是「连续2个相邻词 → 这组词后面紧跟的第3个词」,因此在拆分完成的词列表中,每次取3个连续元素为一组:

  • 前两个元素组成元组作为字典的键(列表无法作为字典键,元组可哈希,和示例的键格式完全匹配)
  • 第三个元素追加到对应键的列表值中
    窗口每次向前移动1个位置,直到遍历完所有可形成有效三元组的位置,全程不需要额外跳转检索。

无报错的遍历边界

因为每次需要取出i、i+1、i+2三个位置的元素,遍历的最大索引不能让i+2超出列表长度,因此循环的有效范围是从0到len(词列表) - 3,对应Python中可以直接写为for i in range(len(text_split) - 2)(range是开区间,刚好覆盖所有有效位置,不会触发索引越界报错)。

具体代码片段

在你现有代码的text_split = new_text.split()之后,补充如下逻辑即可:

from collections import defaultdict

# 初始化结果字典,每个键对应的默认值是空列表
predict_map = defaultdict(list)

# 滑动窗口遍历所有有效三元组
for i in range(len(text_split) - 2):
    bigram_key = (text_split[i], text_split[i+1])
    followed_word = text_split[i+2]
    predict_map[bigram_key].append(followed_word)

# 最终返回普通格式的字典即可
return dict(predict_map)

效果校验

拿你举的测试句处理完成后,拆分得到的词列表为:
['this', 'clause', 'is', 'first', 'and', 'this', 'clause', 'came', 'second']
按照上面的逻辑遍历后生成的字典完全匹配示例结果:

{
    ('this', 'clause'): ['is', 'came'],
    ('clause', 'is'): ['first'],
    ('is', 'first'): ['and'],
    ('first', 'and'): ['this'],
    ('and', 'this'): ['clause'],
    ('clause', 'came'): ['second']
}

可优化的细节

  • 原来的标点剥离步骤可以替换为str.translate实现,比循环逐字符替换效率高,处理《盖茨比》这种长文本的时候速度会有明显提升。
  • 不需要额外判断键是否存在:使用defaultdict(list)会自动给首次出现的词对初始化空列表,省去每次查字典键是否存在的判断逻辑。
  • 如果不想引入collections模块,也可以用普通字典实现:每次取到词对后,检查这个键是否在字典里,不存在就先给它赋值一个空列表,再把跟随词追加进去,效果完全一致。
  • 记得把原函数末尾的print(text_split)替换成返回结果的逻辑,不要直接打印中间的分词结果。

内容的提问来源于stack exchange,提问作者Stiff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 01:06:04