实现步骤
1、使用Jieba做中文分词;2、使用gensim训练word2vec模型;3、对于句子,做中文分词,得到每个词语的embedding,计算平均作为句子embedding;4、使用余弦相似度计算句子相似度;
用于推荐算法、搜索匹配等场景。
安装技术库
conda create -n mypycommon2 python=3.9
conda activate mypycommon2
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gensim jieba
# 这一步是因为运行报错,所以scipy做了个降级
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy==1.12
1、中文分词,训练word2vec模型
import jieba
from gensim.models import Word2Vec
# 示例中文文本数据
documents = [
"我爱自然语言处理",
"机器学习是人工智能的一个分支",
"我喜欢用Python编程"
]
# 使用Jieba进行分词
def tokenize(document):
return list(jieba.cut(document))
tokenized_documents = [tokenize(doc) for doc in documents]
# 使用Gensim的Word2Vec模型进行训练
model = Word2Vec(sentences=tokenized_documents, vector_size=10, window=5, min_count=1, workers=4)
# 保存模型
model.save("word2vec_zh.model")
# 加载模型
loaded_model = Word2Vec.load("word2vec_zh.model")
# 使用模型
for word in loaded_model.wv.index_to_key:
print(f"Word: {word}, Vector: {loaded_model.wv[word]}")
输出每个词语的embedding:
Word: 是, Vector: [ 0.01631476 0.00189917 0.03473637 0.00217777 0.09618826 0.05060603
-0.0891739 -0.0704156 0.00901456 0.06392534]
Word: 学习, Vector: [-0.08619688 0.03665738 0.05189884 0.05741938 0.07466918 -0.06167675
0.01105614 0.06047282 -0.0284005 -0.06173522]
Word: 机器, Vector: [-0.00410223 -0.08368949 -0.05600012 0.07104538 0.0335254 0.0722567
0.06800248 0.07530741 -0.03789154 -0.00561806]
Word: 处理, Vector: [ 0.02348376 -0.04519032 0.08388732 -0.09858163 0.06764641 0.02914417
-0.04932832 0.04398187 -0.01739575 0.06711384]
Word: 自然语言, Vector: [ 0.0996485 -0.04362444 -0.00599338 -0.05695637 0.03850823 0.02786627
0.06891076 0.06101096 0.09538497 0.09273417]
Word: 爱, Vector: [ 0.07898068 -0.06989504 -0.09155865 -0.00355753 -0.03099841 0.07894317
0.05938574 -0.01545663 0.01510963 0.01790041]
2、编写函数,支持句子的分词和embedding计算
import jieba
import numpy as np
from gensim.models import Word2Vec
# 假设已经加载了模型
loaded_model = Word2Vec.load("word2vec_zh.model")
word_vectors = loaded_model.wv
# 示例句子
sentence = "我喜欢用Python编程"
# 使用Jieba进行分词
def tokenize(document):
return list(jieba.cut(document))
tokens = tokenize(sentence)
# 获取句子的embedding
def get_sentence_embedding(tokens, word_vectors):
# 初始化一个零向量
sentence_vector = np.zeros(word_vectors.vector_size)
count = 0
for token in tokens:
if token in word_vectors:
sentence_vector += word_vectors[token]
count += 1
if count > 0:
sentence_vector /= count # 取平均值
return sentence_vector
# 获取并打印句子的embedding
sentence_embedding = get_sentence_embedding(tokens, word_vectors)
print("Sentence Embedding:", sentence_embedding)
得到句子的embedding:
Sentence Embedding: [-0.00591818 0.01570095 0.01620592 0.0092304 -0.02036218 -0.02914423
0.0176105 0.03883457 -0.03159012 -0.02533777]
3、对于2个句子,计算相似度
from sklearn.metrics.pairwise import cosine_similarity
# 获取句子的embedding
embedding1 = get_sentence_embedding(tokens1, word_vectors)
embedding2 = get_sentence_embedding(tokens2, word_vectors)
# 计算句子之间的余弦相似度
similarity = cosine_similarity([embedding1], [embedding2])[0][0]
print("Similarity:", similarity)
基于这样的计算方法,如果能提供文章、餐馆、课程等数据,可以计算两两之间的的相似度,实现推荐系统。
如果想学习推荐系统,可以购买蚂蚁老师的推荐系统课程,提供答疑服务。