搜索引擎如何找到相关内容?

时间:2010-10-19 09:43:30

标签: php parsing screen-scraping relevance

Google在解析网络时如何找到相关内容?

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

我的想法是它将搜索所有段落,按每个段落的长度排序,然后从可能的搜索字符串和查询参数中找出每个段落的相关百分比。

假设我们有这个网址:

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

现在从该URL我会发现HTML文件名具有高度相关性,因此我会看到该字符串与页面中所有段落的比较接近!

当你共享一个页面时,一个非常好的例子就是Facebook分享。 Facebook快速设置链接并带回图像,内容等等。

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

是否有关于内容解析最佳做法的书籍/信息,包括如何从网站获取最佳内容,可以讨论的任何算法或任何深入的回复?


我想到的一些想法是:

  • 查找所有段落并按明文长度排序
  • 以某种方式找到div容器的宽度和高度,并按(W + H)排序 - @Benoit
  • 检查元关键字,标题,说明并检查段落中的相关性
  • 查找所有图片代码并按最大的顺序排序,以及远离主要段落的节点长度
  • 检查对象数据,例如视频并计算最大段落/内容div中的节点
  • 解析之前解析过的网页的相似之处

我之所以需要这些信息:

我正在建立一个网站,网站管理员会向我们发送链接,然后我们会列出他们的网页,但我希望网站管理员提交一个链接,然后我会抓取该网页查找以下信息。

  • 图像(如果适用)
  • A<来自最佳文本片段的255段
  • 将用于我们搜索引擎的关键字(Stack Overflow style)
  • 元数据关键字,描述,所有图像,更改日志(用于审核和管理)

希望你们能够理解这不适用于搜索引擎,但搜索引擎处理内容发现的方式与我需要的内容相同。

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

13 个答案:

答案 0 :(得分:29)

答案 1 :(得分:21)

整蛊,但我会刺伤:

图片(如适用)

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

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

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

将用于我们搜索引擎的关键字,(堆栈溢出样式)

  • 域名的子字符串
  • 网址的子字符串
  • 标题标记的子字符串
  • 术语与页面和页面顶部最常见的单词之间的距离

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

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

答案 2 :(得分:11)

我不在谷歌工作,但大约一年前我读过他们有超过200个因素来排名他们的搜索结果。当然,排名最高的是相关性,因此从这个意义上说,你的问题非常有趣。

什么是相关性,你如何计算它?有几种算法,我敢打赌Google有自己的算法,但我知道的是Pearson CorrelationEuclidean Distance

我在这个主题(不一定是搜索引擎)上建议的好书是Toby Segaran(O'Reilly)的Programming Collective Intelligence。本书中的一些示例显示了如何通过API或屏幕抓取从第三方网站获取数据,以及查找类似的条目,这非常好。

无论如何,回到谷歌。其他相关技术当然是全文搜索,你可能想要获得一本关于MySQL或Sphinx的好书。 @Chaoley建议TSEP也很有意思。

但实际上,我知道来自俄罗斯搜索引擎Yandex的人,他们所做的一切都是在NDA之下,所以我猜你可以接近,但除非你在谷歌工作,否则你无法完美;)

干杯。

答案 3 :(得分:3)

实际上回答你的问题(而不仅仅是关于搜索引擎):

我认为有点像Instapaper会是最好的选择。

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

  1. 在类似文本的元素中查找最大的文本(依赖于段落标记,虽然非常优雅,但不适用于那些使用div而不是p的糟糕网站)。基本上,您需要在块元素(div,ps等)和文本量之间找到良好的平衡。想出一些阈值:如果X个单词保持不被标记分开,那么该文本属于主体文本。然后扩展到兄弟姐妹,保持某种文本/标记阈值。

  2. 一旦你做了最困难的部分 - 找到哪些文字属于实际文章 - 它变得非常容易。您可以在该文本周围找到第一个图像,并将其用作缩略图。这样您就可以避免广告,因为它们不会接近正文标记。

  3. 最后,提出关键字是有趣的部分。你可以做很多事情:按频率订购单词,去除噪音(ands,ors等),你就会有一些不错的东西。将其与“检测到的正文文本区域上方的突出短文本元素”(即您的文章标题),页面标题,元组合混合,您就会有一些美味的东西。

  4. 如果实施得当,所有这些想法都将非常具有防弹性,因为它们不依赖于语义标记 - 通过使您的代码变得复杂,您可以确保即使是非常草率编码的网站也能被正确检测到。

    当然,它伴随着糟糕表现的缺点,但我想它不应该那么差。

    提示:对于人们经常链接的大型网站,您可以手动设置包含正文文本(我在第1点上描述)的HTML元素。这将确保正确性并加快速度。

    希望这有点帮助。

答案 4 :(得分:2)

有许多高度复杂的算法可用于从标签汤中提取相关内容。如果您正在构建可用于自己的东西,您可以查看readability的源代码并将其移植到php。我最近做了类似的事情(不幸的是,不能共享代码)。

可读性的基本逻辑是找到所有块级标签并计算其中的文本长度,而不是计算子项。然后,每个父节点被授予其每个子节点的权重的一半(一半)。这用于资助具有最大纯文本量的最大块级标记。从这里开始,内容将被进一步清理。

它无论如何都不是防弹,但在大多数情况下效果都很好。

答案 5 :(得分:1)

大多数搜索引擎在文档的头部查找标题和元描述,然后在正文中标题1和文本内容。还考虑了图像alt标签和链接标题。最后我读到雅虎使用的是meta关键字标签,但大多数都没有。

您可能希望从Sourceforge https://sourceforge.net/projects/tsep/上的搜索引擎项目(TSEP)下载开源文件,并了解他们是如何做到的。

答案 6 :(得分:1)

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

例如,您可以在原始问题中自行完成。如果你采用原始问题的前三个句子,你就可以很好地总结你想要做的事情。

而且,我自己也是这样做的:我的评论的要点总结在第一段。其余的只是例子和阐述。如果您不相信,请查看我从谷歌新闻中随机挑选的a few recent articles。好吧,最后一个不是半随机的,我承认;)

无论如何,我认为这是一种非常简单的方法,大部分时间都可以使用。您可以随时查看元描述,标题和关键字,但如果不存在,则可能是一种选择。

希望这有帮助。

答案 7 :(得分:1)

我会考虑构建代码

  • 检查synonyms和首字母缩略词
  • 在图像上应用OCR以搜索为文本(Abby Fine Reader和Recostar非常好,Tesseract是免费且精细的(没有精细读者那么好:))
  • 重量字体(大小,粗体,下划线,颜色)
  • 重量含量取决于其在页面上的位置(如页面上方的内容更相关)

此外:

  • 网站管理员要求定义网页的文字

您还可以查看是否可以在Google搜索API中找到有用的内容:http://code.google.com/intl/tr/apis/ajaxsearch/

答案 8 :(得分:1)

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

  • 拿走所有的html
  • 使用内容删除主体内的脚本和样式标签(重要)
  • 删除不必要的空格,标签,换行符。
  • 现在浏览DOM以捕获div,p,article,td(其他?)和每个 。获取当前元素的html 。采用元素内容的“仅文本”版本 。为这个元素分配得分:text lenght * text lenght / html lenght
  • 现在排序所有分数,取得最大成绩。

这是一种快速(且肮脏)的方法来识别具有相对较低的标记平衡的最长文本,就像正常内容中发生的那样。在我的测试中,这似乎非常好。只需加水;)

除此之外,您还可以搜索“og:”元标记,标题和说明,h1以及许多其他小技巧。

答案 9 :(得分:0)

谷歌搜索“网络抓取工具,机器人,蜘蛛程序和智能代理”,也可以单独试用它们以获得单独的结果。

我认为您正在寻找的是Stack has a ton of Q&A上的屏幕抓取(带有DOM)。

答案 10 :(得分:0)

Google还使用了一个名为Page Rank的系统 它检查了一个站点的链接数量。假设您正在寻找C ++教程,并在Google上搜索一个。你会发现一个是最好的结果,这是一个很棒的教程。谷歌知道这一点,因为它搜索了它的网络缓存,并看到每个人都链接到本教程,同时咆哮它有多好。谷歌认为这是一个很好的教程,并将其作为最佳结果。

它实际上是这样做的,因为它会缓存所有内容,如前所述,根据链接指向每个页面的页面排名。

希望这有帮助!

答案 11 :(得分:0)

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

轻度数学。在图论理论背景,特征分析,马尔可夫模型等中使用一些线性代数。我喜欢谈论用于求解线性方程的迭代方法的部分。我不知道谷歌采用了这些迭代方法。

短篇小说,只有200页。包含与文本主流不同的“旁白”,以及历史视角。还指出其他最近的排名系统。

答案 12 :(得分:0)

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

您所寻找的信息检索

它通常使用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

你有一个查询,或者你想找到

的其他相关文件
QUERY aka DOCUMENT C
precious wonderful life

无论如何,你如何计算这两份文件中最“相关”的?方法如下:

  1. 标记每个文档(分成单词,删除所有非字母)
  2. 小写一切
  3. 删除停用词(以及等)
  4. 考虑词干(删除后缀,请参阅Porter或Snowball词干算法)
  5. 考虑使用n-gram
  6. 您可以计算单词频率,以获取“关键字”。

    然后,为每个单词创建一列,并计算单词对文档的重要性,以及它在所有文档中的重要性。这称为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具有最高相似性的文档是最相关的。

    现在,您似乎想要查找最相似的段落,因此只需将每个段落称为文档,或者考虑在文档上使用滑动窗口。

    你可以在这里看到我的视频。它使用图形Java工具,但解释了概念:

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

    这是一本不错的IR书:

    http://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf