方法和技巧:SEO外链建设的SEO技巧有哪些
优采云 发布时间: 2022-12-01 16:53方法和技巧:SEO外链建设的SEO技巧有哪些
SEO外链技巧有哪些?SEO外链建设和网站内容优化同样重要。SEO外链技巧作为网站推广和吸引蜘蛛的一项重要技能,是我们SEO工作的重要组成部分。外建SEO技巧有哪些?羊毛布?
外部链接通常是指向我们网站的链接,分为反向链接和友情链接;外部链接的存在形式分为锚文本、纯文本和超链接。不管是哪种形式,在高权重的网站上留下外链,都可以让我们的网站获得更多的积分,从而获得搜索引擎的信任。我们可以通过以下几点来优化外部链接:
1.批量发布外链
通过外链批量发布高权重站点留下痕迹,可以让我们建立大量的外链。当然,我们也可以建立友情链接。通过与权重相同的网站交换友情链接,大家可以互惠互利。外链质量是我们不能忽视的,如果对方网站受到处罚,我们建立友情链接的也会受到相应的处罚。因此,友情链的质量往往比数量更重要。
2、SEO内链优化
SEO外链优化也要重视内链优化。通过生成我们的站点地图,捕获死链接并将未采集
的链接提交给搜索引擎,我们的网站也可以快速收录。
" />
SEO外链技巧只是SEO工作中的其中一个环节。对于链接SEO,我们不仅可以对外部链接(反链接、好友链接)进行优化,还可以对我们的内部链接(出站链接、收录/不收录链接、死链接等)进行优化,通过SEO工具,我们可以批量发布外链留痕,抓取分析内链,一键生成站点地图,提交死链和未收链。
3.坚持发布软文
优质的软文可以帮助我们获得更多的流量,建立其他平台的知名度。写软文也是外链的一部分。通过坚持发布软文,还可以帮助网站吸引更多的流量。
4、自媒体发布
自媒体作为当下最流行的社交方式,聚集了大量的流量。通过自媒体建设和平台自媒体互动,可以在留言中不经意留下自己的外链
5.论坛发布
网站论坛是我们SEO外链优化中比较容易建立外链的位置。我们经常可以通过发帖和回复讨论来建立外部链接。有时我们甚至可以把论坛的个性化签名变成我们网站的关键词,通过论坛的活跃度来增加我们网站的访问量。
" />
6. 关键词优化
关键字是潜在客户用来搜索我们业务的词。如果我们在内容中正确使用这些词,我们可以获得良好的 SEO 排名。因此,获得更多流量的机会将会增加。如果目标的关键优化难度系数太高,我们可以从目标关键词扩展的长尾关键词优化入手,难度小很多,也更容易排名以这种方式上升。
7.使用智能链接构建技术
链接建设是指从其他站点获取链接的方法。搜索引擎还会考虑我们网站收到的链接数量。但是这些链接应该来自高质量和可信的站点。如果我们从高权威站点获得多个链接,我们可能会获得更好的 SEO 排名。
SEO外链技巧分享到此结束。希望通过这篇文章,能让大家对外链优化有更深入的了解。在外链建设中,不能只追求数量,更应重视质量控制。通过链接的优化,无论是内链还是外链,都可以为我们的SEO工作提供更好的支持。如果你喜欢这篇文章,记得点赞哦。
核心方法:【NLP】文本关键词提取的两种方法-TFIDF和TextRank
原文原文地址:
背景
前两天看到论文《Chinese Poetry Generation with Planning based Neural Network》使用TextRank进行关键词抽取。看文章的时候还想到除了TextRank,TFIDF也经常被用于关键词抽取。
一些算法的使用取决于业务场景和算法的特性。关键词提取是为了什么?“关键词提取的任务是从给定的文本中自动提取一些有意义的单词或短语。” 那么这个“有意义”会和算法的特点结合起来。
补充一句:这两个方案都是无监督的。当然也可以通过分类来进行监督处理。本文不讨论有监督的关键词提取方法。
TFIDF1。基础理论
TF-IDF(term frequency-inverse document frequency)是信息检索和数据挖掘中常用的加权技术。TF是Term Frequency,IDF是Inverse Document Frequency。也就是说:一个词在一篇文章中出现的次数越多,在所有文档中出现的次数越少,就越能代表这篇文章。
词频(term frequency,TF)是指给定词在文件中出现的次数。在实际任务中,也可以是一句话,需要结合具体任务灵活运用。这个数字通常是归一化的,通常是词频除以文章总词数(同一个词在长文件中的词频可能比在短文件中高,不管这个词重要与否) , 以防止它被偏向长文档。找一个文档,其中词频 tf 表示该词在文档中出现的频率:
tf_{dt} = \frac{m_{dt}}{M_d} \\
tf_{dt}是指:特征项t也可以认为是一个词在文档或句子d中出现的频率m_{dt}除以文本或句子d中词的总数M_d。课文中也有很多无用的词,例如:“of”、“is”、“in”——这一类中最常用的词。它们被称为“停用词”(stop words),数量众多,对文本的表示作用不大。这时候就需要用到一个叫做reverse document frequency idf的东西,它反映了term在文档数据中的重要性。计算公式如下:
idf_t=\log\left(\frac{N}{n_t + 0.1}\right)\\
idf_t除以文件总数N除以收录
特征项t的文件数n_t(加0.1避免分母为0),然后取对数。可以想象他表达的物理意义:当每篇文档都收录
这个特征t时,那么n_t=N,idf_t的最终结果接近于0,那么这个特征就不是很重要了。
那么文档d中的一个特征t最终的tf-idf权重为:
w_{dt}=tf_{dt} \times idf_t \\
2.代码解释
下面我们来看看tfidf在jieba分词中是如何实现的。当然scikit-learn库中也有一个tfidf库,但是为了让各个模型的训练方式保持一致,scikit-learn对它进行了对比封装,算法暂时不考虑。超越编程设计和算法视觉技能。
TextRank1.PageRank原理介绍
知道了PageRank的原理,就更容易理解TextRank的基本原理。PageRank 最初用于衡量网页的重要性。整个www可以看成一个有向图,节点就是网页。如果从网页 A 到网页 B 有一条链接,那么从网页 A 到网页 B 就存在一条有向边。有两个基本思想:
“链接数”:一个网页被其他网页链接的次数越多,该网页就越重要。“链接质量”:一个网页被权重较高的网页链接,也可以说明该网页比较重要。
节点的评分公式如下:
S\left(V_{i}\right)=(1-d)+d * \sum_{j \in \operatorname{In}\left(V_{i}\right)} \frac{1}{\operatorname {|Out}\left(V_{j}\right)|} S\left(V_{j}\right) \\
在:
PR值可以通过不断的迭代收敛到一个稳定的值,但是当阻尼系数接近1时,需要的迭代次数会急剧增加,排名会不稳定。
《如何确定链接网页的初始分数:》算法开始时,将所有网页的分数初始化为1,然后通过多次迭代使每个网页的分数收敛。收敛时的分数就是网页的最终分数。如果不能收敛,也可以通过设置最大迭代次数来控制计算,计算停止时的分数就是网页的分数。
2、TextRank原理介绍
在提取关键词时,TextRank算法与PageRank算法类似。不同的是,在TextRank中,词作为节点,节点之间的链接是通过“共现关系”建立的。在 PageRank 中,存在有向边。在 TextRank 中,存在无向边或双向边。
什么是同现关系?对文本进行切分,去除停用词或词性筛选等,设置窗口长度为k,即最多只能出现K个词,滑动窗口在一起出现的词之间建立一个无向词在窗口中。边。
原论文关键词中的例子提取了如下文字:
Compatibility of systems of linear constraints over the set of natural numbers.
Criteria of compatibility of a system of linear Diophantine equations, strict
inequations, and nonstrict inequations are considered. Upper bounds for
components of a minimal set of solutions and algorithms of construction of
minimal generating sets of solutions for all types of systems are given.
These criteria and the corresponding algorithms for constructing a minimal
supporting set of solutions can be used in solving all the considered types
systems and systems of mixed types.
进行图的构建得到下图:
关键词结果如下:
总体效果还可以。TextRank的计算公式如下:
WS\left(V_{i}\right)=(1-d)+d \times \sum_{V_{j} \in I n\left(V_{i}\right)} \frac{w_{ji} }{\sum_{V_{k} \in O ut\left(V_{j}\right)} w_{jk}} WS\left(V_{j}\right) \\
可以看出,这个公式只比PageRank多了一个权重项w_{ji},用来表示两个节点之间边连接的重要性不同。
TextRank用于关键词抽取的算法如下:
根据完整的句子对给定的文本T进行切分,得到T=[S_1,S_2,\cdots, S_m] 对每个句子S_i\in T,进行分词和词性标注,过滤掉停用词,保留只有指定的词性词,如名词、动词、形容词,得到S_i=[t_{i,1}, t_{i,2}, \cdots,t_{i, n}],其中t_{i, j}是预留的Candidate关键词构建一个候选关键词图G=(V,E),其中V是节点集,由上一步生成的候选关键词组成,然后利用共现关系构造任意两个点之间的边,只有当它们对应的词汇在长度为k的窗口中共现时,两个节点之间才有边,k表示窗口大小,即最大k个词共现 根据上面的公式,迭代传播每个节点的权值,直到节点权值逆序排序,从而得到最重要的T个词,作为候选关键词将上一步得到的最重要的T个词标记在原文中,如果形成相邻的短语,则组合成多个单词关键词
上面最后一步相当于处理了TextRank结果,也可以考虑候选关键词在文本中的位置做进一步处理。一般来说,出现在文件正反面的词比较重要。
提取关键词词组的方法是基于关键词提取的,可以简单地认为:如果提取的几个关键词在文本中相邻,则构成一个提取的关键短语。
如果生成摘要,则将文本中的每一个句子视为一个节点,如果两个句子相似,则认为两个句子对应的节点之间存在无向加权边。有很多方法可以检查两个句子之间的相似性。
算法使用分析
对于TFIDF算法,如果从当前已有的文本数据中提取关键词,则可以利用当前语料库计算每个词的权重,得到对应文档的关键词。语料库,如果抽取新文本的关键词,新文本中关键词的抽取效果更依赖于已有的语料库。
对于TextRank,如果要抽取的关键词文本比较长,那么可以直接将文本用于关键词抽取,不需要相关的语料库。当要提取的文本很短,比如一个句子时,通过语料数据计算每个词的重要性可能会更好。
此外,还需要考虑文本的长度,灵活运用这两种算法。
代码解读 一、代码实现
jieba分词是中文信息处理中不可或缺的工具,其中实现了TFIDF和TextRank算法。下面我们就来看看它是如何实现的以及如何使用它。这两种算法在python jieba中的实现路径如下:
看了下源码的实现,
1.1 TFIDF
首先实现一个关键词提取类:
class KeywordExtractor(object):
STOP_WORDS = set((
"the", "of", "is", "and", "to", "in", "that", "we", "for", "an", "are",
"by", "be", "as", "on", "with", "can", "if", "from", "which", "you", "it",
"this", "then", "at", "have", "all", "not", "one", "has", "or", "that"
))
def set_stop_words(self, stop_words_path):
abs_path = _get_abs_path(stop_words_path)
if not os.path.isfile(abs_path):
raise Exception("jieba: file does not exist: " + abs_path)
content = open(abs_path, 'rb').read().decode('utf-8')
for line in content.splitlines():
self.stop_words.add(line)
def extract_tags(self, *args, **kwargs):
raise NotImplementedError
核心代码如下:
class TFIDF(KeywordExtractor):
<p>
" />
def __init__(self, idf_path=None):
self.tokenizer = jieba.dt
self.postokenizer = jieba.posseg.dt
self.stop_words = self.STOP_WORDS.copy()
self.idf_loader = IDFLoader(idf_path or DEFAULT_IDF)
self.idf_freq, self.median_idf = self.idf_loader.get_idf()
def set_idf_path(self, idf_path):
new_abs_path = _get_abs_path(idf_path)
if not os.path.isfile(new_abs_path):
raise Exception("jieba: file does not exist: " + new_abs_path)
self.idf_loader.set_new_path(new_abs_path)
self.idf_freq, self.median_idf = self.idf_loader.get_idf()
def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):
"""
Extract keywords from sentence using TF-IDF algorithm.
Parameter:
- topK: return how many top keywords. `None` for all possible words.
- withWeight: if True, return a list of (word, weight);
if False, return a list of words.
- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v','nr'].
if the POS of w is not in this list,it will be filtered.
- withFlag: only work with allowPOS is not empty.
if True, return a list of pair(word, weight) like posseg.cut
if False, return a list of words
"""
if allowPOS:
allowPOS = frozenset(allowPOS)
words = self.postokenizer.cut(sentence)
else:
words = self.tokenizer.cut(sentence)
freq = {}
for w in words:
if allowPOS:
if w.flag not in allowPOS:
continue
elif not withFlag:
w = w.word
wc = w.word if allowPOS and withFlag else w
if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
continue
freq[w] = freq.get(w, 0.0) + 1.0
total = sum(freq.values())
for k in freq:
kw = k.word if allowPOS and withFlag else k
freq[k] *= self.idf_freq.get(kw, self.median_idf) / total
if withWeight:
tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
else:
tags = sorted(freq, key=freq.__getitem__, reverse=True)
if topK:
return tags[:topK]
else:
return tags
</p>
jieba分词中已经计算了27万个词的idf值,可以直接计算当前句子或文档中每个词的TFIDF值,得到对应的关键词。如果需要计算自己语料中的idf值,建议使用比较专业的库如:scikit-learn,本文不再介绍。
1.2 TextRank
TextRank除了继承KeywordExtractor类外,还写了一个计算无向图的类,如下:
class UndirectWeightedGraph:
d = 0.85
def __init__(self):
self.graph = defaultdict(list)
def addEdge(self, start, end, weight):
# use a tuple (start, end, weight) instead of a Edge object
self.graph[start].append((start, end, weight))
self.graph[end].append((end, start, weight))
def rank(self):
ws = defaultdict(float)
outSum = defaultdict(float)
wsdef = 1.0 / (len(self.graph) or 1.0)
for n, out in self.graph.items():
ws[n] = wsdef
outSum[n] = sum((e[2] for e in out), 0.0)
# this line for build stable iteration
<p>
sorted_keys = sorted(self.graph.keys())
for x in xrange(10): # 10 iters
for n in sorted_keys:
s = 0
for e in self.graph[n]:
s += e[2] / outSum[e[1]] * ws[e[1]]
ws[n] = (1 - self.d) + self.d * s
(min_rank, max_rank) = (sys.float_info[0], sys.float_info[3])
for w in itervalues(ws):
if w < min_rank:
min_rank = w
if w > max_rank:
max_rank = w
for n, w in ws.items():
# to unify the weights, don't *100.
ws[n] = (w - min_rank / 10.0) / (max_rank - min_rank / 10.0)
return ws
</p>
核心代码如下:
class TextRank(KeywordExtractor):
def __init__(self):
self.tokenizer = self.postokenizer = jieba.posseg.dt
self.stop_words = self.STOP_WORDS.copy()
self.pos_filt = frozenset(('ns', 'n', 'vn', 'v'))
self.span = 5
def pairfilter(self, wp):
return (wp.flag in self.pos_filt and len(wp.word.strip()) >= 2
and wp.word.lower() not in self.stop_words)
def textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):
"""
Extract keywords from sentence using TextRank algorithm.
Parameter:
- topK: return how many top keywords. `None` for all possible words.
- withWeight: if True, return a list of (word, weight);
if False, return a list of words.
- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].
if the POS of w is not in this list, it will be filtered.
- withFlag: if True, return a list of pair(word, weight) like posseg.cut
if False, return a list of words
"""
self.pos_filt = frozenset(allowPOS)
g = UndirectWeightedGraph()
cm = defaultdict(int)
words = tuple(self.tokenizer.cut(sentence))
for i, wp in enumerate(words):
if self.pairfilter(wp):
for j in xrange(i + 1, i + self.span):
if j >= len(words):
break
if not self.pairfilter(words[j]):
continue
if allowPOS and withFlag:
cm[(wp, words[j])] += 1
else:
cm[(wp.word, words[j].word)] += 1
for terms, w in cm.items():
g.addEdge(terms[0], terms[1], w)
nodes_rank = g.rank()
if withWeight:
tags = sorted(nodes_rank.items(), key=itemgetter(1), reverse=True)
else:
tags = sorted(nodes_rank, key=nodes_rank.__getitem__, reverse=True)
if topK:
return tags[:topK]
else:
return tags
extract_tags = textrank
这个实现也是对当前文档或句子计算的topK关键词,并没有用到一些语料。所以不管是tfdif还是textrank,如果业务比较复杂,要么用scikit-learn,要么自己实现。不过上面的代码还是可以借鉴的,实现方式也很好。
2. 使用范例