结巴分词seo应用,Python jieba库基本用法及案例参考

jieba库

jieba分词是目前使用比较多的中文分词工具,我们在做文本处理以及关键词处理的时候经常需要使用分词技术提取我们需要的核心词信息。


SEO应用

结巴分词在SEO中可以应用于分析/提取文章关键词、关键词归类、标题重写、文章伪原创等等方面,用处非常多。


安装方法

cmd敲入命令:pip install jieba


分词功能

jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型。


jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。


待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。

注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。


jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。


jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。


代码示例

#官方示例
# encoding=utf-8
import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))


输出:

pic_001.jpg

我们简单整理下


其实就是三种模式对应三个函数


第一种:精确模式 

把文本精确的切分开,不存在冗余单词   (就是切分开之后一个不剩的精确组合) 

默认是精确模式,即不设置 cut_all 默认是精确模式  默认 cut_all=False


第二种:全模式

把文本中所有可能的词语都扫描出来,有冗余

即: 可能有一个文本,可以从不同的角度来切分,变成不同的词语。在全模式下把不同的词语都挖掘出来


第三种:搜索引擎模式

在精确模式基础上,对长词语再次切分

这里需要注意的是,jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环 来获得分词后得到的每一个词语(unicode),或者用 jieba.lcut 以及 jieba.lcut_for_search 直接返 回 list。

jieba.cut_for_search返回的是迭代器对象,jieba.lcut_for_search返回的是一个列表。


结合实例来看,理解更加清晰:

import jieba

#分词常用方法
str1=jieba.cut('我来到北京清华大学',cut_all=False)  #精确模式,没有多余(不设置 cut_all 默认是精确模式)
str2=jieba.cut('我来到北京大学',cut_all=True)   #全模式,有多余,长词组
str3=jieba.cut_for_search('我来到北京清华大学') #搜索引擎模式,有多余,长词组
str4=jieba.lcut_for_search('我来到北京清华大学')  #返回list
print('/'.join(str1))
print('/'.join(str2))
print('/'.join(str3))
print(str4)


我/来到/北京/清华大学              (第一种:精确模式 ) 没有多余

我/来到/北京/北京大学/大学     (第二种:全模式 ) 有多余,长词组

我/来到/北京/清华/华大/大学/清华大学   (第三种:搜索引擎模式)  有多余,长词组


['我', '来到', '北京', '清华', '华大', '大学', '清华大学']    #返回list


pic_002.jpg

jieba项目github地址:https://github.com/fxsjy/jieba/



SEO应用

python实现字符串余弦相似度算法

来源于 微信公众号:布鲁的python


符串余弦相似性算法是通过利用我们初中就学过的三角函数中的余弦定理来计算两个字符串的相似度,它是定义在向量空间模型(Vector Space Model)中的。

pic_003.jpg

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近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:\Users\ADMINI~1\AppData\Local\Temp\jieba.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.


pic_004.jpg


文本内容运行结果:

str1 = "一车主为防碰瓷,将玛莎拉蒂布满玻璃渣,网友惊呼:绝了!"
str2 = "车主为保护玛莎拉蒂将其布满玻璃渣,防“碰瓷”也是绝了!"
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.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.


pic_005.jpg

实际运用场景(主要是SEO中):

相关关键词挖掘

相关词替换、聚合

文章的相关推荐

判断标题/内容重复度

……