吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1952|回复: 9
收起左侧

[Python 原创] 一个小工具,计算两个句子的相识度

  [复制链接]
AiSwcm 发表于 2023-9-20 15:26

识别两个句子的复杂度

  • 支持从一个列表中找出相识度最高的句子
  • 支持识别两个句子的复杂度
使用方法:
方法1:

从一个列表中找出相识度最高的句子,返回下标,相识度最高的句子,相识度

sentences = [
    "我喜欢吃香蕉。",
    "今天的天气真糟糕!",
    "我在山区度假。",
    "学习历史很有趣。",
    "我喜欢猫。",
    "明天我要去公园。",
    "我最喜欢的颜色是蓝色。",
    "我正在读一本关于科学的书。",
    "我喜欢听流行音乐。",
    "我正在学习法语语言。"
]

# 使用方法1:
print(find_most_similar_sentence_index(sentences, "香蕉是我最喜欢的"))

结果:

(0, '我喜欢吃香蕉。', 1.0000000000000002)
方法2:

识别两个句子的复杂度

print(similarity("我喜欢吃香蕉。", "香蕉是我最喜欢的"))

结果:

1.0000000000000002
代码:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from gensim.similarities import Similarity
from gensim import corpora, models
import numpy as np
import jieba

def preprocess(sentence):
    # 使用jieba分词进行分词
    words = jieba.cut(sentence)

    # 去掉停用词
    stopwords = ['的', '了', '是', '在', '什么']
    words = [word for word in words if word not in stopwords]

    # 将单词用空格连接起来并返回
    return ' '.join(words)

def similarity(s1, s2):
    '''暴力求解两个句子的相似度

    Args:
        s1: 第一个句子
        s2: 第二个句子

    Returns: 返回两个句子的相似度

    '''

    # 对两个句子进行预处理
    s1_processed = preprocess(s1)
    s2_processed = preprocess(s2)

    # 将两个句子合并成一个文档
    documents = [s1_processed, s2_processed]

    # 计算TF-IDF特征向量
    tfidf_vectorizer = TfidfVectorizer()
    tfidf_matrix = tfidf_vectorizer.fit_transform(documents)

    # 计算余弦相似度
    cosine_sim = cosine_similarity(tfidf_matrix)[0][1]

    return cosine_sim

def calculate_similarity(sentence1, sentence2):
    '''用了Gensim库中的语料库、词典、TF-IDF模型和相似度计算工具。求解两个句子意思上的相似度
    Args:
        sentence1:
        sentence2:

    Returns:返回这两个句子的余弦相似度
    '''

    # 对句子进行分词
    seg_sentence1 = jieba.lcut(sentence1)
    seg_sentence2 = jieba.lcut(sentence2)

    # 构建语料库
    corpus = []
    corpus.append(seg_sentence1)
    corpus.append(seg_sentence2)

    # 构建词典
    dictionary = corpora.Dictionary(corpus)

    # 将语料库转化为向量形式
    corpus_vec = [dictionary.doc2bow(text) for text in corpus]

    # 训练TF-IDF模型
    tfidf_model = models.TfidfModel(corpus_vec)

    # 将两个句子转换为向量形式
    sentence1_vec = tfidf_model[dictionary.doc2bow(seg_sentence1)]
    sentence2_vec = tfidf_model[dictionary.doc2bow(seg_sentence2)]

    # 计算两个句子的相似度
    similarity = Similarity('-Similarity-index', corpus_vec, num_features=len(dictionary))
    cosine_sim = similarity[sentence1_vec][0]

    return cosine_sim

def find_most_similar_sentence_index(sentences: list, target_sentence):
    '''

    Args:
        sentences: 查找的文本list
        target_sentence: 查找的目标句子

    Returns: 目标句子与列表中的所有句子比较,返回相似度最高的下标,和最匹配的句子, 和相识度的概率

    '''
    # 计算目标句子和列表中每个句子的相似度
    similarities = [similarity(target_sentence, s) for s in sentences]

    # 找到相似度最大的句子的下标
    max_index = np.argmax(similarities)
    return max_index, sentences[max_index], similarities[max_index]

免费评分

参与人数 5吾爱币 +10 热心值 +5 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Bob5230 + 1 + 1 谢谢@Thanks!
hrh123 + 1 + 1 用心讨论,共获提升!
Zhaofeiyan + 1 用心讨论,共获提升!
TaJ + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wapjsx 发表于 2023-9-20 17:02
楼主大大真牛!厉害厉害。

怯怯地说下,python里其实还有一个库,叫difflib来着的,建议参考下。
头号玩家 发表于 2023-9-20 17:34
 楼主| AiSwcm 发表于 2023-9-20 17:51
头号玩家 发表于 2023-9-20 17:34
在实际中有什么具体的应用吗

我是在给2个表格类似的内容,添加同样编号的时候用到。 批量赋值同样的编号。

两句话差不多一样但是有一点点区别。
头像被屏蔽
moruye 发表于 2023-9-20 18:23
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| AiSwcm 发表于 2023-9-20 18:29
wapjsx 发表于 2023-9-20 17:02
楼主大大真牛!厉害厉害。

怯怯地说下,python里其实还有一个库,叫difflib来着的,建议参考下。

学到了,非常有用!
sangsang123 发表于 2023-9-20 19:10
学到了,非常感谢
头像被屏蔽
kkoo 发表于 2023-9-20 20:17
提示: 该帖被管理员或版主屏蔽
li645944229 发表于 2023-9-20 21:42
英文可行不?效率如何
lookfeiji 发表于 2023-9-21 08:28
是什么样的情况,致使你开了这么大一个脑洞?直接对比他们的编码不好吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表