считая 1 слово, 2 слова и 3 словосочетания вхождений на веб-странице в C # /. NET - PullRequest
1 голос
/ 12 ноября 2011

Я собираюсь написать программу, которая берет URL и подсчитывает вхождения КАЖДЫХ отдельных фраз, состоящих из 1, 2 или 3 слов, на веб-странице (и, возможно, фраз из x слов).

Вот лучший алгоритм, который я мог придумать:

1). полосы HTML-теги

2) сделать все строчными

3) разбить текст на пробел и поместить их все в массив

4) перебирать каждое слово, и для каждого слова вы должны: поместить слово [i], слово [i + 1], слово [i + 2] в хеш-таблицу.

Каждый раз, когда у вас возникает коллизия, вы увеличиваете количество слов для этого слова или 2-3 буквенных словосочетания.

Мои вопросы:

1) Может ли кто-нибудь предложить более эффективные решения с точки зрения пространства и времени выполнения?

2) Есть ли простые способы сделать № 1 в C #?
Возможно, я смогу использовать dom-парсер и разобрать весь внутренний текст.

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

В зависимости от вашего случая, вы, возможно, слишком упрощаете проблему и / или можете приложить немало усилий для реализации функциональных возможностей, которые уже существуют в некоторых библиотеках. Так что это будет не прямой ответ, а предложение о том, какой путь выбрать для решения этой проблемы.

Процесс, который вы хотите реализовать, называется поиск информации . Он очень широкий и сложный, но, к счастью, в этой области много исследований. Часть этого извлекает слово нграмм (нграм - это набор последовательных букв или слов в последовательности).

Позвольте мне показать вам некоторые дополнительные проблемы, о которых вам следует подумать заранее:

  • важна ли заглавная буква в слове?
  • является ли точка единственным знаком, который Вы хотите использовать для обозначения конца предложения?
  • Вы хотите исключить стоп-слов ? Стоп-слова - это слова, которые вы не хотите включать в такие фразы, как «а», «the», «я», «мой» и т. Д.
  • Вы хотите стволовых слов? Преобразуйте слова из их первоначальной формы в их корень, как во множественном числе, в форму единственного числа: баскетбол -> баскетбол

И для извлечения чистого текста из HTML:

  • извлечь только текст, показанный на странице?
  • извлекать подсказки также? (как показано при наведении мышки на картинку)
  • Любой другой невидимый текст (метатег и т. Д.)

Существуют библиотеки, которые выполняют поиск и извлечение информации из сырья. «Сырье» означает, что Вам нужно обработать документ (html, doc, pdf, image, ...) и превратить его в текст, чтобы поисковая система могла его проиндексировать (например, извлечь фразы). Как только документ проиндексирован, его можно искать. Одной из таких библиотек для .NET является Lucene.NET . Поддерживаются разные стеммеры, анализаторы, фильтры.

Я не уверен, но я считаю, что есть библиотеки для извлечения текста из html.

По сути, ваш подход может работать в некоторых более простых сценариях, где допустим не столь маленький уровень ошибок. Недавно я заинтересовался поиском информации и нашел ее действительно сложной и интересной. Вы можете получить пользу от изучения этой темы в зависимости от ваших целей. Здесь много информации о стековом потоке, а также об остальном Интернете.

И если вы решите пойти по этому пути, гораздо больше информации о Lucene (оригинальная версия Lucene JAVA, Lucene.NET - это порт для .NET), чем о Lucene.NET. Поэтому, если Вы не нашли ответа на Lucene.NET, немедленно выполните поиск по обсуждению Lucene.

1 голос
/ 12 ноября 2011

Чтобы ответить на ваш вопрос №2.

HtmlDocument doc = WebBrowser1.Document;
string text = doc.GetInnerText();

Если вы хотите сделать его более эффективным - используйте суффикс три (возможно, вам придется написать свой собственный)

http://en.wikipedia.org/wiki/Suffix_trie

Три-суффикс в основном делает поиск в строках зависимым от длины строки, а не от длины массива. Это то, что они используют в поисковых системах.

...