Gensim FastText/Word2vec如何设置10万高频词词表并保留指定词?
实现方案
你可以通过手动控制词表修剪的方式同时满足两个需求,具体操作如下:
1. 读取指定保留词列表
读取list.txt中的词,注意和你的语料预处理逻辑保持一致(你预处理时转了小写,所以读取时也统一转小写避免匹配失败):
with open("list.txt", "r", encoding="utf-8") as f: keep_words = [line.strip().lower() for line in f if line.strip()]
2. 调整词表构建逻辑
核心思路是先扫描全量语料获取所有词的频次,再优先保留指定词,再补充高频词凑够10万的词表规模,最后用自定义规则修剪词表:
from gensim.models import FastText # 你的paragraph_generator类保持不变 class paragraph_generator(object): def __init__(self,test=True,itersize=10000,year=None,state=None): self.test=test self.itersize=itersize self.sql = f""" SELECT text_id, lccn_sn, date, ed, chroniclingamerica_meta.statefp, chroniclingamerica_meta.countyfp, text_ocr FROM chroniclingamerica natural join chroniclingamerica_meta WHERE date_part('year',date) BETWEEN 1870 AND 1920 AND seq = 1 """ if self.test: self.sql = self.sql+' limit 10000' print(self.sql) def __iter__(self): con, cur = database_connection.connect(cursor_type='server') cur.itersize = self.itersize cur.execute(self.sql) for p in cur.fetchall(): tokens = p[-1].translate(str.maketrans('', '', punct)).replace('\n',' ').lower().split(' ') yield tokens con.close() # 初始化模型,min_count设为1避免提前过滤掉低频次的保留词 model = FastText(vector_size=256, window=8, min_count=1, epochs=1, workers=workers) sentences = paragraph_generator(test=False, itersize=10000, year=None, state=None) # 第一次扫描语料,获取全量词的频次统计 model.build_vocab(sentences) # 按频次从高到低排序所有词 all_word_with_count = [(word, vocab.count) for word, vocab in model.wv.key_to_index.items()] all_word_with_count.sort(key=lambda x: x[1], reverse=True) # 构造最终保留词集合,优先保留指定词 keep_set = set(keep_words) max_vocab_size = 100000 # 补充高频普通词直到词表规模达到10万 need_fill = max_vocab_size - len(keep_set) for word, count in all_word_with_count: if need_fill <= 0: break if word not in keep_set: keep_set.add(word) need_fill -= 1 # 自定义修剪规则:只保留我们筛选出的词 def vocab_trim_rule(word, count, min_count): return word in keep_set # 重新构建词表,应用修剪规则 model.build_vocab(sentences, trim_rule=vocab_trim_rule, update=False) # 正常训练模型 model.train(sentences, total_examples=model.corpus_count, epochs=1)
注意事项
- 如果
list.txt中的词未出现在语料中,FastText原生支持OOV词的向量生成,你后续仍可获取这些词的向量;如果需要这些词的语义参与训练,可以在预处理时把这些词随机插入到部分训练句中。 - 如果指定保留词的数量超过10万,上述逻辑会优先全量保留指定词,总词表规模会超过10万,你可以根据需求调整规则,比如对保留词按频次排序后截取前部分。
- 需保证
list.txt中的词和你分词后的词格式完全匹配,比如不要包含空格、特殊符号,大小写一致。
内容的提问来源于stack exchange,提问作者astampib
相关产品推荐
相关产品推荐

