核心方法:python结巴分词代码_python结巴分词SEO的应用详解
优采云 发布时间: 2022-12-13 14:55核心方法:python结巴分词代码_python结巴分词SEO的应用详解
口吃分词可应用于SEO中文章关键词、关键词分类、标题改写、文章伪原创等分析/提取。这是非常有用的。
具体口吃分词项目:
安装方法:
以mac系统为例(因为我用的是mac系统):
输入终端:
[Asm] 纯文本查看复制代码 pip3 install jieba -i --trusted-host
image.png (138.97 KB, 下载次数: 0)
2019-10-15 10:48 上传
这样就安装完成了,接下来就可以使用coderunner软件开始编写python3并使用了
常用方法举例
一、常用的分词方法
jieba.cut方法接受三个输入参数:需要分词的字符串;cut_all参数用于控制是否使用full模式;HMM参数用于控制是否使用HMM模型
jieba.cut_for_search 方法接受两个参数:待切分的字符串;是否使用HMM模型。这种方法适用于搜索引擎分词建立倒排索引。待切分的字符串可以是unicode或UTF-8字符串或GBK字符串。注意:不建议直接输入GBK字符串,可能会莫名其妙的被错误解码成UTF-8
jieba.Tokenizer(dictionary=DEFAULT_DICT) 创建一个自定义分词器,可以同时使用不同的词典。jieba.dt 是默认的分词器,所有全局分词器相关的函数都是这个分词器的映射。(一般使用默认的)
代码测试:
[Asm] 查看明文复制代码 #!/usr/bin/env python3# -*- coding: utf-8 -*-
*敏*感*词*解霸
ret1 = jieba.cut('我来到了北京的清华大学', cut_all=True)
ret2 = jieba.cut('我来到了北京的清华大学', cut_all=False)
ret3 = jieba.cut_for_search('我来到了北京的清华大学')
打印('/'。加入(ret1))
打印('/'。加入(ret2))
打印('/'。加入(ret3))
image.png (402.44 KB, 下载次数: 0)
2019-10-15 10:50 上传
启动应用程序:
海量分类关键词(用于特殊页面、tag标签等)
如果我们用以前的关键词挖矿工具挖出一堆关键词,不仅看起来杂乱无章,而且筛选和排序也需要很多时间。然后,我会教你通过结巴分词的方式对关键词进行分类。1秒可以完成数千个关键词,1分钟可以完成数万个关键词。最终可以得到如下两个结果。这有什么用?我们在做SEO的时候,是否可以把同类型的词按照分类做成一个特殊的页面或者标签的聚合页面呢?
第一种:json格式
第二种:Excel格式
提取文章关键词
如果我们需要知道关键词在这个行业在一个文章中的表现(文章中收录了多少关键词,TF_IDF值是多少,或者TextRank是什么是值)等,我们都需要对文章进行分词,但是由于每个行业都有自己的专业术语,如果只使用python默认的字典很难得到准确的数据,data结果出来了不是我们想要的。这时候一般的做法是添加自己的行业关键词词典,让口吃分词更加准确。
主要步骤:
找到行业相关关键词,保存成TXT文件
将所有单词设置为相同的自定义词性,例如 kws
将自定义词典导入程序
使用TF-IDF算法提取文章的关键词,在词性过滤参数中添加自定义词性,打印结果分析行业词情况。
这种方法在实践中很少使用。主要是分析关键词在竞品内容中的部署情况。实际对SEO的参考意义不是很大。
2. 关键词分类|标题重写|文章伪原创
使用余弦相似度算法计算两个字符串之间的相关性来分类关键词、重写标题、文章伪原创等功能,让你目瞪口呆。以下情况使用的母word文件均为txt文件,有两种格式:一种是纯关键词 txt,每行一个关键词;另一种是关键词加索引的txt,关键词和索引用tab键隔开,每行一对关键词。
余弦相似度算法实现
[Asm]查看明文复制代码# -*- coding: utf-8 -*-from jieba import posseg
导入数学
导入时间
def simicos(str1, str2):
# 将要计算的两个字符串分割,使用隐马尔可夫模型(或不使用)
# 由于分词算法不同,结果可能不同
# 也会造成相似度的误差,但一般影响不大
cut_str1 = [w for w, t in posseg. lcut(str1) 如果 t 中的 'n' 或 t 中的 'v']
cut_str2 = [w for w, t in posseg. lcut(str2) 如果 t 中的 'n' 或 t 中的 'v']
# 列出所有单词
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 = 数学。sqrt(sum(x ** 2 for x in freq_str1))
sqrt_str2 = 数学。sqrt(sum(x ** 2 for x in freq_str2))
返回 sum_all / (sqrt_str1 * sqrt_str2)
如果 __name__ == '__main__':
case1 = "搜索引擎优化"
case2 = "SEO培训网"
开始=时间。时间()
相似度 = simicos(case1, case2)
结束=时间。时间()
打印()
print("耗时:%.3fs" % (end - start))
print("相似度:%.3f" % 相似度)
image.png (531.48 KB, 下载次数: 0)
2019-10-15 10:53 上传
结果:
[Asm] 纯文本查看和复制代码耗时:0.751s 相似度:0.707
相似度为0.707,说明“SEO”和“SEO培训网”这两个词的相似度还是很高的。
2、实现关键词自动分类
实现思路:
把所有要分类的关键词放到一个TXT文件里,程序会把所有的关键词读入列表
以第一个词作为母词计算与其他词的相似度,相似度大于0.3则认为与该词相同。它们将被放置在一个新的列表中,并从原来的 关键词 列表中删除。
直到单词和列表中的所有单词都被计算出来,然后重复上面的操作,直到所有的单词都被分类。
算法缺陷:由于需要多次循环计算,时间复杂度比较高。不利于大量关键词的快速分类,如果关键词越异构,得到的分类就越多。
具体实现代码:
[Asm]查看明文复制代码# -*- coding: utf-8 -*-from jieba import posseg
导入数学
导入 json
导入时间
# 结果保存字典
结果 = {}
#缓存缓存
缓存 = {}
def simicos(str1, str2):
"""
字符串余弦相似度算法实现,增加缓存存储,减少分词带来的时间消耗
提高计算效率
:param str1: 要比较的字符串1
:param str2: 要比较的字符串 2
:return: 相似度值 0.0-1.0
"""
全局缓存
if cache.get(str1): # 或者使用缓存方法中的键
cut_str1 = 缓存[str1]
别的:
cut_str1 = [w for w, t in posseg. cut(str1) 如果 t 中的 'n' 或 t 中的 'v']
缓存 [str1] = cut_str1
如果 cache.get(str2):
cut_str2 = 缓存[str2]
别的:
cut_str2 = [w for w, t in posseg. cut(str2) 如果 t 中的 'n' 或 t 中的 'v']
缓存 [str2] = cut_str2
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 = 数学。sqrt(sum(x ** 2 for x in freq_str1))
sqrt_str2 = 数学。sqrt(sum(x ** 2 for x in freq_str2))
尝试:
返回 sum_all / (sqrt_str1 * sqrt_str2)
除了 ZeroDivisionError:
返回 0.0
def 计算(关键字列表):
"""
使用递归计算和分类
优点:代码简单,容易理解
缺点:python默认最大递归深度为1000,超过后会报错
:param keyword_list: 关键词 列表进行分类
:返回:无
"""
过滤词 = []
# 获取第一个词作为母词
muci = 关键字列表。弹出(0)
# 使用这个词作为分类器
结果[muci] = []
打印(len(关键字列表))
而关键字列表:
# 提取列表中的下一个单词
kw = 关键字列表。弹出(0)
simi = simicos(muci, kw)
如果 simi >= 0.3:
结果[muci].append(kw)
别的:
filter_word.append(kw)
# 如果列表中还有单词,则递归计算
如果过滤词:
计算(过滤词)
def 分类(关键字列表):
"""
使用while循环的方法进行计算和分类
:param keyword_list: 关键词 要排序的队列
:返回:无
"""
muci = keyword_list.pop(0) # 第一个词
结果[muci] = {“总计”:0,“列表”:[]}
last = keyword_list[-1] # 最后一个词
total_classify = 0
保持= len(关键字列表)
而关键字列表:
# 提取列表中的下一个单词
kw = 关键字列表。弹出(0)
simi = simicos(muci, kw)
如果 simi >= 0.3:
结果[muci][“列表”].append(kw)
结果[muci][“总计”] += 1
保持 -= 1
别的:
keyword_list.append(kw)
if kw == last and keyword_list: # 如果已经是最后一个
总分类 += 1
print("已分类 %d, 剩余 %d" % (total_classify, remain))
muci = 关键字列表。弹出(0)
保持 -= 1
结果[muci] = {“总计”:0,“列表”:[]}
如果关键字列表:
最后 = 关键字列表[-1]
别的:
休息
def result_filter(result_dict, bigthan=10):
"""
结果过滤过滤函数
因为使用这个方法会等待很多分类,有些分类没有关键词或者只有几个相关词
那么这些分类可能就不需要了,我们过滤掉就好了
:param result_dict: 待过滤的分类结果
:param bigthan: 相关词数大于或等于这个数的类别将被保存
:return: 过滤后的结果
"""
retfilter = {}
对于item,result_dict.items()中的值:
如果 values["total"] > 大于:
retfilter[item] = 值
返回 retfilter
如果 __name__ == "__main__":
t_start = 时间。时间()
打印(“开始......”)
keywords = [key.strip() for key in open("baidumobilekey.txt", encoding='utf-8')]
分类(关键词)
过滤 = result_filter(结果)
# 结果存储在json中
f = open("result3.json", "w", encoding='utf-8')
f.write(json.dumps(过滤后,ensure_ascii=False))
F。关()
print("完成,消耗 %.3f" % (time.time() - t_start))
结果:
结果保存为json文件
因为以上算法都是纯python写的,所以算法速度比较慢。经过测试,几万个关键词可能需要十多分钟,所以不适合对大量的关键词进行分类,同时,如果要求的相似度越高,则越多将获得分类。因此,这不是一个好的解决方案。
还有一种使用编辑距离的算法。这个算法是别人用C语言写的,不需要分词,所以速度比上面的算法快很多,但是分类效果不是很好。一些不相关的词也可能被归入同一类别。
使用 Levenshtein 模块进行分类
代码实现:需要安装Levenshtein模块,安装方式为pip install python-Levenshtein
[Asm] 以纯文本查看复制代码# -*- coding: utf-8 -*-import json
导入时间
导入编辑器
结果 = {}
def 分类(关键字列表):
"""
使用while循环的方法进行计算和分类
:param keyword_list: 关键词 要排序的队列
:返回:无
"""
muci = keyword_list.pop(0) # 第一个词
结果[muci] = {“总计”:0,“列表”:[]}
last = keyword_list[-1] # 最后一个词
total_classify = 0
保持= len(关键字列表)
而关键字列表:
# 提取列表中的下一个单词
kw = 关键字列表。弹出(0)
simi = Levenshtein.jaro_winkler(kw, muci)
如果 simi >= 0.8:
结果[muci][“列表”].append(kw)
结果[muci][“总计”] += 1
保持 -= 1
别的:
keyword_list.append(kw)
if kw == last and keyword_list: # 如果已经是最后一个
总分类 += 1
print("已分类 %d, 剩余 %d" % (total_classify, remain))
muci = 关键字列表。弹出(0)
保持 -= 1
结果[muci] = {“总计”:0,“列表”:[]}
如果关键字列表:
最后 = 关键字列表[-1]
别的:
休息
def result_filter(result_dict, bigthan=10):
"""
结果过滤过滤函数
因为使用这个方法会等待很多分类,有些分类没有关键词或者只有几个相关词
那么这些分类可能就不需要了,我们过滤掉就好了
:param result_dict: 待过滤的分类结果
:param bigthan: 相关词数大于或等于这个数的类别将被保存
:return: 过滤后的结果
"""
retfilter = {}
对于item,result_dict.items()中的值:
如果 values["total"] > 大于:
retfilter[item] = 值
返回 retfilter
如果 __name__ == "__main__":
t_start = 时间。时间()
打印(“开始......”)
keywords = [key.strip() for key in open("baidumobilekey.txt", encoding='utf-8')]
# 关键词 = [key. strip() for key in open("004.txt", encoding='utf-8')]
# 计算(关键字)
分类(关键词)
过滤 = result_filter(结果)
# 结果存储在json中
f = open("result4.json", "w", encoding='utf-8')
f.write(json.dumps(过滤后,ensure_ascii=False))
F。关()
print("完成,消耗 %.3f" % (time.time() - t_start))
结果也是一个json文件。
口吃 关键词 分类
上面的算法速度很快,但是效果不是很好,分类比较多。
这里还有一个比较妥协的方法,就是把所有的关键词通过结巴的方式切分,然后根据TF-IDF算法提取前N个名词或动词作为分类。所有 关键词 然后根据它们的收录方式进行分组。
这种方法可以快速对大量的关键词进行分类,但是有些关键词无法分类。至于选择哪种方法,由您决定。
具体代码:
[Asm] 查看纯文本复制代码# -*- coding: utf-8 -*-"""
Python卡顿关键词分类脚本,算法二
1.使用TF_IDF算法提取前N个词性词作为分类
2.遍历整个关键词列表,如果关键词收录类别名称,则将该词放入类别
3.如果没有,就把这个词放到其他类别中
"""
导入编*敏*感*词*
导入 csv
导入时间
从jieba导入分析
结果 = {}
定义初始化(组):
对于组中的 g:
结果[g] = {“总数”:0,“键”:[]}
结果[“其他”] = {“总计”:0,“键”:[]}
def 分类(kw_list,组):
索引 = 0
总计 = len(kw_list)
而索引 < 总数:
标志 = 0
对于组中的 g:
如果 g 在 kw_list[index][0] 中:
标志 = 1
结果[g][“总计”] += int(keyword_list[index][1])
结果[g]["keys"].append(kw_list[index])
如果没有标志:
结果[“其他”][“总计”] += int(keyword_list[index][1])
结果[“其他”][“键”].append(kw_list[index])
索引 += 1
def write_to_file(组):
savefile = open("result.csv", "w", encoding='utf-8')
csvwriter = csv.writer(保存文件)
字段 = []
group.append("其他")
对于组中的 g:
字段.append(g)
fields.append(结果[g][“总计”])
csvwriter.writerow(字段)
maxline = max(len(item["keys"]) for item in result.values())
cols = len(字段)
对于范围内的行(最大行):
rowfield = ["" for _ in range(cols)]
gix = 0
kwitem = []
对于范围内的列(列):
如果 result.get(group[gix])["keys"]:
如果 col % 2 == 0:
kwitem = result.get(group[gix])["键"].pop(0)
rowfield[col] = kwitem[0]
如果 col % 2 == 1:
gix += 1
rowfield[col] = kwitem[1]
csvwriter.writerow(rowfield)
保存存档。关()
如果 __name__ == "__main__":
打印(“开始......”)
t_start = 时间。时间()
keyword_list = [k.strip().split('\t') for k in open("003.txt", encoding='utf-8')]
组=分析。extract_tags(" ". join(item[0] for item in keyword_list),
topK=20, allowPOS=('ns', 'n', 'vn', 'v', 'nr'))
groups = [g for g in groups]
初始化(组)
分类(关键字列表,组)
写入文件(组)
print("完成,消耗 %.3f" % (time.time() - t_start))
结果:每一列都是一个类别,例如第一列是类别“PubMed”中所有单词的分类。
结果以Excel格式保存
技术文章:标签:文章网站源码
程序源代码
Z-BlogPHP 工作区主题文章信息博客网站源代码
Z-BlogPHP 职场主题文章信息博客网站源代码 拥有2000多个文章数据安装:常规操作、上传、安装点击数据库插件、恢复数据更新网站缓存、完成后台:/zb_system/登录.php账号恢复数据后 密码管理员admin888下载地址......
03-07 立即查看
程序源代码
仿小学作文网网站源代码帝国cms7.5+还原版作文网站源码+数据+带移动端+详细安装教程
源代码
网站这个构图很适合项目站长,挂了也就不在乎举起一样的权重,数据已经采集,修复了已经发现的bug,内核中使用的帝国cms7.5的源代码不是互联网上那一套数据少。文章网站源代码,这是最喜欢的下载研究栏的完整版本。安装教程 商业源代码 1.首先将程序上传到您的主机,访问您的域名 /e/install 进行正常安装,这里只需要填写三项:数据库....
10-24 立即查看
插件模板
帝国cms绿色新鲜情感文章美国阅读网站源代码恢复版与手机
帝国cms内核做新闻文章 网站,修复了很多小bug,模板是一个新鲜的绿色美网,具有在线提交功能,带移动端,非常适合文章分享、诗歌、历史文章网站!操作环境:PHP5.2/5.3/5.4+Mysql 适用范围:新闻文章、美文章、新闻资讯、自媒体文章分享网站下载地址....
06-24 立即查看
程序源代码
92GAME帝国cms仿牛BB文章网络文章 阅读网站源代码
92GAME帝国cms仿牛BB文章网文章读取网站源码,百度权重8,收录900W+,排名很好,支持手机版,带采集。采用帝国7.2GBK版本的二次开发,程序具有出色的稳定性、安全性、高性能等优势!网站内容覆盖面广,界面整洁清爽,适合各种广告投放。安装说明:1、/e/install/index.php安装网站2、登录后台恢复数据库,恢复后再次登录网站....
07-04 立即查看
程序源代码
织梦dedecms模仿中文作曲网文章类网站的源代码
织梦dedecms模仿中国作文网网站 文章类的源代码,采集可能无效,非常漂亮的模板程序。模板div+css设计,符合W3C标准,经过SEO优化,收录爆,排名好,模板新鲜,美观。此站点修复了列表页未对齐的问题,现在源代码完整且无错误。文章类型网站源代码更适合一些新手构建。文章类型网站源代码占用的空间很小,加载速度快。Dede程序安装简单易上手安装教程: 1、转为空....
06-29 立即查看