能否基于Token列合并两个TXT文件?附现有拼接代码
基于Token列合并两个TXT文件的解决方案
当然可以!你当前的代码是按行顺序直接拼接,但如果两个文件的Token行序不一致,这种方式就会出错。要实现基于Token列的匹配合并,核心思路是先把其中一个文件的内容以Token为键存入字典,再遍历另一个文件通过Token匹配对应内容,具体实现如下:
核心实现代码
# 第一步:将向量文件加载到字典,用Token作为唯一标识 vector_lookup = {} with open('s1_5w10f_vectors.txt', 'r', encoding='utf-8') as vec_file: for line in vec_file: line = line.strip() if not line: continue # 拆分Token和后续向量部分,maxsplit=1确保Token含空格也能正确拆分 token, vector_content = line.split(maxsplit=1) vector_lookup[token] = vector_content # 第二步:遍历计数文件,匹配Token并合并内容 with open('s1_5w10f_vocab.txt', 'r', encoding='utf-8') as count_file, \ open('/Users/dlhoffman/5w10f.txt', 'w', encoding='utf-8') as output_file: for line in count_file: line = line.strip() if not line: continue # 拆分Token和计数部分 token, count_content = line.split(maxsplit=1) # 匹配对应的向量内容 if token in vector_lookup: # 按「Token + 计数 + 向量」的格式写入 output_file.write(f"{token} {count_content} {vector_lookup[token]}\n") else: # 可选:处理Token在计数文件但无对应向量的情况 print(f"注意:Token '{token}' 未找到对应的向量,已跳过")
关键细节说明
- 处理含空格的Token:用
split(maxsplit=1)而不是普通的split(),确保即使Token本身包含空格,也能正确拆分出Token和后续内容 - 编码问题:添加
encoding='utf-8'避免中文或特殊字符出现乱码(如果你的文件是其他编码,替换成对应编码即可) - 空行处理:跳过空行避免出现无效的匹配和写入
- 缺失值处理:代码中加入了缺失向量的提示,你也可以根据需求修改——比如给缺失的向量填充
0或者空字符串,或者反过来遍历向量文件匹配计数
扩展场景:全量合并(保留所有Token)
如果需要保留所有在任一文件中出现的Token(不管是否在另一个文件中有匹配),可以用以下逻辑:
# 收集所有唯一Token all_tokens = set() # 先读取两个文件的Token with open('s1_5w10f_vocab.txt', 'r', encoding='utf-8') as f: all_tokens.update(line.strip().split(maxsplit=1)[0] for line in f if line.strip()) with open('s1_5w10f_vectors.txt', 'r', encoding='utf-8') as f: all_tokens.update(line.strip().split(maxsplit=1)[0] for line in f if line.strip()) # 重新加载两个文件的字典 count_dict = {} with open('s1_5w10f_vocab.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line: token, cnt = line.split(maxsplit=1) count_dict[token] = cnt vector_dict = {} with open('s1_5w10f_vectors.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line: token, vec = line.split(maxsplit=1) vector_dict[token] = vec # 写入全量合并内容 with open('/Users/dlhoffman/5w10f_full.txt', 'w', encoding='utf-8') as f: for token in all_tokens: count = count_dict.get(token, "0") # 缺失计数用0填充 vector = vector_dict.get(token, "") # 缺失向量用空字符串填充 f.write(f"{token} {count} {vector}\n")
内容的提问来源于stack exchange,提问作者profhoff
相关产品推荐
相关产品推荐

