search引擎如何find相关内容?

Google在parsingnetworking时如何find相关内容?

比方说,例如,Google使用PHP原生DOM库来parsing内容。 他们有什么方法可以在网页上find最相关的内容?

我的想法是,它会search所有段落,按每个段落的长度sorting,然后从可能的searchstring和查询参数中计算出每个段落的相关百分比。

假设我们有这个url:

http://domain.tld/posts/stackoverflow-dominates-the-world-wide-web.html 

现在从这个URL我会弄清楚HTML文件名是高度相关的,然后我会看看这个string与页面中的所有段落有多接近!

当你分享一个页面时,一个很好的例子就是Facebook共享。 Facebook快速将链接粘贴回来,并将图片,内容等带回

我以为某种计算方法是最好的,根据周围的元素和元数据来计算相关性的百分比。

有没有关于内容分析最佳实践的书籍/信息,包括如何从网站获取最佳内容,可能讨论的任何algorithm或任何深入的答复?


我想到的一些想法是:

  • 查找所有段落,并以纯文本的长度sorting
  • 以某种方式finddiv容器的宽度和高度,并按(W + H) – @Benoitsorting
  • 检查段落内的元关键字,标题,描述和检查相关性
  • find所有的图片标签,并按照最大的顺序排列,并且远离主要段落的节点的长度
  • 检查对象数据,如video,并从最大段落/内容div中统计节点
  • 找出与先前分析过的页面的相似之处

我需要这些信息的原因是:

我正在build立一个网站pipe理员给我们发送链接,然后我们列出他们的网页,但我希望网站pipe理员提交一个链接,然后我去抓取该页面find以下信息。

  • 图像(如果适用)
  • 来自最佳文本片段的<255段
  • 关键词将用于我们的search引擎,(堆栈溢出风格)
  • 元数据关键字,描述,所有图像,更改日志(用于审核和pipe理目的)

希望大家可以理解,这不是一个search引擎,但search引擎处理内容发现的方式与我所需要的相同。

我不是要求商业秘密,我问你个人的做法是什么。

这是一个非常普遍的问题,但是一个非常好的话题! 肯定upvoted :)但是我不满意迄今为止提供的答案,所以我决定写一个相当长的答案。

我不满意的原因是答案基本上都是真实的(我尤其喜欢kovshenin(+1)的答案,这与图论相关…),但是对于某些因素,一般。

这就像要求如何烤蛋糕,你会得到以下答案:

  • 你做一个蛋糕,你把它放在烤箱里。
  • 你肯定需要糖!
  • 什么是蛋糕?
  • 蛋糕是一个谎言!

你不会满意,因为你不知道什么是一个很好的蛋糕。 当然还有很多或者接收者。

当然Google是最重要的选手,但是根据用例的不同,search引擎可能会包含截然不同的因素,或者以不同的方式来加权。

例如,一个发现新的独立音乐艺术家的search引擎可能会在艺术家网站上投放大量的外部链接。

一个主stream的search引擎可能会完全相反,为您提供“相关结果”。

有(如前所述)Google发布了200多个因素。 所以网站pipe理员知道如何优化他们的网站。 公众不知道的很多很多(在谷歌的情况下)。

但是在SEO优化这个非常抽象和抽象的术语中,通常可以将重要的分成两组:

  1. 答案与问题的匹配程度如何? 或者:网页内容与search字词匹配程度如何?

  2. 这个答案有多好/多好? 或者:什么是网页排名?

在这两种情况下,重要的是我不是在谈论整个网站或域名,我正在谈论单一的网页与唯一的url。

网页排名并不代表所有因素,只有Google将其归类为热门程度。 而我的意思是其他因素与stream行无关。

在Google的官方声明中,他们希望向用户提供相关结果。 这意味着所有algorithm都将根据用户的需求进行优化。

所以经过这么长时间的介绍之后(很高兴你还在我身边)我会给你列出一些我认为非常重要的因素(目前):

类别1(问题的答案有多好?

您会注意到很多归结为文档的结构!

  • 该页面主要处理确切的问题。

含义:问题单词出现在页面标题文本或标题段落段落中。 这些关键字的位置也是一样的。 页面越早越好。 经常重复(如果没有太多的关键字填充名称)。

  • 整个网站处理的主题(关键字出现在域/子域)

  • 单词是这个页面中的一个重要主题(内部链接锚文本跳转到关键字的位置或锚文本/链接文本包含关键字)。

  • 如果外部链接使用链接文本中的关键字链接到此页面,也是一样

第2类(网页有多重要/受欢迎?)

你会注意到并不是所有的因素都指向了这个确切的目标。 其中一些(特别是Google)只是为了给页面增加一些内容,那就是…应该得到/赢得它。

  • 内容为王!

在networking的其他部分找不到或只有很less的独特内容的存在给予了提升。 这主要是通过网站上无用的单词组合来衡量的,通常使用很less(重要的词)。 但是还有更复杂的方法。

  • 新近 – 更新更好

  • 历史变化(页面过去更新的频率,变化是很好的)

  • 外部链接stream行度(有多less链接?)

如果一个页面链接另一个页面,则链接值得更多,如果页面本身具有高的网页排名。

  • 外部链接多样性

基本上来自不同根域的链接,但其他因素也起作用。 像甚至分离的因素是地理上链接网站(根据他们的IP地址)的networking服务器。

  • 信任等级

例如,如果大的,可信的,有编辑内容的build立网站链接到你,你会得到一个信任等级。 这就是为什么从纽约时报的链接是比一些奇怪的新网站更值得,即使它的PageRank更高!

  • 域信任

如果您的域名是可信的,那么您的整个网站会提升您的内容。 这里有很多不同的因素。 当然,从可信任的域名到你的域名的链接,如果你和重要网站在同一个数据中心,它甚至可以做的很好。

  • 中的主题特定链接。

如果可以parsing为主题链接的网站链接到您的查询也可以解决到这个主题,那就太好了。

  • 在一段时间内分配链接。

如果你在很短的时间内获得了很多的链接,那么在这个时候以及在不久的将来,这会对你有好处。 但后来不太好。 如果你减速并稳定地获得链接,那么对于“永恒”内容来说,这将会是一件好事。

  • 链接来自restrited域

一个.gov域名的链接是值得的。

  • 用户点击行为

你的search结果的点击率是多less?

  • 在网站上花费的时间

谷歌分析跟踪等。如果用户在打开你的账户后点击或点击另一个结果,也会跟踪它。

  • 收集用户数据

投票,评分等,Gmail中的参考资料等

现在我将介绍第三类,上面的一两点也会进入这个类,但是我没有想到…类是:

**您的网站总体上有多重要/好?

所有的网页将根据您的网站的质量排名

因素包括:

  • 良好的网站架构(易于浏览,结构化,站点地图等)

  • 如何build立(长期存在的领域值得更多)。

  • Hoster信息(您附近还有哪些其他网站?

  • search您的确切名称的频率。

最后但并非最不重要的,我想说的是,这些因素中的很多可以通过语义技术来丰富,并且可以引入新的因素。

例如,有人可能会search泰坦尼克号,并且你有一个关于冰山的网站……可以将其设置为可以反映的相关性。

新引入的语义标识符。 例如, OWL标签可能会对未来产生巨大的影响。

例如,关于电影泰坦尼克号的博客可以在这个页面上放置一个标志,就像维基百科上关于同一部电影的文章一样。

目前这种联系正在大力发展和build立,没有人知道如何使用。

也许重复的内容被过滤,只显示最重要的相同内容? 或者反过来呢? 你得到了很多与你的查询相匹配的页面。 即使他们不包含你的关键字?

谷歌甚至根据您的search查询的主题应用不同的相关因素!

狡猾,但我会采取一个刺:

图像(如适用)

  • 页面上的第一个图像
  • 名称中包含字母“logo”的图像
  • 呈现最接近左上angular(或右上angular)的图像
  • 在网站的其他页面上最经常出现的图像
  • 小于某些最大尺寸的图像

来自最佳文本片段的<255段

  • 标题标签的内容
  • 元内容描述标签的内容
  • 第一个h1标签的内容
  • 第一个p标签的内容

关键词将被用于我们的search引擎,(堆栈溢出风格)

  • 域名的子string
  • url的子string
  • 标题标签的子string
  • 术语和页面上最常见的单词以及页面顶部之间的距离

元数据关键字,描述,所有图像,更改日志(用于审核和pipe理目的)

  • AK! 插科打诨! 语法错误。

我不在谷歌工作,但大约一年前,我读了他们有超过200个因素排名他们的search结果。 当然,最高排名是相关的,所以你的问题在这个意义上是相当有趣的。

什么是相关性,你如何计算它? 有几种algorithm,我敢打赌谷歌有自己的,但我知道的是皮尔逊相关和欧几里德距离 。

关于这个话题(不一定是search引擎),我会提出一个很好的build议,就是Toby Segaran 编写的集体智慧编程 (O'Reilly)。 本书中的一些示例展示了如何通过API或屏幕抓取从第三方网站获取数据,并find相似的条目,这是相当不错的。

无论如何,回到谷歌。 其他相关技术当然是全文search,你可能想要得到一本关于MySQL或狮身人面像的好书。 @Chaoley推荐的TSEP也很有趣。

但是真的,我知道俄罗斯的一个叫做Yandex的search引擎,他们所做的一切都在NDA之下,所以我想你可以接近,但是除非你在Google工作,否则你不可能完美无缺。

干杯。

其实回答你的问题(而不仅仅是关于search引擎):

我相信像Instapaper一样会是最好的select。

背后的逻辑(我没有创build它,所以我当然不知道内部工作,但是很容易预测它是如何工作的):

  1. 在类似文本的元素中查找最大的一些文本(依赖段落标签,虽然非常优雅,但不适用于那些使用div而不是p的蹩脚网站)。 基本上,你需要find块元素(divs,ps等)和文本数量之间的良好平衡。 提出一些门槛:如果X个单词未被标记保留,则该文本属于主体文本。 然后展开为保持某种文本/标记阈值的兄弟。

  2. 一旦你做了最困难的部分 – find什么文本属于实际的文章 – 它变得很容易。 您可以在该文字周围find第一张图片,并将其用作缩略图。 这样你就可以避开广告,因为它们不会靠近正文文本标记。

  3. 最后,提出关键字是有趣的部分。 你可以做很多事情:按频率sorting,消除噪音(和,等),你有一些不错的东西。 将“检测到的正文文本区域之上的突出的短文本元素”(即您的文章的标题),页面标题,元组合,并且您有一些非常好吃的东西。

所有这些想法,如果得到正确执行,将是非常防弹的,因为它们不依赖于语义标记 – 通过使您的代码变得复杂,确保即使是非常马虎的网站也能被正确地检测到。

当然,performance不佳也有不好的一面,但我想这不应该是那么糟糕。

提示:对于经常链接到大型网站的用户,可以手动设置包含正文文本的HTML元素(我在第一点上描述的)。 这将确保正确性和速度。

希望这个对你有帮助。

大多数search引擎在文档的头部寻找标题和元描述,然后在主体中标题和文本内容。 图片替代标签和链接标题也被考虑。 最后,我读雅虎是使用meta关键字标签,但大多数不。

您可能需要从Sourceforge https://sourceforge.net/projects/tsep/上的search引擎项目(TSEP)下载开源文件,并看看它们是如何实现的。;

我只是抓住文字的第一个“段落”。 大多数人写故事/问题的方式/无论是他们首先陈述最重要的事情,然后进行详细说明。 如果你看任何随机文本,你可以看到它在大多数情况下是有意义的。

例如,你在你原来的问题中自己动手。 如果你拿出你原来的问题的前三句话,你就可以很好的总结你正在做什么。

而且我也是自己做的:第一段总结了我评论的要点。 其余的只是例子和阐述。 如果您不确定,请参阅我从Google新闻中随机挑选的最近 几篇文章 。 好的,我承认最后一个不是半随机的)

无论如何,我认为这是一个非常简单的方法,在大多数情况下都是可行的。 您可以随时查看元描述,标题和关键字,但是如果它们不在那里,这可能是一个选项。

希望这可以帮助。

从标签汤中提取相关内容有很多非常复杂的algorithm。 如果你想构build一些可用的东西,你可以看看源代码的可读性,并将其移植到php。 我最近做了类似的事情(不幸的是,不能分享代码)。

可读性的基本逻辑是查找所有块级别标签并计算其中的文本长度,而不包括儿童。 然后,每个父节点被授予每个孩子体重的一半(一半)。 这是用来资助最大量的纯文本块最大的块级标签。 从这里,内容进一步清理。

这不是以任何方式防弹的,但是在大多数情况下它运作良好。

我会考虑这些构build代码

  • 检查同义词和首字母缩略词
  • 在图像上应用OCR作为文本search(Abby Fine Reader和Recostar很好, Tesseract是免费的,罚款(没有罚款读者:))
  • 重量字体(尺寸,粗体,下划线,颜色)
  • 权重内容取决于其在页面上的位置(如页面上方的内容更相关)

也:

  • 来自网站pipe理员的可选文字定义页面

您还可以检查是否可以在GooglesearchAPI中find任何有用的信息: http : //code.google.com/intl/tr/apis/ajaxsearch/

我现在面临同样的问题,经过一些尝试,我发现了一些可用于创build网页片段(必须进行微调)的内容:

  • 把所有的HTML
  • 删除内容中的脚本和风格标签内容(重要)
  • 删除不必要的空格,制表符,换行符。
  • 现在通过DOM导航来捕捉div,p,article,td(others?)和每一个。 采取当前元素的HTML。 采取元素内容的“仅文本”版本。 分配给这个元素的分数:文本长度*文本长度/ html长度
  • 现在sorting所有的分数,采取最大的。

这是一种快速(和肮脏)的方式来识别标记平衡相对较低的最长的文本,就像正常内容中发生的那样。 在我的testing中,这看起来非常好。 就加水 ;)

除此之外,您可以search“og:”meta标签,标题和说明,h1以及许多其他小技巧。

谷歌的“networking爬虫,机器人,蜘蛛和智能代理”,也可以单独尝试,以获得单独的结果。

  • networking爬虫
  • 用户代理
  • 机器人
  • 数据/屏幕抓取

我认为你正在寻找的是屏幕抓取(与DOM)的堆栈有一吨的问答 。

Google也使用一个名为Page Rank的系统,在这个系统中检查有多less个网站链接。 假设您正在寻找一个C ++教程,并且在Google上search一个。 你find一个作为最好的结果,这是一个很好的教程。 谷歌知道这一点,因为它通过networkingcaching进行search,看到每个人都链接到本教程,而咆哮是多么好。 谷歌认为这是一个很好的教程,并把它作为最重要的结果。

它实际上是这样做的,因为它caching所有内容,如前所述,基于链接指向每个页面。

希望这可以帮助!

要回答你的一个问题,我现在正在阅读以下书籍,我推荐它: Google的PageRank和Beyond ,Amy Langville和Carl Meyer。

轻微的math。 在图论的语境,特征分析,马尔科夫模型等中使用了一些线性代数。我喜欢讨论求解线性方程的迭代方法的部分。 我不知道Google采用了这些迭代方法。

简短的书,只有200页。 包含与文本主stream不同的“旁白”,加上历史的视angular。 也指向其他最近的排名系统。

这里有一些很好的答案,但是这听起来像他们不回答你的问题。 也许这个会的。

你要找的就是信息检索

它通常使用Bag Of Words模型

假设你有两个文件:

 DOCUMENT A Seize the time, Meribor. Live now; make now always the most precious time. Now will never come again 

和这个

 DOCUMENT B Worf, it was what it was glorious and wonderful and all that, but it doesn't mean anything 

你有一个查询,或者你想find其他相关文件的东西

 QUERY aka DOCUMENT C precious wonderful life 

无论如何,你如何计算这两个文件中“最相关的”? 就是这样:

  1. 标记每个文件(分成单词,删除所有非字母)
  2. 小写的一切
  3. 删除停用词(和等)
  4. 考虑干扰(删除后缀,见波特或雪球干扰algorithm)
  5. 考虑使用n-gram

你可以计算词频,得到“关键字”。

然后,你为每个单词做一列,并计算这个单词对文档的重要性,就其在所有文档中的重要性而言。 这被称为TF-IDF度量。

现在你有这个:

 Doc precious worf life... A 0.5 0.0 0.2 B 0.0 0.9 0.0 C 0.7 0.0 0.9 

然后,使用余弦相似性度量来计算文档之间的相似度。 与DOCUMENT C最相似的文件是最相关的。

现在,您似乎想要查找最相似的段落,所以只需调用每个段落的文档,或者考虑在文档上使用Sliding Windows。

你可以在这里看到我的video。 它使用graphics化的Java工具,但是解释了这些概念:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-part-4.html

这里是一个体面的红外书:

IR-book/pdf/irbookonlinereading.pdf