Сначала ознакомьтесь с лексическим анализом и узнайте, как написать спецификацию генератора сканера. Прочтите введение в использование таких инструментов, как YACC, Lex, Bison или мой любимый JFlex. Здесь вы определяете, что представляет собой токен. Здесь вы узнаете, как создать токенизатор.
Далее у вас есть то, что называется начальным списком. Противоположность стоп-списку обычно называют стартовым списком или ограниченной лексикой. Лексикон также был бы полезен для изучения. Часть приложения должна загрузить стартовый список в память, чтобы его можно было быстро запросить. Типичный способ хранения - это файл с одним словом в строке, а затем один раз прочитать его в начале приложения в виде карты. Возможно, вы захотите узнать о концепции хеширования.
Отсюда вы хотите подумать об основном алгоритме и структурах данных, необходимых для хранения результата. Распределение легко представляется в виде двумерного разреженного массива. Изучите основы разреженной матрицы. Вам не нужно 6 месяцев линейной алгебры, чтобы понять, что она делает.
Поскольку вы работаете с большими файлами, я бы выступил за потоковый подход. Не читайте весь файл в память. Прочитайте его как поток в токенизатор, который создает поток токенов.
В следующей части алгоритма подумайте о том, как преобразовать список токенов в список, содержащий только те слова, которые вы хотите. Если подумать, список находится в памяти и может быть очень большим, поэтому лучше отфильтровать не начальные слова в начале. Поэтому в критической точке, когда вы получаете новый токен от токенайзера и, прежде чем добавить его в список токенов, выполните поиск в списке начальных слов в памяти, чтобы увидеть, является ли слово стартовым словом. Если это так, сохраните его в списке выходных токенов. В противном случае игнорируйте его и переходите к следующему токену, пока не будет прочитан весь файл.
Теперь у вас есть список токенов, представляющих интерес. Дело в том, что вы не смотрите на другие показатели индексации, такие как положение, регистр и контекст. Следовательно, вам действительно не нужен список всех токенов. Вы действительно просто хотите разреженную матрицу отдельных токенов с соответствующими счетами.
Итак, сначала создайте пустую разреженную матрицу. Затем подумайте о вставке обнаруженного токена во время синтаксического анализа. Когда это произойдет, увеличьте его счетчик, если он есть в списке, или вставьте новый токен со счетчиком 1. На этот раз в конце синтаксического анализа файла вы получите список различных токенов, каждый из которых имеет частоту, по крайней мере 1.
Этот список теперь в памяти, и вы можете делать все, что захотите. Выгрузка его в файл CSV будет тривиальным процессом итерации по записям и записи каждой записи в каждой строке с ее счетом.
В этом отношении обратите внимание на некоммерческий продукт под названием «GATE» или коммерческий продукт, такой как TextAnalyst, или продукты, перечисленные в http://textanalysis.info