Python - 中文文本相似度计算与模糊匹配

本文介绍了文本相似度计算中的Jaccard相似度、Cosine相似度和Levenshtein距离,以及如何利用FuzzyWuzzy进行模糊匹配。通过jieba分词处理中文文本,并展示了相关函数的实现和实例。

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

目录

一.引言

二.文本相似度计算

1.Jaccard 相似度

2.Cosine 相似度

3.Levenshtein 距离

三.模糊匹配

四.总结


一.引言

日常工作中需要计算文本之间的匹配程度,获取最匹配、相近的台词,下面介绍几种常见的文本相似度计算方法以及模糊匹配计算相似文本的方法。

二.文本相似度计算

Tips:

由于中文分词与英文分词不同,这里中文相似度计算统一采用 jieba 分词作为分析结果并计算。

import jieba

# Jieba 分词
def chinese_tokenizer(text):
    return jieba.cut(text, cut_all=False)

1.Jaccard 相似度

定义

最基础的文本相似度计算,基于统计学寻求两个字符串的交集与并集,距离越大二者相似度越小。 

实现

def jaccard_similarity(str1, str2):
    words1 = chinese_tokenizer(str1)
    words2 = chinese_tokenizer(str2)
    set1 = set(words1)
    set2 = set(words2)
    return len(set1.intersection(set2)) / len(set1.union(set2))
text1 = "酒要一口一口喝"
text2 = "要一口一口喝"
set1 = {'喝', '酒要', '一口'}
set2 = {'喝', '一口', '要'}
Jaccard 相似度: 0.5

2.Cosine 相似度

定义

通过  Sklearn 库的 TfidVectorizer 将文本向量化,随后调用 cosine_similarity 计算相似度。

实现

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

def cosine_similarity_text(str1, str2):
    words1 = ' '.join(chinese_tokenizer(str1))
    words2 = ' '.join(chinese_tokenizer(str2))
    vectorizer = TfidfVectorizer()
    tfidf = vectorizer.fit_transform([words1, words2])
    return cosine_similarity(tfidf)[0][1]
words1: 酒要 一口 一口 喝
words2: 要 一口 一口 喝
Cosine 相似度: 0.8181802073667197

3.Levenshtein 距离

定义

莱文斯坦距离 (LD) 用于衡量两个字符串之间的相似度,其被定义为' 将字符串 str1 变换为字符串 str2 所需的删除、插入、替换操作的次数

实现

import Levenshtein
def levenshtein_distance(str1, str2):
    words1 = ''.join(chinese_tokenizer(str1))
    words2 = ''.join(chinese_tokenizer(str2))
    return Levenshtein.distance(words1, words2)
words1: {'一口', '要', '喝', '美酒'}
words2: {'一口', '要', '喝'}
Levenshtein 距离: 2

三.模糊匹配

定义

Fuzzywuzzy 是一款可以对字符串模糊匹配的工具, 它使用上面提到的 Levenshtein Distance 来计算出那些易用包中序列之间的差异。

实现

from fuzzywuzzy import process

subs = ["你好", "在干嘛", "吃饭了吗", "好的"]
text = "你好吗"

best_match = process.extractOne(text, subs)
print(f"Ori: {text} Best match: {best_match[0]} (Score: {best_match[1]})")

我们可以构建 subs 子集,并传入目标字符,寻找相似度最高的文本。 

Ori: 你好吗 Best match: 你好 (Score: 90)

四.总结

这里介绍了几种相似度的计算方法,基于每一种相似度其实都可以定义自己的模糊匹配算法,只需寻找相似度最高的匹配字符即可。还有一种模糊匹配的数据结构是 Trie 树,之前介绍过,有兴趣的同学可以参考: Trie 树简介与应用实现

### 回答1: Python 中有许多第三方库可用来计算文本相似度。常用的有: - `fuzzywuzzy`,它使用 Levenshtein 距离算法计算字符串之间的相似度- `spaCy`,它使用 Cosine Similarity 算法计算文本之间的相似度- `gensim` 中的 `doc2vec` 或 `word2vec`,它使用神经网络算法计算文本之间的相似度。 需要注意的是,文本相似度并不是唯一的评估方法,具体使用哪个库和算法还要根据你的场景来决定。 ### 回答2: Python语言有很多用于匹配文本相似度的库和工具。其中最常用的包括difflib、fuzzywuzzy、nltk和gensim。 difflib库提供了一些类和方法用于比较和匹配文本字符串的差异程度,比如SeqMatcher类可以用来计算两个序列之间的相似度,get_close_matches函数可以用来查找最接近的匹配项等。 fuzzywuzzy库是基于Levenshtein距离算法的文本匹配工具,可以衡量两个字符串之间的编辑距离,提供了一些模糊匹配的函数,如ratio函数用于计算两个字符串的相似程度,返回一个相似度百分比。 nltk库是一个自然语言处理工具包,其中包含了丰富的文本处理和匹配功能。它提供了一些用于标记文本、计算词频、提取关键词、词干化和词向量化的函数和类。 gensim库是一个用于语义建模和相似度计算的库,它提供了一些算法和模型,如word2vec和doc2vec,可以用来将文本转换为向量表示,并计算向量之间的相似度。 这些库工具可以根据不同的文本相似度计算需求进行选择和使用。可以根据具体情况,选择合适的算法和模型,对文本进行预处理和特征提取,然后使用相应的函数和类进行相似度计算。 ### 回答3: Python中有多种方法来进行文本相似度的匹配,常用的方法包括以下几种: 1. 余弦相似度Cosine Similarity):计算两个向量的夹角余弦值,值域在[-1, 1]之间。可以使用Python中的scipy库中的cosine函数来计算。 2. 编辑距离(Edit Distance):通过计算将一个字符串转换为另一个字符串所需的最少编辑操作次数来衡量文本之间的相似度。可以使用Python中的Levenshtein库来计算编辑距离。 3. Jaccard相似度(Jaccard Similarity):计算两个集合的交集大小除以并集大小得到的相似度指标。可以使用Python中的set数据结构来计算。 4. 文本向量化(Text Vectorization):将文本转换为向量表示,常用的方法有词袋模型(Bag-of-Words)和TF-IDF。可以使用Python中的sklearn库中的CountVectorizer和TfidfVectorizer来实现。 除了这些常用的方法外,还有其他更复杂和高级的算法可以实现文本相似度匹配,如基于深度学习的模型(如BERT、Word2Vec等)和基于语义的模型(如WordNet、GloVe等),这些方法需要更复杂的模型和技术来实现。 总结起来,Python提供了多种库和工具来实现文本相似度匹配,可以根据具体需求选择合适的方法和算法来进行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值