使用Python jieba库进行SEO优化:基础操作与实战案例解析——来自微信公众号‘布鲁的python’分享
最编程
2024-02-22 07:08:04
...
符串余弦相似性算法是通过利用我们初中就学过的三角函数中的余弦定理来计算两个字符串的相似度,它是定义在向量空间模型(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背景的人来讲,计算出来的相关性就不那么满意,所以我把算法改进了一下,只计算两个字符串中的名词和动词,如果要计算所有的词,那么也可以通过修改下面的代码实现。
源码:
from jieba import posseg
import math
import time
#关键词/文本相关度计算 来源:微信公众号 布鲁的python
#对要进行比较的str1和str2进行计算,并返回相似度
def compare(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]
print(cut_str1)
print(cut_str2)
#列出所有词
all_words=set(cut_str1+cut_str2)
print(all_words)
"""
#列出所有词,方法二
cut_str1.extend(cut_str2)
print(cut_str1)
all_words = set(cut_str1)
print(all_words)
"""
#计算词频
frequency_str1=[cut_str1.count(x) for x in all_words]
frequency_str2 = [cut_str2.count(x) for x in all_words]
print(frequency_str1)
print(frequency_str2)
#计算相似度
"""
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
"""
freq=map(lambda z,y:z*y,frequency_str1,frequency_str2)
sum_all = sum(freq)
print(sum_all)
"""
sqrt() 方法返回数字x的平方根。
注意:sqrt()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。
"""
sqrt_str1=math.sqrt(sum(x**2 for x in frequency_str1))
print(sqrt_str1)
sqrt_str2 = math.sqrt(sum(x ** 2 for x in frequency_str2))
print(sqrt_str2)
frequency=sum_all/(sqrt_str1*sqrt_str2)
print(frequency)
return frequency
if __name__ == '__main__':
str1="seo"
str2="seo培训网"
start=time.time()
similarity =compare(str1,str2)
end = time.time()
print()
print("耗时: %.3fs" % (end - start))
print("相似度: %.3f" % similarity)
关键词运行结果:
Building prefix dict from the default dictionary ...
Loading model from cache C:UsersADMINI~1AppDataLocalTempjieba.cache
['seo']
['seo', '培训网']
{'培训网', 'seo'}
[0, 1]
[1, 1]
1
1.0
1.4142135623730951
0.7071067811865475
耗时: 1.144s
相似度: 0.707
Loading model cost 1.144 seconds.
Prefix dict has been built succesfully.
文本内容运行结果:
str1 = "一车主为防碰瓷,将玛莎拉蒂布满玻璃渣,网友惊呼:绝了!"
str2 = "车主为保护玛莎拉蒂将其布满玻璃渣,防“碰瓷”也是绝了!"
Building prefix dict from the default dictionary ...
Loading model from cache C:UsersADMINI~1AppDataLocalTempjieba.cache
['车主', '防碰', '瓷', '玛莎拉蒂', '布满', '玻璃', '渣', '网友', '惊呼']
['车主', '保护', '玛莎拉蒂', '布满', '玻璃', '渣', '防', '碰', '瓷', '是绝']
{'网友', '惊呼', '瓷', '是绝', '渣', '防碰', '玻璃', '防', '车主', '布满', '玛莎拉蒂', '碰', '保护'}
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]
6
3.0
3.1622776601683795
0.6324555320336759
耗时: 1.172s
相似度: 0.632
Loading model cost 1.172 seconds.
Prefix dict has been built succesfully.
实际运用场景(主要是SEO中):
相关关键词挖掘
相关词替换、聚合
文章的相关推荐
判断标题/内容重复度
……