【发布时间】:2012-11-01 00:51:29
【问题描述】:
我有一个 HTML 文档,我想找到最接近给定单词的最大提及集群的 HTML 元素。
使用以下 HTML:
<body>
<p>
Hello <b>foo</b>, I like foo, because foo is the best.
<p>
<div>
<blockquote>
<p><strong>Foo</strong> said: foo foo!</p>
<p>Smurfs ate the last foo and turned blue. Foo!</p>
<p>Foo foo.</p>
</blockquote>
</div>
</body>
我想要一个函数
find_largest_cluster_wrapper(html, word='foo')
...它将解析 DOM 树并返回我 <blockquote> 元素,因为它包含最大密度的 foo 提及,并且它是最接近的包装器。
第一个<p> 包含foo 3 次,<b> 只包含一次,内部<p>s 包含foo 3 次,两次又两次,@ 987654328@ 只有一次。但是<blockquote> 包含 foo 4 次。 <div> 也是如此,但它不是最接近的包装器。 <body> 元素的提及次数最多,但它在集群中过于稀疏。
没有聚类的直接实现总是会给我<html> 或<body> 或类似的东西,因为这些元素总是有最多的请求提及,并且可能是最接近它们的包装器。但是,我需要使用最大集群的东西,因为我只对网页中单词密度最高的部分感兴趣。
解析部分我不是很好奇,beautifulsoup4或者其他库可以很好的解决。我想知道一种有效的算法来进行聚类。我用谷歌搜索了一段时间,我认为scipy 中的clustering package 可能会有所帮助,但我不知道如何使用它。谁能推荐我最好的解决方案并将我踢向正确的方向?示例将非常棒。
嗯,一般来说很难回答这样的问题,因为正如你所指出的,条件很模糊。所以,更具体地说:
通常,文档可能只包含一个这样的集群。我的目的是找到这样的集群并获得它的包装器,以便我可以使用它进行操作。这个词也可以在页面的其他地方提到,但我正在寻找一个值得注意的这样的词集群。如果有两个或更多值得注意的集群,那么我必须使用外部偏见来决定(检查标题、页面标题等)。集群引人注目是什么意思?这正是我刚才介绍的意思——没有“严肃”的竞争对手。如果竞争对手是认真的或不认真的,我可以提供一些数字(比率),例如如果有 10 个集群和 2 个集群,则差异将是 80%。我可以说,如果有一个差异大于 50% 的集群,那将是值得注意的集群。这意味着,如果它是 5 个集群和另一个 5 个集群,则该函数将返回 None(无法决定)。
【问题讨论】:
-
顺便说一下,这个问题似乎很模糊,除非我们有办法说一个集群比另一个更适合。例如,如果我们有一个节点
<blockquote> ... </blockquote>具有相当高的单词密度foo。该节点位于另一个 div 中,如下所示:<div> <blockquote> ... </blockquote> foo foo foo</div>。我们应该选择哪个节点?块引用还是 div?
标签: python html dom html-parsing cluster-analysis