python余弦相似度_python实现字符串余弦相似度算法
字符串余弦相似性算法是通过利用我们初中就学过的三角函数中的余弦定理来计算两个字符串的相似度,它是定义在向量空间模型(Vector Space Model)中的。
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫”余弦相似性”。具体算法请看:https://baike.baidu.com/item/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6
我这里的算法并不是完全按照原来的算法实现的,因为经过测试发现如果使用原来的算法来实现的话,对于有SEO背景的人来讲,计算出来的相关性就不那么满意,所以我把算法改进了一下,只计算两个字符串中的名词和动词,如果要计算所有的词,那么也可以通过修改下面的代码实现。
说明:脚本是基于python2.7.x开发的,当然在python3.x下也是可以运行的需要用到jieba分词库,安装方法: pip install jieba如果安装比较慢,那么可以使用pypi豆瓣源:pip install -i https://pypi.douban.com/simple jieba
实现代码:
# -*- coding: utf-8 -*-
from jieba import posseg
import math
import time
# 对要进行比较的str1和str2进行计算,并返回相似度
def simicos(str1, str2):
# 对两个要计算的字符串进行分词, 使用隐马尔科夫模型(也可不用)
# 由于不同的分词算法, 所以分出来的结果可能不一样
# 也会导致相似度会有所误差, 但是一般影响不大
# 如果想把所有的词性都计算,那么把if及其后面的全部删除掉即可
cut_str1 = [w for w, t in posseg.lcut(str1) if 'n' in t or 'v' in t]
cut_str2 = [w for w, t in posseg.lcut(str2) if 'n' in t or 'v' in t]
# 列出所有词
all_words = set(cut_str1 + cut_str2)
# 计算词频
freq_str1 = [cut_str1.count(x) for x in all_words]
freq_str2 = [cut_str2.count(x) for x in all_words]
# 计算相似度
sum_all = sum(map(lambda z, y: z * y, freq_str1, freq_str2))
sqrt_str1 = math.sqrt(sum(x ** 2 for x in freq_str1))
sqrt_str2 = math.sqrt(sum(x ** 2 for x in freq_str2))
return sum_all / (sqrt_str1 * sqrt_str2)
if __name__ == '__main__':
case1 = "一车主为防碰瓷,将玛莎拉蒂布满玻璃渣,网友惊呼:绝了!"
case2 = "车主为保护玛莎拉蒂将其布满玻璃渣,防“碰瓷”也是绝了!"
start = time.time()
similarity = simicos(case1, case2)
end = time.time()
print "耗时: %.3fs" % (end - start)
print "相似度: %.3f" % similarity
运行结果示例:
Building prefix dict from the default dictionary ...
Dumping model to file cache /var/folders/h9/5172d1757k90s7p3ngzzgllm0000gn/T/jieba.cache
Loading model cost 1.757 seconds.
Prefix dict has been built succesfully.
耗时: 1.763s
相似度: 0.632
实际运用场景(主要是SEO中):
相关关键词挖掘
相关词替换、聚合
文章的相关推荐
判断标题/内容重复度
……
更多精彩尽在微信公众号:布鲁的python
python余弦相似度_python实现字符串余弦相似度算法相关推荐
- es6与java的相似度_计算字符串的相似度-两种解法
一直不理解,为什么要计算两个字符串的相似度呢.什么叫做两个字符串的相似度.经常看别人的博客,碰到比较牛的人,然后就翻了翻,终于找到了比较全面的答案和为什么要计算字符串相似度的解释.因为搜索引擎要把通过 ...
- python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法
str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() ...
- python 决策树 字符型_Python判断字符串是否xx开始或结尾的示例
判断是否xx开始 使用startswith 示例代码: String = "12345 上山打老虎" if str(String).startswith('1'): #判断Stri ...
- python里的拼接_Python拼接字符串的7种方法总结
前言 忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串.相信不少同学会有同感. 在Python中,我们经常会遇到字符串的拼接问题,几乎任何一种编程语言,都把字符串列为最基 ...
- python将矩阵顺时针旋转90度_python 二维数组90度旋转的方法
如下所示: #!/usr/bin/env python #-*- coding: utf-8 -*- """ [0, 1, 2, 3] [0, 1, 2, 3] [0, ...
- python删除指定字符_python删除字符串中指定字符的方法
最近开始学机器学习,学习分析垃圾邮件,其中有一部分是要求去除一段字符中的标点符号,查了一下,网上的大多很复杂例如这样 import re temp = "司法局让我和户 1 5. 8 0. ...
- python人名最多统计_Python统计字符串中出现次数最多的人名
人名最多数统计 题目摘自https://python123.io 描述 编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名. ...
- python千位分隔符_Python格式字符串带空格的千位分隔符
@ user136036的答案是相当不错的,但是不幸的是,它没有考虑到Python错误的真实性. 完整答案可能如下: 变体A 如果您的平台的语言环境运行正常,则只需使用语言环境即可: import l ...
- python中rstrip 函数_Python中字符串之rstrip()方法有哪些功能?
摘要: 下文讲述Python中rstrip()的方法的功能简介说明,如下所示: rstrip()方法功能: 用于删除字符串尾部指定的字符, 默认字符为所有空字符 如:空格.换行(\n).制表符(\t) ...
最新文章
- android 三级界面返回直接到一级界面
- 如何安装fedora13的显卡驱动
- Windows Server 2008 R2 搭建DNS服务器(转)
- 谷歌地图将很快显示电动汽车充电站
- 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
- 科大讯飞回应同传造假:人机耦合才是未来发展之道
- uefi启动如何进入
- JavaEE Tutorials (9) - 运行持久化示例
- 在三层交换上配置ciscoVTP实验
- MyBatis最新官方下载地址
- “运行时错误‘339‘部件‘flash8.ocx‘或其附件之一不能正确注册:一个文件丢失或无效“的一种解决办法!
- 【学习OpenCV4】聊聊图像格式
- java bitset_Java1.8-BitSet源码分析
- 数字排列问题(全排例)
- 搜索时输入关键词进行匹配
- 寻找鲁菜——美食江山寻味记之三·胶东人家
- 家用小型中央空调发展的现状与趋势
- python截屏_Python: 截屏
- 看不见的竞争 带宽优化
- Android性能优化方法论