Задать вопрос
@deleted-zenshot

Алгоритмический вопрос от будущего C#.NET-джуниора. С чего начать исследование?

Приветствую вас друзья.

Изучаю C# по книге Эндрю Троелсена. В данный момент вышел на уровень полного понимания того, о чём пишет автор. Так что чувствую в себе силы приступить к написанию своей первой программы на C#.

Придумал себе такую задачу-исследование:

Исследовать 100 английских книг, сгруппированных в 10 различных тематик.

Задача

Определить самые часто-используемые слова:

  1. Во всех 100 книгах.
  2. В каждой из 10 тематик.

Программу планирую написать универсальную, удобную, и так далее.

К реализации общих моментов (проектирование, отображение данных, хранение данных и т. д.) у меня особых вопросов нет. Интуитивно я понимаю, как нужно действовать. Троелсен подобные моменты хорошо разобрал.

А вот в плане реализации самого алгоритма у меня огромный ступор. Чтобы понять с чего начать, как действовать и в каком направлении двигаться, я решил поступить следующим образом:

  1. Упростить задачу.
  2. Задать вопросы знатокам, чтобы получить хотя бы примерный план действий.

Упрощённая задача

Подсчитать частоту вхождения каждого слова (и его вариаций) в большом текстовом документе.

Исходные данные:

Текстовый документ (книга). Количество слов в документе может доходить до нескольких сотен тысяч. Например, в книге "Pro C# 5.0 and the .NET 4.5 Framework (Andrew Troelsen)" примерно 433 000 слов.

Что нужно сделать:

Подсчитать количество вхождений в документ:

  1. Каждого слова.
  2. Каждой группы однокоренных слов.

Пример группы однокоренных слов:

follow
followed
follower
followers
following
followership

Вопросы знатокам:

С чего начать? Как подступиться к решению этой задачи? В каких направлениях копать?

Кто-то сможет описать хотя бы примерный алгоритм?
  • Вопрос задан
  • 4044 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
lam0x86
@lam0x86
Последовательность действий такая:
1) разбиение текста на лексические единицы (в вашем случае значимыми единицами являются слова). Удобно на выходе получать IEnumerable, представляющий ленивый итератор по словам в тексте.
2) приведение слова к нормальной форме, т. е. к нижнему регистру и, опционально, к общей словоформе (например, для существительных - им. падеж, ед. число, и т.д.)
3) добавление слова в Dictionary, где ключом является само слово, а значением - счётчик:
int count;
dictionary.TryGetValue(word, out count);
dictionary[word] = count + 1;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
viktorvsk
@viktorvsk
Зачем однокоренные слова? Вы будете считать, что follow и followership - одинаковые слова? Тогда можете взять что-нибудь готовое из fuzzy matching, например. Или, если хочется по алгоритмам - самому реализовать нахождение расстояние Левенштейна, или что-то похожее простое.

Но, как по мне, логичнее было бы сначала посторить по непосредственным словам (в книге X слово follow употребляется 123,234 раз)

И так на каждое слово. А уже потом, на основании этих данных, придумать новую задачу. Например, найти самый часто употребляемый корень.
Ответ написан
@pro100saniok
Автору респект. Я сам думал чтобы реализовать что-то похожое, думаю такая программа очень будет помогать тем людям у которых с английским не очень. Например ты хочешь прочитать какую то книгу, но словарный запас еще мал, выучиваешь незнакомые наиболее используемые слова(для легкости изучения их например можно додать в словарь lingualeo.com), и вперед читать=) Еще вопрос ко всем, есть ли готовое решения данной задачи? Заранее благодарен!
Ответ написан
Комментировать
ArthurGurinovich
@ArthurGurinovich
Ответ написан
Комментировать
@Espleth
Так как вы ищите конкретно слова, это не совсем поиск подстроки в строке. Вам не нужен будет оставшийся кусок слова, если оно уже не совпадает. И часть символов, такие как пробелы и знаки препинания, у вас не участвуют в сравнении.
Но вообще можете погуглить поиск подстроки в строке, алгоритмов много. Например алгоритм Кнута-Морриса-Пратта, или алгоритм Бойера-Мура.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы