短文本相似度计算

本文详细介绍了一种短文本相似度计算的方法,包括分词、建模和模型预测三个主要步骤。通过使用jieba进行分词,去除停用词,然后建立词袋模型,并利用TF-IDF模型计算文档间的相似度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

短文本相似度计算

引用优快云**经典的一句话:调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步。
文本相似度计算步骤如下:

  1. 分词;
 def tokenization(self, line):
        result = []
        words = jieba.lcut(line)
        for word in words:
            if word not in self.stop_word_list('../data/stopwords.txt'):
                result.append(word)
        return result

2.建模;

 def train_text(self, train_data_path):
        corpus = self.read_data_from_text(train_data_path)
        # 首先用dictionary方法获取词袋
        self.dictionary = corpora.Dictionary(corpus)
        # print('dictionary:',self.dictionary)
        # dictionary.keys()#词袋中用数字对所有词进行了编号
        # print(self.dictionary.token2id)#编号与词之间的对应关系
        # 使用doc2bow制作语料库,语料库是一组向量,向量中的元素是一个二元组(编号、频次数),对应分词后的文档中的每一个词
        doc_vectors = [self.dictionary.doc2bow(text) for text in corpus]
        # print('doc_vectors:',doc_vectors)
        return doc_vectors

3.模型预测;

 # TF-IDF模型得到的相似度
    def sim_cal_tfidf(self, doc_vector=None, input_file=""):
        """
        :param doc_vector: doc vector
        :param input_file:
        :return:
        """
        # 使用TF-IDF模型对语料库建模
        tfidf = models.TfidfModel(doc_vector)
        tfidf.save('../model/tfidf_model.pkl')
        tfidf.load('../model/tfidf_model.pkl')

        # 获取测试文档中,每个词的TF-IDF值
        tfidf_vectors = tfidf[doc_vector]
        # print('tfidf_vectors:', tfidf_vectors)
        # print('tfidf_vectors[0]:', tfidf_vectors[0])
        query = self.tokenization(input_file)
        query_bow = self.dictionary.doc2bow(query)
        # print('query_bow:', query_bow)
        index = similarities.MatrixSimilarity(tfidf_vectors)
        sims = index[query_bow]
        return list(enumerate(sims)), tfidf_vectors

参考文章:

https://blog.youkuaiyun.com/xc_zhou/article/details/80952460
https://blog.youkuaiyun.com/kevinelstri/article/details/70139797

<think>好的,用户需要关于如何用Python或其他语言编写分析语义相似度的代码。首先,我得回顾一下已有的知识库中的引用内容,看看有没有相关的示例或方法。 根据引用[2],用户提到了使用TF-IDF向量化和余弦相似度的基础方法。这应该是一个简单且常用的方法,适合入门。然后引用[3]和[4]提到了使用预训练的Sentence Transformers模型,比如BERT,来计算更复杂的语义相似度。特别是引用[3]详细说明了对称和非对称语义搜索的模型选择,还有如何加载本地模型。 首先,我需要整理这两种方法的步骤和代码示例。基础方法适合快速实现,而深度学习方法则能捕捉更深层次的语义关系。用户可能对这两种方法都感兴趣,或者需要根据具体情况选择合适的方法。 接下来,考虑用户的需求:分析语义相似度的代码实现。可能需要先介绍基础方法,再过渡到高级方法。确保每个步骤都有代码示例,并且解释清楚各部分的作用。比如TF-IDF将文本转换为向量,余弦相似度计算相似度得分;而Sentence Transformers则生成句子的嵌入向量,再用余弦相似度比较。 另外,引用[3]提到模型的缓存路径和本地加载方式,这点可能在代码中需要说明,特别是如果用户有本地模型的话。同时,引用[4]中的代码片段展示了如何输出带颜色的相似度结果,这可能对用户调试或展示结果有帮助,可以考虑加入。 还需要注意代码的实用性和可运行性。比如确保用户安装了必要的库,如scikit-learn和sentence-transformers。可能需要给出安装命令,但根据问题描述,用户可能已经有一定的基础,所以可能不需要详细说明安装步骤,但最好还是提一下。 最后,生成相关问题,帮助用户进一步学习,比如性能优化、模型选择、评估指标等。这些问题应该基于已有的内容,确保相关性。 总结回答结构:先介绍两种方法(TF-IDF+余弦相似度,预训练模型),每种方法给出步骤和代码,然后可能的应用场景,最后相关问题。确保引用正确,比如引用[2][3][4]分别对应不同的方法。</think>### 分析语义相似度的代码实现 #### 方法一:基于TF-IDF和余弦相似度(基础方法) 适用于短文本快速比较,通过词频统计计算相似度[^2] ```python from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def text_similarity(text1, text2): vectorizer = TfidfVectorizer() vectors = vectorizer.fit_transform([text1, text2]) return cosine_similarity(vectors)[0][1] text_a = "深度学习需要大量数据支持" text_b = "神经网络训练依赖大数据量" print(f"相似度: {text_similarity(text_a, text_b):.2f}") ``` #### 方法二:基于预训练语言模型(进阶方法) 使用`sentence-transformers`库实现深度语义理解,适合长文本和复杂语义关系[^3][^4] ```python from sentence_transformers import SentenceTransformer import numpy as np # 加载预训练模型(自动下载或指定本地路径) model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') sentences = [ "自动驾驶汽车使用激光雷达导航", "无人驾驶车辆通过激光传感器实现路径规划", "今天的天气非常适合户外运动" ] # 生成句向量 embeddings = model.encode(sentences) # 计算余弦相似度矩阵 cos_sim = np.inner(embeddings, embeddings) # 可视化结果 for i in range(len(sentences)): for j in range(i+1, len(sentences)): print(f"相似度 {i}-{j}: {cos_sim[i][j]:.2f}") ``` #### 应用场景选择建议 1. **基础方法**:客服问答匹配、简单文档去重 2. **深度模型**:法律文书比对、论文查重、语义搜索系统 3. **模型选择**:对称任务选`paraphrase-*`系列模型,非对称任务选`msmarco-*`系列模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值