Первая часть вашего вопроса звучит не так уж плохо. Все, что вам в основном нужно сделать, это прочитать каждое слово из файла (или потока w / e) и поместить его в дерево префиксов, и каждый раз, когда вы встречаетесь с уже существующим словом, вы увеличиваете значение, связанное с ним. Конечно, у вас также будет список игнорирования всего, что вы хотели бы исключить из своих расчетов.
Если вы используете дерево префиксов, вы гарантируете, что найти любое слово будет O (N), где N - максимальная длина слова в вашем наборе данных. Преимущество префиксного дерева в этой ситуации состоит в том, что если вы хотите искать множественное число и основание, вы можете проверить в O (M + 1), возможно ли это для слова, где M - длина слова без основы или множества (это слово? хе-хе). После того, как вы построите свое дерево префиксов, я бы повторно проанализировал его на предмет основ и тому подобного и сжал его так, чтобы корневое слово было тем, что содержит результаты.
После поиска у вас могут быть некоторые простые правила, чтобы совпадение возвращалось положительным в случае корня или стебля или чего-то еще.
Вторая часть кажется чрезвычайно сложной. Моя наивная склонность состояла бы в том, чтобы держать отдельные результаты для групп прилагательного-предмета. Используйте те же принципы, что и выше, но просто держите их отдельно.
Другим вариантом семантического анализа может быть моделирование каждого предложения в виде дерева отношений субъекта, глагола и т. Д. (У предложения есть субъект и глагол, у субъекта есть существительное и прилагательное и т. Д.). После того, как вы разбили весь свой текст таким образом, может показаться, что вам будет довольно просто пробежаться и быстро подсчитать, какие произошли соответствующие пары.
Просто некоторые разговоры, я уверен, что есть лучшие идеи, но мне нравится думать об этом.