Py学习  »  Python

推荐算法必备,Python怎样实现中文分词,计算不同句子之间的相似度

蚂蚁学Python • 1 年前 • 743 次点击  

实现步骤

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)

基于这样的计算方法,如果能提供文章、餐馆、课程等数据,可以计算两两之间的的相似度,实现推荐系统。

如果想学习推荐系统,可以购买蚂蚁老师的推荐系统课程,提供答疑服务。



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/170513