【问题标题】:Find an HTML element which contains the largest number of mentions of given word查找包含给定单词提及次数最多的 HTML 元素
【发布时间】: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 树并返回我 &lt;blockquote&gt; 元素,因为它包含最大密度的 foo 提及,并且它是最接近的包装器。

第一个&lt;p&gt; 包含foo 3 次,&lt;b&gt; 只包含一次,内部&lt;p&gt;s 包含foo 3 次,两次又两次,@ 987654328@ 只有一次。但是&lt;blockquote&gt; 包含 foo 4 次。 &lt;div&gt; 也是如此,但它不是最接近的包装器。 &lt;body&gt; 元素的提及次数最多,但它在集群中过于稀疏。

没有聚类的直接实现总是会给我&lt;html&gt;&lt;body&gt; 或类似的东西,因为这些元素总是有最多的请求提及,并且可能是最接近它们的包装器。但是,我需要使用最大集群的东西,因为我只对网页中单词密度最高的部分感兴趣。

解析部分我不是很好奇,beautifulsoup4或者其他库可以很好的解决。我想知道一种有效的算法来进行聚类。我用谷歌搜索了一段时间,我认为scipy 中的clustering package 可能会有所帮助,但我不知道如何使用它。谁能推荐我最好的解决方案并将我踢向正确的方向?示例将非常棒。


嗯,一般来说很难回答这样的问题,因为正如你所指出的,条件很模糊。所以,更具体地说:

通常,文档可能只包含一个这样的集群。我的目的是找到这样的集群并获得它的包装器,以便我可以使用它进行操作。这个词也可以在页面的其他地方提到,但我正在寻找一个值得注意的这样的词集群。如果有两个或更多值得注意的集群,那么我必须使用外部偏见来决定(检查标题、页面标题等)。集群引人注目是什么意思?这正是我刚才介绍的意思——没有“严肃”的竞争对手。如果竞争对手是认真的或不认真的,我可以提供一些数字(比率),例如如果有 10 个集群和 2 个集群,则差异将是 80%。我可以说,如果有一个差异大于 50% 的集群,那将是值得注意的集群。这意味着,如果它是 5 个集群和另一个 5 个集群,则该函数将返回 None(无法决定)。

【问题讨论】:

  • 顺便说一下,这个问题似乎很模糊,除非我们有办法说一个集群比另一个更适合。例如,如果我们有一个节点&lt;blockquote&gt; ... &lt;/blockquote&gt; 具有相当高的单词密度foo。该节点位于另一个 div 中,如下所示:&lt;div&gt; &lt;blockquote&gt; ... &lt;/blockquote&gt; foo foo foo&lt;/div&gt;。我们应该选择哪个节点?块引用还是 div?

标签: python html dom html-parsing cluster-analysis


【解决方案1】:

所以这是一种方法:

|fitness(node, word) = count of word in node text if node is a leaf
|fitness(node, word) = sum(fitness(child, word) for child in children) / 
                         count of overall elements in node tree

这里是:

import lxml.html

node = """<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></html>"""

node = lxml.html.fromstring(node)

def suitability(node, word):
    mx = [0.0, None]
    _suitability(node, word, mx)
    return mx[1]

def _suitability(node, word, mx):

    children = node.getchildren()
    sparsity = 1
    result = float(node.text_content().lower().count(word))
    for child in children:
        res, spars = _suitability(child, word, mx)
        result += res
        sparsity += spars
    result /= sparsity
    current_max, max_node = mx
    if current_max < result:
        mx[0] = result
        mx[1] = node
    return result, sparsity

print suitability(node, 'foo')

它为我们提供了最合适的块引用元素。并且通过调整 score 函数可以改变所需集群的参数。

【讨论】:

  • 返回最大值和拥有它的节点(除了结果和稀疏性之外),而不是使用输入列表参数作为隐式输出参数不是更好吗?
  • 是的,可能,但是在哪里存储这些值?作为node 属性?我以为它会很脏。
  • 除了结果和稀疏性之外,只需从_suitability 返回它们。
  • 我终于以这种方式使用了一些东西,“适用性”算法。我在一些样本数据上对其进行了测试,它就像一个魅力。它为我切掉了我想要的容器!
【解决方案2】:

所以它不是图书馆,但我有一个想法。

如果你构建你的 HTML 解析树,然后用两件事注释每个节点:

  1. 它包含的总字数。
  2. 它包含您的目标词的次数。

然后您可以在树中搜索最大化target_count / total_count 的节点。这将为您提供最小包含元素的属性,因为树中较高的元素将包含更多单词。实际上,它的作用是为您提供目标词密度最高的节点。

您可能会发现简单的除法并不能得到您想要的结果。例如,如果一个节点只包含你的目标词的一个副本,它将具有非常高的密度,但可能与你心中的集群概念不相符。在这种情况下,我将定义一些将元素中包含的单词数映射到大小的函数。如果你想确保集群具有一定的大小,并惩罚太大的集群(例如)&lt;body&gt;),可能是这样的:

def size(num_words):
   num_words = max(num_words, 40) # where 40 is the min size of a cluster
   if num_words > 1000: # This is too large, so we penalize
     num_words *= 1.5
   return num_words

现在你可以使用target_count / size(total_count)

回复:scipy 聚类

这种聚类适用于向量。所以,为了使用这个包,你需要想出一种将目标词的出现转化为向量的方法。我想不出一个好的方法来做到这一点,但这并不意味着不存在这样的方法。

【讨论】:

    【解决方案3】:

    聚类包不会有太大帮助,因为这不是聚类分析

    更多的是关于频繁模式挖掘,你可能想研究一下。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2021-12-16
      • 2018-09-23
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多