首页 SEO攻略 正文

SEO 人员如何在公司中发挥主观能动性并完成工作

SEO攻略 2024-09-19 47

前言

说实话,如果不是CEO主动高薪招聘SEO经理,很多SEO人员都会成为公司里的“弱势群体”。

绝大多数普通SEO人员在公司内部以及跨部门沟通中并没有太多的发言权,很多细节任务也得不到相关配合。

在这样的环境下,seoer要想出色的完成工作,就必须充分发挥自己的主观能动性,想尽一切办法去完成那些表面上不值一提,暗地里却不可避免的事情。

问题

对于SEO、SEM来说,全网大批量挖掘长尾词是必须的,但大量的长尾词势必会带来一些数据清洗的工作,大多数情况下清洗工作可以用Excel来完成,但也有很多情况Excel很难处理,比如:

seo分词技术_分词技术概览_分词技术的应用

这是从第三方关键词工具下载的词根“引流”的长尾词数据,但是遇到了一个尴尬的问题,词根“引流”有同义词,但是场景不同,所以会挖掘出很多不相关的长尾词:

分词技术的应用_seo分词技术_分词技术概览

其实这种情况很常见,一个单词经常难免会与其他场景混淆。例如:

水果中的“苹果”,手机中的“苹果”,电影中的“苹果”,都是形态相同但含义完全不同的词,单纯用词根挖词,自然会挖出很多非目标的长尾词。

类似的情况还有很多,那么问题来了:剔除非目标长尾词是必须的,这样的SEO工作自然要做好细节。老板不会帮我们做,也不会派人给我们做。如果这是一个百万级别的长尾词数据,全靠Excel筛选剔除,那这个项目可能早就失败了。

面对如此杂乱无章的长尾词数据,如何用高效的方法来筛选和选取呢?

今天的文章是一篇完全技术性的文章,但是对于不懂该技术的人,我强烈建议你仔细阅读它,原因有二:

技术是另外一种思维,对于不熟悉技术的朋友,可以看看技术人员遇到问题时是怎么处理的。

在“网络营销”工作中,有很多任务超出了我们的能力范围,但充分发挥自己的主观能动性,达到超出本岗位所要求的能力水平,往往会带来额外的收益。

开始

前段时间接了一个数据收集项目(熟人之间合法生意而已),随着收集的数据量越来越大,“敏感词过滤”的工作不可避免,政治、色情、恐怖、暴力、广告等相关词汇都要识别出来。

目前市面上能够收集到的敏感词库,随便整合几个就能达到几万个甚至更多,因为随着时间的推移,会产生各种各样的新词。

使用程序识别文章是否包含目标敏感词,以Python为例:

refusalWord = '敏感词'
targetText = '内容正文'
if refusalWord in target_text:print(True)

让程序在目标文本中搜索这个敏感词,如果找到,就说明有敏感词,只有一个敏感词的情况下是这样的,如果有多个敏感词,也简单,加个循环:

refusalWord = ['敏感词1','敏感词2','敏感词3']
targetText = '内容正文'
for word in refusalWord:
    if word in target_text:print(True)

程序在目标文本中逐个查找敏感词,如果有几百个敏感词,那么重复逐个处理效率很低,也显得不够优雅,正则表达式可以简洁的解决这个问题:

import re
refusalWord = ['敏感词1','敏感词2','敏感词3']
targetText = '内容正文'
if re.search('|'.join(refusalWord),targetText):print(True)

所有敏感词以“|”连接起来,形成正则表达式:“敏感词1|敏感词2|敏感词3”,用该表达式匹配目标文本,找出所有出现的敏感词。

但是,如果敏感词有几万个,甚至更多怎么办呢?熟悉正则表达式的朋友都知道,这样写出来的表达式极其不合理,可能会出现各种各样的问题。

而且当敏感词有几万个甚至更多的时候,效率就线性下降了,再加上后期的替换等其他工作,时间成本就更高了。

而且我们前面的演示只是展示了只有一个目标文本的情况,如果敏感词数量为N,目标文本为M呢?在简单的双循环情况下,时间复杂度至少是N*M。

这时候就需要用到我们今天的主角:“AC自动机”算法。

PS:不懂技术的朋友也不用担心代码,只要明白这是一个方案优化的问题就行,我们在处理敏感词从1到N再到N++的过程中,也在不断优化技术方案,提升效率。

AC自动机算法是一种多模式匹配算法,算法的复杂程度和深度不是我们这些非专业人士能够理解的,但是我们还是可以理解算法的含义和区别的。

上面的例子,就算不懂技术的人也能看明白,随着敏感词库的不断增大,程序判断一篇文章是否包含敏感词库中的某个词或者某些词的时间成本也会逐渐增大,因为无意义的判断越来越多,这就是单一模式。

AC自动机通过采用多模式匹配算法解决了这个问题,也就是说,随着敏感词汇的增加,时间成本保持不变(至少在一定范围内)。

那么这与关键字清理有什么关系?让我们一步一步来。

步骤1:选择代表性词根

分词技术的应用_seo分词技术_分词技术概览

这是针对“引流”的长尾词库,包含了几十万个词,里面的长尾词分为两类:网络推广相关的长尾词和医疗技术相关的长尾词,我们的目标是把这两类长尾词分离出来。

在Excel中,面对这样的数据,我们需要分出两边,即筛选出目标,或者筛选出非目标然后剔除。我们先来看一下一般的操作方法是什么:

分词技术概览_seo分词技术_分词技术的应用

一行一行看,把非目标数据标记出来,然后过滤掉,全部删除。不过对象有几十万个,甚至更多,效率可想而知。只有硬汉才能一行一行看完。

分词技术概览_分词技术的应用_seo分词技术

选取一些高频的非目标单词或短语,然后过滤掉并删除,反复进行此操作。这种方法看起来很快,而且可以一次性删除大量的单词。

但是如果你充分理解了关键词的长尾效应,就会意识到这种方法在后期会越来越痛苦,因为后期很多选中的词是无法多次删除的,反复的筛选和删除会让人崩溃。

除此之外,在Excel上似乎没有更好的方法来处理这样的问题。现在我们将使用另一种方法来解决这个问题。

按照惯例,先将所有长尾词分词,并统计词频:

分词技术的应用_分词技术概览_seo分词技术

接下来我们需要根据“常识”手动选取有代表性的“分类种子词根”,从上到下选取“显然只能”和网络推广相关的词放在一个文档中,选取“显然只能”和医疗技术相关的词放在另一个文档中。

所谓“显然唯一”,比如“script”,也就是脚本工具,这样的词基本上不可能跟医疗科技的长尾词产生任何联系,“wound”也基本上不可能跟互联网推广产生任何联系。

所谓“常识”,比如:互联网推广中经常会有一些相关的平台名称,比如知乎,微信,淘宝等等,你甚至不需要考虑这些,直接写出来就可以了。

所以在选择的时候一定要确定词语的归属是否明确,如果含糊不清的话最好不要用!

分词技术的应用_分词技术概览_seo分词技术

前者算作“正向”,后者算作“负向”,其中的“正向”就是我们目标长尾词的代表词根,那么我们该选几个呢?再次强调,关键词要符合二八原则。

我们看到,top 词根的出现频率非常高,一个词根可以衍生出很多长尾词,所以在几十万个长尾词中,我只选了大概 180 个。

即使长尾词的数量增加10倍,也不会有太多有代表性的词根可供选择。

第二步:扩展代表性词根

选取这些种子词的目的很简单:将“正向”的种子词放入词库,可以筛选出肯定属于目标类别的长尾词。上文我们选取了“微信”作为种子词,我们认为它只能出现在与网络推广相关的长尾词中,因此将“微信”放入词库,可以筛选出所有包含“微信”的长尾词,这些长尾词均与网络推广相关:

分词技术概览_seo分词技术_分词技术的应用

长尾词一般具有以下特点:

微信流量脚本开发

像这样的长尾词,我们通过“微信”进行提取,除了词根“引流”之外,因为这个长尾词和互联网推广有关,其他词根也很有可能和互联网推广有关。比如这里的“脚本”和“开发”肯定和医疗技术无关。相反:

脓肿切开引流手术

通过种子词“surgery”我们可以得知,分割出来的“abscess”和“incision”不太可能和网络推广有任何关联,因此可以将其作为新的种子词加入到“anti”类别中。

到这里思路就清晰了,我们先选取一些有代表性的种子词,利用这些种子词筛选出所有相关的长尾词,然后对这些筛选出来的长尾词进行分词,利用关键词之间的相关性,得到更多上一步没有选取到的目标类别的种子词。

这些种子词都是我们后续分类的基石。

使用这个思路其实就解决了关键词长尾效应的问题,我们无法手动一个个的去选取种子词,但是可以通过联想的方式,自动收集更多没有被手动选取的种子词。

这些种子词可以帮助我们覆盖更多的长尾词。

PS:这只是一个演示思路,筛选必须通过程序批量进行,不能用Excel。

这一步我们需要计算每个提取出来的种子词的频率,并进行相应的保留,以便后面使用。

比如我们用“正向”这个种子词过滤掉所有的长尾词,经过分词之后得到这些长尾词的所有词根,求这个长尾词(过滤掉的词根)中各个词根出现的频率总和是多少。

步骤3:筛选代表性词根

分词技术的应用_分词技术概览_seo分词技术

此时我们其实可以开始区分了,但是还有一些细节需要优化:

1:经过第二步的自动扩展,在“正”状态和“负”状态下都会出现一个种子词,比如“视频”。

这个词出现在互联网推广相关的长尾关键词中并不奇怪,事实上,它也出现在医疗科技“引流”的长尾关键词中:

分词技术的应用_分词技术概览_seo分词技术

对于这种情况,我们其实可以考虑一个问题:这是偶然,还是常态?比如“视频”这个词,其实两边都出现的频率都比较高,干脆就不用,也就是说它根本就没有代表性。

如果是偶然的,比如“艾滋病”,那也是很神奇的。我在词库里看到一个长尾词:

如何销售艾滋病毒检测试剂以促进流量

除此以外,其他的都是医学的,所以这个只是偶然。对比一下我们第二步保留下来的词频,哪一边出现的压倒性大,我们就保留那一边的种子词,另一边直接去掉。

如果数据差距不大,那么双方直接去掉无偏的种子词就可以了。

以我的经验来看,大多数这类情况下,它们之间的词频对比是有很大差别的。

2:无偏的单词、数字、字符都是无偏的,不应该作为种子词。

其次,诸如should、how、probably、can、of、is、等副词、助词、连词、语气词、疑问词等不具有倾向性,所以在分词时直接按照jieba的词性去除:

分词技术的应用_分词技术概览_seo分词技术

经过这一步过滤,词频数据就可以舍弃了,当然“drainage”每一个字肯定都有它的主要词根,这个词根一定要去掉!

步骤4:快速分类

现在我们把上面计算出来的种子词当做关键词,其实这跟我们上面给出的采集例子是一样的,这些种子词相当于敏感词,而每一个待分类的长尾词就相当于目标文本内容。

使用 Python 的传统方法与此类似:

# 正
seed_word_r = []
# 反
seed_word_e = []
# 词库
keyword = []
for word in keyword:
    for r in seed_word_r:
        if r in word:
            pass
    for e in seed_word_e:
        if e in word:
            pass

把每一个长尾词都拿出来和每一个种子词进行对比,看是否被收录,然后确定它所属的类别。

如果有N个长尾词,外层循环就会执行N次,如果有M个词,那么N个词中每个词也会包含M次,执行成本可想而知。

另外,将几万个甚至更多的词根和一个只有10个左右字的长尾词逐一比较,势必会导致太多无意义的比较。

这时,可以使用AC自动机算法:

import ahocorasick
# 正
seed_word_r = ['种子词1','种子词2','种子词3','种子词4']
tree = ahocorasick.AhoCorasick(*seed_word_r)
print(tree.search('长尾词'))

如上述代码所示,我们将种子词(敏感词)传入AC自动机,建立模型,然后模型可以计算出当前的长尾词(目标文本内容)是否包含模型中的某些词,并将出现的词全部展示出来。

这种计算并不像上面的方法,需要逐一比较内外循环。

因此,通过做上述的长尾词分类工作,可以:

import ahocorasick
# 正
seed_word_r = ['种子词1','种子词2','种子词3','种子词4']
# 反
seed_word_e = ['种子词1','种子词2','种子词3','种子词4']
# 词库
keyword = []
# 构建
tree_r = ahocorasick.AhoCorasick(*seed_word_r)
tree_e = ahocorasick.AhoCorasick(*seed_word_e)
# 遍历
for word in keyword:
    r = tree_r.search(word)
    e = tree_e.search(word)
    pass

每次把长尾词传递给两边,瞬间就能得到两边长尾词的收录情况,传递的部分是要做有针对性的判断。

可预见的结果如下:

1:如果长尾词只有“正面”或者只有“负面”,那么很简单,归到对应的类别里就可以了。

2:长尾词既不属于“正向”也不属于“负向”,这种情况下应该将其归为一类并保存。

3:某个长尾词既属于“正向”,又属于“负向”,需要进一步判断,我们先把这个类型归类,然后保存起来。

r和e都是集合数据结构,根据长度结合交集与并集来确定归属。

分词技术的应用_分词技术概览_seo分词技术

w1是没有找到属于的,w2是同时属于两者的,w3是“正”分类,就是我们想要的和互联网推广相关的长尾词,w4是“负”分类,就是和医疗技术相关的长尾词,这是我们不想要的。

3、4的内容应该没有问题,如果偶尔出现分类不准确的词,就找出不准确的词,追踪它的种子词,这肯定是某个种子词选错了。

删除后重新运行代码就可以了,所以一开始手动选择的时候一定要选择归属明确的,避免归属不明确的。

但是我们看到,同时属于它的一部分w2还有1.9M,我们打开看一下:

分词技术概览_seo分词技术_分词技术的应用

无法分类的记录其实有6万多条(截图没完全展示出来,懒得再截图了),虽然我们已经按比例分类了80%,但是6万多条还是很多的。

由于同时判断它们都是属于同一个地方的,也就是两边都能匹配,所以我们随便取一个单词,再把原来的程序跑一遍,看看它两边都匹配什么。

阑尾炎引流管日引流量

这是一个和医疗科技相关的长尾关键词,程序运行之后,这个长尾关键词的结果是:

积极:流动

防:阑尾、阑尾炎、引流、引流管、引流量

这就是长尾词在种子词中命中的词,所以很明显程序没有错,因为流量这个词出现在与互联网推广相关的长尾词中是正常的。

但这个词是医学相关的,我们还是希望可以判定为“反”,怎么做呢?

我们还是要用概率的思维,结合我们上面说的相关性,一个长尾词属于某个领域,那么分词之后的词也有很大概率属于这个领域。

所以从上面我们可以看出,命中这个长尾词“反面”的种子词数量远远超过命中“正面”的数量,也就是说假的不可能是真的,真的也不可能假的。所以根据这个绝对差值,我们可以直接判断为命中数量较大的一方。

经过优化程序判断后,结果是:

seo分词技术_分词技术概览_分词技术的应用

可以看到,w2从1.9M减小到了300+kb,而w3和w4由于分类了更多的词,所以体积明显增大。

分词技术的应用_seo分词技术_分词技术概览

可以看到w2里面有1万多条记录,对于专门跟Excel打交道的SEO或者SEM人员来说,这个数据量通过反复操作很快就能整理出来。

但其实如果你愿意的话,这个还是可以优化的,w2还是那么多,很大一部分原因是分词精准的问题,有兴趣的可以自己研究一下优化方案。

关于没有提到的w1:

分词技术概览_seo分词技术_分词技术的应用

我故意缩短了一点,给大家看为什么这些词不属于任何一方,看完你就明白了,其实这类词已经超出了长尾词的范围,去掉“引流”和不偏颇的词之后,基本已经没有可以做判断的词了。

这种字结构很简单,如果确实需要,可以通过Excel中排序的方式快速选取。

最后我们把w3和w4的数据放上去:

分词技术概览_seo分词技术_分词技术的应用

总共有15W+个长尾词,这就是我们需要的数据!

分词技术的应用_分词技术概览_seo分词技术

总共有30W+个长尾词,这是我们不需要的数据!

交流自动机

# pip install ahocorasick-python
import ahocorasick
t1 = time.time()
ac = ahocorasick.AhoCorasick(*seed_word)
t2 = time.time()
rw = []
print(t2-t1)
for word in keyword:
    sw = ac.search(word)
    for i in sw:
        word = word.replace(i,'***')
    rw.append(word)
t3 = time.time()
print(t3-t2)
rw = []
t1 = time.time()
for word in keyword:
    for i in seed_word:
        if i in word:
            word = word.replace(i,'***')
    rw.append(word)
t2 = time.time()
print(t2-t1)

我使用了第三方的 AC 自动机模块,算法还是挺高效的,总共 5W 个词汇,50W 个目标文本,传统方法总共耗时 1450 秒,使用 AC 自动机,构建耗时 20 秒,但这是一次性的过程,判断和替换耗时 100 秒。

其实,无论是种子词联想的思想,还是AC自动机算法,打个不太恰当的比方,就像是把一个线性问题转化成了指数问题(这种表述可能有问题),时间成本并不会随着数据量的增加而机械地增加。

对于敏感词过滤等问题,还有其他解决方案,例如 DFA。没有标准的解决方案,只需使用适合您的解决方案即可。

结论

如何大量剔除不相似的长尾词,我在之前的公众号付费文章中也提供过解决方案,但是那需要网络数据来支撑判断,而这种方式完全是本地化的,相对来说更经济。

这项工作总时间通常不超过半小时,得益于“用种子词带出更多种子词”的思维、“按概率确定归属”的逻辑、“AC自动机算法”的高效性,处理几十万和几百万的时间差别并不大,程序实际计算的时间也不超过10分钟。

尽管我们绞尽脑汁、用尽各种策略才完成这样的任务,但第一次完成的时候我们可能还是会感到有些自豪。

但实际上,从价值上来说,这是一个在对外沟通时根本不值得一提的工作项,因为它并不是一个具体的结果指标。

从局外人的角度来看,这是你的立场的基础,事实也确实如此。

另外有的朋友可能会觉得,使用AC自动机算法与普通方法相比,几十万字的时间上差别不大,与程序计算几十分钟的时间差别不大。

是的,整个过程没有固定的步骤和方案,只是想传达一种做事的方法,遇到很多困难的时候,可以发散思维,换个角度思考,其实有很多方法可以解决。

同时对于技术好的朋友来说,使用AC自动机相对于传统方法来说只不过是多写几行不同的代码而已,但是带来的好处却不止于此,多学习一门技术,就能解决很多类似的问题。

对于上面提到的采集项目,我可以使用AC自动化来应对持续增加的敏感词汇和文章。下一阶段,我会针对这个采集项目做另一项任务:筛选目标领域的内容。

目标采集源中的内容不一定都是我们的目标领域内容,可能存在大量不相关的内容,我们当然会选择丢弃不相关的内容,不存入数据库。

所以我们需要设计一个简单的判断逻辑,类似推荐算法给文章打标签的方式,判断当前内容是否属于目标领域,如果不属于,就不采纳,减少人工审核的工作量,这对老板来说是要花钱的,人员成本是最高的。

所以:我觉得默默地解决这些棘手的问题,虽然在当下看似吃亏,但在以后的工作中一定会带来更多的“复利”。

PS:很多做长尾词数据处理的朋友跟我交流说不知道怎么清洗,后续我会写一个类似工具的通用工具放在公众号上。

网课时代:老师如何吸引学生认真听课?技术与人文的缠绕命题待解
« 上一篇 2024-09-19
坦克世界:十年猛男游戏,二次元融入后的勇敢尝试
下一篇 » 2024-09-19

文章评论