找回密码
 会员注册
查看: 31|回复: 0

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

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
73219
发表于 2024-9-4 16:25:01 | 显示全部楼层 |阅读模式
目录一.引言二.文本相似度计算1.Jaccard相似度2.Cosine 相似度3.Levenshtein距离三.模糊匹配四.总结一.引言日常工作中需要计算文本之间的匹配程度,获取最匹配、相近的台词,下面介绍几种常见的文本相似度计算方法以及模糊匹配计算相似文本的方法。二.文本相似度计算Tips:由于中文分词与英文分词不同,这里中文相似度计算统一采用jieba分词作为分析结果并计算。importjieba#Jieba分词defchinese_tokenizer(text):returnjieba.cut(text,cut_all=False)1.Jaccard相似度◆定义最基础的文本相似度计算,基于统计学寻求两个字符串的交集与并集,距离越大二者相似度越小。 ◆实现defjaccard_similarity(str1,str2):words1=chinese_tokenizer(str1)words2=chinese_tokenizer(str2)set1=set(words1)set2=set(words2)returnlen(set1.intersection(set2))/len(set1.union(set2))'运行运行text1="酒要一口一口喝"text2="要一口一口喝"set1={'喝','酒要','一口'}set2={'喝','一口','要'}Jaccard相似度:0.52.Cosine 相似度◆定义通过 Sklearn库的TfidVectorizer将文本向量化,随后调用cosine_similarity计算相似度。◆实现fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.metrics.pairwiseimportcosine_similaritydefcosine_similarity_text(str1,str2):words1=''.join(chinese_tokenizer(str1))words2=''.join(chinese_tokenizer(str2))vectorizer=TfidfVectorizer()tfidf=vectorizer.fit_transform([words1,words2])returncosine_similarity(tfidf)[0][1]words1:酒要一口一口喝words2:要一口一口喝Cosine相似度:0.81818020736671973.Levenshtein距离◆定义莱文斯坦距离(LD)用于衡量两个字符串之间的相似度,其被定义为'将字符串str1变换为字符串str2所需的删除、插入、替换操作的次数◆实现importLevenshteindeflevenshtein_distance(str1,str2):words1=''.join(chinese_tokenizer(str1))words2=''.join(chinese_tokenizer(str2))returnLevenshtein.distance(words1,words2)words1:{'一口','要','喝','美酒'}words2:{'一口','要','喝'}Levenshtein距离:2三.模糊匹配◆定义Fuzzywuzzy是一款可以对字符串模糊匹配的工具,它使用上面提到的 LevenshteinDistance来计算出那些易用包中序列之间的差异。◆实现fromfuzzywuzzyimportprocesssubs=["你好","在干嘛","吃饭了吗","好的"]text="你好吗"best_match=process.extractOne(text,subs)print(f"Ori:{text}Bestmatch:{best_match[0]}(Score:{best_match[1]})")我们可以构建subs子集,并传入目标字符,寻找相似度最高的文本。 Ori:你好吗Bestmatch:你好(Score:90)四.总结这里介绍了几种相似度的计算方法,基于每一种相似度其实都可以定义自己的模糊匹配算法,只需寻找相似度最高的匹配字符即可。还有一种模糊匹配的数据结构是Trie树,之前介绍过,有兴趣的同学可以参考: Trie树简介与应用实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-12 19:51 , Processed in 0.480900 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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