Поиск коллокаций
- Возьмите большой русский текст.
- Токенизируйте его.
- Сразу удалите частотные слова, для этого вы можете воспользоваться встроенным в NLTK словарём стоп-слов:
import nltk nltk.download('stopwords') # Это делается один раз после установки nltk from nltk.corpus import stopwords russian_stop_words = stopwords.words('russian') # посмотрим, какие есть стоп-слова print(russian_stop_words) # для проверки конкретного слова print("он" in russian_stop_words)
- Инициализируем поисковик коллокаций:
from nltk.collocations import BigramCollocationFinder finder = BigramCollocationFinder.from_words(перечисление слов)
- Отфильтровываем редкие пары с помощью
finder.apply_freq_filter(3)
, это запрещает искать коллокации из пар, которые встречаются реже, чем 3 раза. - Получаем доступ к различным метрикам оценки коллокаций:
from nltk.collocations import BigramAssocMeasures bigram_measures = BigramAssocMeasures()
А вот и перечисление, какие бывают метрики. Сначала таблица, которую мы рисовали в конспекте:
w1 ~w1 ------ ------ w2 | n_ii | n_oi | = n_xi ------ ------ ~w2 | n_io | n_oo | ------ ------ = n_ix TOTAL = n_xx
метрика формула phi_sq $\frac{(n_{ii}n_{oo} - n_{io}n_{oi})^2}{ (n_{ii} + n_{io})(n_{ii} + n_{oi})(n_{io} + n_{oo})(n_{oi} + n_{oo}) }$ chi_sq потом впишем fisher потом впишем dice $\frac{2n_{ii}}{n_{ix} + n_{xi}}$ raw_freq $\frac{n_{ii}}{n_{xx}}$ student_t $\frac{n_{ii} - \frac{n_{ix}n_{xi}}{n_{xx}} }{\sqrt{n_{ii} + 10^{-20}}}$ mi_like $\frac{n_{ii}^3}{n_{ix}n_{xi}}$ pmi $\log_2(n_{ii}n_{xx}) - \log_2(n_{ix}n_{xi})$ likelihood_ratio потом впишем poisson_stirling $n_{ii}(\log_2(\frac{n_{ii}}{ n_{ix}n_{xi}/n_{xx}}) - 1)$ jaccard $\frac{n_{ii}}{n_{ii} + n_{oi} + n_{io}}$ Чтобы посчитать коллокации по определенной метрике, пишите
finder.score_ngrams(bigram_measures.raw_freq) # для метрики raw_freq
Вы получите пары из фраз и их оценок, из них нужно отобрать первые 50.
Используйте три метрики: dice и еще две, какие понравятся. Если есть силы, и умение написать цикл, который перебирает все метрики, проверьте все.
-
Создайте по два CSV файла на каждую метрику. В первом файле коллокации ищутся в исходной форме, во втором файле перед поиском коллокаций слова приводятся в начальную форму с помощью pymorphy.
В CSV файл нужно вывести по строчке на каждую коллокацию, два столбика на слова, последний столбик на значение метрики. Значения разделяются точкой с запятой. Например:
крепкий;чай;0.54234 крепкий;хозяйственник;0.444 ответственный;исполнитель;0.225
Откройте файлы в Excel или другом табличном редакторе. Какая метрика нашла более интересные коллокации в вашем тексте?
Пример кода для вывода в файл:
with open("a.csv", mode="w", encoding="utf8") as f: print("hello", file=f) # или f.write("hello\n")
- Вместо CSV файлов можно вывести данные в pandas-таблицах.