社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

实现步骤

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
 
584 次点击