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
- 以某种方式find
div
容器的宽度和高度,并按(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优化这个非常抽象和抽象的术语中,通常可以将重要的分成两组:
-
答案与问题的匹配程度如何? 或者:网页内容与search字词匹配程度如何?
-
这个答案有多好/多好? 或者:什么是网页排名?
在这两种情况下,重要的是我不是在谈论整个网站或域名,我正在谈论单一的网页与唯一的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它,所以我当然不知道内部工作,但是很容易预测它是如何工作的):
-
在类似文本的元素中查找最大的一些文本(依赖段落标签,虽然非常优雅,但不适用于那些使用div而不是p的蹩脚网站)。 基本上,你需要find块元素(divs,ps等)和文本数量之间的良好平衡。 提出一些门槛:如果X个单词未被标记保留,则该文本属于主体文本。 然后展开为保持某种文本/标记阈值的兄弟。
-
一旦你做了最困难的部分 – find什么文本属于实际的文章 – 它变得很容易。 您可以在该文字周围find第一张图片,并将其用作缩略图。 这样你就可以避开广告,因为它们不会靠近正文文本标记。
-
最后,提出关键字是有趣的部分。 你可以做很多事情:按频率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
无论如何,你如何计算这两个文件中“最相关的”? 就是这样:
- 标记每个文件(分成单词,删除所有非字母)
- 小写的一切
- 删除停用词(和等)
- 考虑干扰(删除后缀,见波特或雪球干扰algorithm)
- 考虑使用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
这里是一个体面的红外书: