У меня есть документ 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>
содержат foo 3 раза, дважды и еще раз дважды, <strong>
только один раз. Но <blockquote>
содержит foo 4 раза. То же самое относится и к <div>
, но это не самая близкая оболочка. Элемент <body>
имеет наибольшее количество упоминаний, но это слишком редкий кластер.
Простая реализация без кластеризации всегда давала бы мне <html>
или <body>
или что-то в этом роде, потому что такие элементы всегда имеют наибольшее количество запрошенных упоминаний и, вероятно, являются ближайшей к ним оболочкой. Однако мне нужно что-то, что займет самый большой кластер, так как меня интересует только часть веб-страницы с наибольшей плотностью слова.
Мне не очень интересна часть синтаксического анализа, ее можно было бы решить с помощью beautifulsoup4
или других библиотек. Мне интересно узнать об эффективном алгоритме кластеризации. Я некоторое время гуглил и думаю, что пакет кластеризации в scipy
может быть полезен , но я понятия не имею, как его использовать. Может ли кто-нибудь порекомендовать мне лучшее решение и пнуть меня в правильном направлении? Примеры были бы просто потрясающими.
Ну, вообще сложно ответить на такой вопрос, потому что условия, как вы указали, расплывчаты. Итак, более конкретно:
Как правило, документ может содержать только один такой кластер. Мое намерение состоит в том, чтобы найти такой кластер и получить его оболочку, чтобы я мог манипулировать им. Это слово можно было бы упомянуть и в другом месте на странице, но я ищу заметную группу таких слов. Если есть два заметных кластера или более, то я должен использовать внешнее смещение для принятия решения (проверить заголовки, заголовок страницы и т. д.). Что значит, что кластер примечательный? Это означает именно то, что я только что представил, - отсутствие "серьезных" конкурентов. Если конкурент серьезный или нет, я могу указать некоторое число (соотношение), например. если есть кластер из 10 и кластер из 2, разница будет 80%. Я мог бы сказать, что если есть кластер с разницей более 50%, он будет заметным. Это означает, что если бы это был кластер из 5 и еще один из 5, функция вернула бы None
(не смогла решить).
<blockquote> ... </blockquote>
с достаточно высокой плотностью словfoo
. И этот узел находится внутри другого блока, например:<div> <blockquote> ... </blockquote> foo foo foo</div>
. Какой узел мы выберем? Цитата или div? - person alex_jordan   schedule 12.11.2012