Класс Gensim Phrases
использует простой статистический анализ, основанный на относительном числе и некоторых настраиваемых пороговых значениях, чтобы решить, какие пары токенов (обычно пары слов, а не пары символов) должны быть переведены в одну подключенную биграмму. Потенциальным парам присваивается «оценка», а те, которые набирают баллы за настраиваемый «порог», объединяются.
Даже при использовании в обычной области слов, его результаты часто не кажутся впечатляющими для человеческой оценки - пропуская много комбинаций, которые мы считаем логичными, делая другие комбинации, которые мы группируем по-другому. Но с большим количеством обучающих данных и некоторой настройкой его параметров, даже его несовершенные комбинации могут помочь моделям ниже по течению работать лучше.
Для вашего крошечного игрушечного корпуса биграммы персонажей, которых вы хотели бы видеть, не соответствуют требованиям, основанным на настройках класса по умолчанию.
Вы можете посмотреть код original_scorer()
по умолчанию для оценки потенциальных пар по адресу:
https://github.com/RaRe-Technologies/gensim/blob/460dc1cb9921817f71b40b412e11a6d413926472/gensim/models/phrases.py#L663
Вы можете запустить этот код на своей модели для одной из ожидаемых пар, чтобы увидеть ее оценку:
>>> from gensim.models.phrases import original_scorer
>>> original_scorer(bigram.vocab[b'G'], bigram.vocab[b'o'],
bigram.vocab[b'G_o'], len(bigram.vocab),
bigram.min_count, bigram.corpus_word_count)
4.666666666666666
По сравнению с bigram.threshold
по умолчанию 10.0
, этот 'G_o'
биграмм не сделает разрез.
Вы можете поработать с threshold
(или другими параметрами Phrases
), чтобы получить другие результаты, но то, какие значения / компромиссы являются лучшими, будет зависеть от ваших конечных целей. Например:
>>> bigram.threshold = 4.0
>>> list(bigram.export_phrases(documents_proc, out_delimiter=b''))
[(b'Go', 4.666666666666666),
(b'Go', 4.666666666666666),
(b'od', 4.666666666666666),
(b'ha', 7.0),
(b'ha', 7.0)]
>>> list(bigram[documents_proc])
[['G_o', 'd'],
['G_o', 'o_d'],
['h_a', 'p', 'p', 'y'],
['h_a', 'n', 'g', 'r', 'y'],
['p', 'y', 'p', 'i']]
Итак, с bigram.threshold=4.0
желаемого 'p_y'
все еще нет - так как ему потребуется еще более низкий threshold
, учитывая количество 'p'
и 'y'
.