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回、 1回<b>
だけ、内部<p>
はfooを3回、2回と2回、 1回だけ含みます<strong>
。しかし、 fooは4回<blockquote>
含まれています。もそうですが、これは最も近いラッパーではありません。この要素は言及の数が最も多いですが、クラスターがまばらすぎます。<div>
<body>
クラスタリングを使用しない単純な実装では、常に<html>
または<body>
そのようなものが得られます。これは、そのような要素には常に要求された言及の数が最も多く、おそらくそれらに最も近いラッパーであるためです。ただし、単語の密度が最も高いWebページの部分にのみ関心があるため、最大のクラスターを取得するものが必要です。
私は構文解析の部分についてはあまり興味がありません。それはbeautifulsoup4
または他のライブラリによってうまく解決される可能性があります。クラスタリングを行うための効率的なアルゴリズムについて疑問に思っています。しばらくググってみたら、クラスタリングパッケージがscipy
役立つと思いますが、使い方がわかりません。誰かが私に最善の解決策を勧めて、私を正しい方向に追いやることができますか?例は完全に素晴らしいでしょう。
さて、ご指摘のとおり、条件が曖昧なので、一般的にそのような質問に答えるのは難しいでしょう。したがって、より具体的には:
通常、ドキュメントにはそのようなクラスターが1つだけ含まれます。私の意図は、そのようなクラスターを見つけてラッパーを取得し、それを操作できるようにすることです。この言葉はページの他の場所でも言及されている可能性がありますが、私は注目すべきものを探していますそのような言葉のクラスター。注目すべきクラスターが2つ以上ある場合は、外部バイアスを使用して決定する必要があります(ヘッダー、ページのタイトルなどを調べます)。クラスターが注目に値するというのはどういう意味ですか?それはまさに私が今提示したことを意味します-「深刻な」競争相手がいないということです。競合他社が深刻であるかどうかにかかわらず、たとえば10のクラスターと2のクラスターがある場合、その差は80%になります。差が50%を超えるクラスターがあるとしたら、それは注目に値するでしょう。つまり、5のクラスターと5のクラスターの場合、関数は戻りますNone
(決定できませんでした)。