Gensim фразы не найти биграммы - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу получить биграммы для символов (букв слов). Например, для слов «готово» и «собака» я хочу найти биграм «до».

Я пытался сделать это с помощью gensim.Phrases, но у меня это не работает.

Вот мой код:

from gensim.models import Phrases

documents = ["God", "Good","happy","hangry","pypi"]
documents_proc = [list(doc) for doc in documents]

bigram = Phrases(documents_proc, min_count=1)
trigram = Phrases(bigram[documents_proc], min_count=1)

for sent in documents_proc:
    print(sent, bigram[sent])
    bigrams_ = [b for b in bigram[sent] if b.count('_') == 1]
    trigrams_ = [t for t in trigram[bigram[sent]] if t.count('_') == 2]
    print(bigrams_)
    print(trigrams_)
    print()

Я ожидал выхода ['Go', 'od', 'ha', 'py'], но на выходе ничего нет. Что я делаю неправильно?

Спасибо.

1 Ответ

1 голос
/ 28 апреля 2019

Класс 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'.

...