You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何结合预训练词向量使用Gensim Phraser工具?

预训练词向量与短语模型结合的高效实现思路

首先直接给结论:没办法完全跳过计数统计环节直接结合Gensim的Phrase模型和预训练词向量——毕竟Phrase模型的核心逻辑就是通过共现频率、点互信息(PMI)这类统计指标,判断两个单字组合成短语的合理性,没有这些统计数据,模型根本不知道该把哪些词凑到一起。

不过别担心,既然你已经有了像GoogleNews这样自带短语嵌入的预训练词向量,我们完全可以换个思路:直接利用预训练词向量里现成的短语词表,来做分词后的短语匹配合并,不用重新训练Phrase模型的统计部分,而且能写出比你那版循环优雅得多的代码。

优化方案:基于预训练词表的短语匹配合并

第一步,先从预训练词向量里提取所有带下划线的短语,做成一个查询集合(集合的查询速度是O(1),比字典还快):

# 假设model是你加载好的GoogleNews-vectors-negative300模型
phrase_set = {word for word in model.key_to_index if '_' in word}

然后写一个更清晰的合并函数,用while循环控制索引,避免last_added这种容易混淆的标记变量:

from nltk import word_tokenize

def merge_pretrained_phrases(tokens, phrase_set):
    merged_tokens = []
    idx = 0
    token_count = len(tokens)
    
    while idx < token_count:
        # 检查当前词和下一个词组成的短语是否在预训练词表中
        if idx < token_count - 1 and f"{tokens[idx]}_{tokens[idx+1]}" in phrase_set:
            merged_tokens.append(f"{tokens[idx]}_{tokens[idx+1]}")
            idx += 2  # 跳过下一个词,因为已经合并完成
        else:
            merged_tokens.append(tokens[idx])
            idx += 1
    return merged_tokens

# 测试一下
sentence = 'I love New York.'
raw_tokens = word_tokenize(sentence)
processed_tokens = merge_pretrained_phrases(raw_tokens, phrase_set)
# 输出结果:['I', 'love', 'New_York', '.']

进阶扩展:处理更长的短语

如果你的预训练词向量里包含更长的短语(比如New_York_City),可以多做一轮匹配:先合并所有双字词短语,再用合并后的结果去匹配更长的短语。比如:

def merge_multi_length_phrases(tokens, phrase_set):
    # 先合并双字词
    merged = merge_pretrained_phrases(tokens, phrase_set)
    # 再检查合并后的结果里是否有更长的短语
    idx = 0
    final_merged = []
    n = len(merged)
    while idx < n:
        if idx < n -1 and f"{merged[idx]}_{merged[idx+1]}" in phrase_set:
            final_merged.append(f"{merged[idx]}_{merged[idx+1]}")
            idx +=2
        else:
            final_merged.append(merged[idx])
            idx +=1
    return final_merged

总结一下

  • 虽然没法绕过统计直接用Phrase模型,但我们可以利用预训练词向量现成的短语词表,直接做匹配合并,省去了重新统计语料的麻烦
  • 优化后的代码逻辑更清晰,避免了标记变量带来的混乱,可读性和维护性都更好
  • 针对更长的短语,可以通过多轮匹配来处理,不过这类情况在主流预训练词向量里并不常见

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

火山引擎 最新活动