在人工智能与自然语言处理(NLP)的浪潮中,如何让计算机理解人类语言一直是个核心难题。本文将深入浅出地讲解Word Embedding(词嵌入)与Word2Vec的核心原理,并结合Python代码实战,带你从零训练一个词向量模型,探索其在推荐系统等场景中的落地应用。

一、什么是Word Embedding?为什么需要它?

计算机无法直接处理文字,只能处理数字。Word Embedding的核心任务,就是将自然语言中的每个词转换成一个固定维度的向量。转换完成后,词与词之间就可以进行数学计算了,比如计算相似度。

通俗理解:把词语映射到多维空间中的一个点,语义相近的词,它们的位置距离也更近。

  • 核心价值:将非结构化的文本转化为结构化数值,供机器学习模型使用。
  • 预训练模型:如今在百炼平台、魔搭社区等都有开箱即用的预训练Embedding模型,无需自己从头训练。
  • ⚠️ 注意:文本与图片的Embedding模型是异构的,不能用处理文本的模型去处理图像。

此外,需要区分Embedding模型大语言模型(LLM):Embedding模型专注向量化,而LLM(如ChatGPT)负责理解语义并生成回答,两者的能力边界完全不同。

二、Word2Vec实战:从分词到模型训练

Word2Vec是最经典的Embedding训练工具之一。它的训练效果高度依赖语料库的质量与数量——语料越多、质量越高,训练出的模型越精准。

下面我们以Python为例,演示完整流程:

1. 数据预处理(中文分词)

原始的文本通常是连续的句子,需要先使用jieba库进行分词。例如,将"孙悟空大闹天宫"切分为"孙悟空 / 大闹 / 天宫"。

# -*-coding: utf-8 -*-
# 对txt文件进行中文分词
import jieba
import os
from utils import files_processing
# 源文件所在目录
source_folder = './journey_to_the_west/source'
segment_folder = './journey_to_the_west/segment'
# 字词分割,对整个文件内容进行字词分割
def segment_lines(file_list,segment_out_dir,stopwords=[]):
    for i,file in enumerate(file_list):
        segment_out_name=os.path.join(segment_out_dir,'segment_{}.txt'.format(i))
        with open(file, 'rb') as f:
            document = f.read()
            document_cut = jieba.cut(document)
            sentence_segment=[]
            for word in document_cut:
                if word not in stopwords:
                    sentence_segment.append(word)
            result = ' '.join(sentence_segment)
            result = result.encode('utf-8')
            with open(segment_out_name, 'wb') as f2:
                f2.write(result)
# 对source中的txt文件进行分词,输出到segment目录中
file_list=files_processing.get_files_list(source_folder, postfix='*.txt')
segment_lines(file_list, segment_folder)

2. 训练Word2Vec模型

使用gensim库,通过PathLineSentences按行读取分词后的文件,并设置关键参数:

  • vector_size(词向量维度):如100或128,维度越高语义越精细,但训练成本也更高。
  • window(上下文窗口):例如设为3,表示取当前词前后各3个词作为上下文。
  • min_count(最小词频):过滤低频词,例如设为1则保留所有出现过的词。

训练完成后,每个词都会获得一个唯一的向量表示,语义相似的词在向量空间中的距离也更近。

# -*-coding: utf-8 -*-
from gensim.models import word2vec
# 如果目录中有多个文件,可以使用PathLineSentences
segment_folder = './journey_to_the_west/segment'
# 切分之后的句子合集
sentences = word2vec.PathLineSentences(segment_folder)
# 设置模型参数,进行训练
model = word2vec.Word2Vec(sentences, vector_size=100, window=3, min_count=1)
print(model.wv.similarity('孙悟空', '猪八戒'))
print(model.wv.similarity('孙悟空', '孙行者'))
print(model.wv.most_similar(positive=['孙悟空', '唐僧'], negative=['孙行者']))
# 保存模型
#model2.save('./models/word2Vec.model')

三、计算词相似度:余弦相似度的应用

加载训练好的模型,计算两个词的相似度,本质上是计算它们向量的余弦相似度(值越接近1,语义越相似)。

# 计算"孙悟空"和"猪八戒"的相似度
print(model.wv.similarity('孙悟空', '猪八戒'))

实践延伸:在Java或C++等语言中实现推荐逻辑时,同样可以调用训练好的向量文件,通过数学库计算余弦距离,原理完全一致。

四、Embedding的杀手级应用:相似商品推荐

掌握了Embedding技术,我们可以轻松构建一个语义推荐系统。相比传统的"关键词匹配"(如Java后端常用的Elasticsearch),Embedding能理解深层语义,推荐更加精准。

实现逻辑如下:

  1. 当用户搜索/点击某商品时,取出该商品的Embedding向量。
  2. 计算该向量与平台所有商品向量的余弦相似度。
  3. 按相似度排序,将Top N商品推荐给用户。

举个具体例子:

  • 商品A:"华为Mate60 Pro 5G手机" → 向量Vec_A
  • 商品B:"华为Mate60 标准版手机" → 向量Vec_B
  • 商品C:"苹果iPhone15 Pro手机" → 向量Vec_C

计算相似度:similarity(A,B)=0.95,similarity(A,C)=0.6。当用户搜索"华为Mate60 Pro"时,系统优先推荐商品B,再考虑商品C。

[AFFILIATE_SLOT_1]

五、Embedding推荐的优势与扩展思考

Embedding推荐系统具备两大核心优势:

  • 超越关键词匹配:传统推荐只看标题是否有相同词,而Embedding能理解语义。比如"男士运动鞋"和"男款跑步鞋",即使关键词不完全一致,向量相似度也高。
  • 泛化能力强:能挖掘用户潜在需求。例如用户买了"婴儿奶粉",系统能自动关联推荐"婴儿奶瓶""纸尿裤"等商品。

技术延伸:在实际生产环境中,Go语言常用于构建高并发的向量检索服务,配合FAISS等向量数据库,可实现毫秒级的相似度搜索。

⚠️ 注意事项:训练Embedding模型时,需注意语料的领域匹配度。使用通用语料训练的模型,在专业领域(如医疗、法律)的效果可能打折扣,建议使用领域语料进行微调。

[AFFILIATE_SLOT_2]

总结

本文从Word Embedding的基础概念出发,通过Python实战演示了Word2Vec的完整训练流程,并深入探讨了其在推荐系统中的应用。掌握Embedding技术,不仅能帮助你理解NLP的核心,更能为构建智能推荐、语义搜索等应用打下坚实基础。无论你使用Java、Go还是C++,向量化的思想都是相通的。