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
相关产品推荐
相关产品推荐

