Фразы Gensim не находят некоторые биграммы

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

Я пытался сделать это с помощью 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'], но в выводе ничего нет. Что я делаю не так?

Спасибо.


person Tatsiana Mihailova    schedule 28.04.2019    source источник


Ответы (1)


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

person gojomo    schedule 28.04.2019
comment
Это все объясняет. Я только что попробовал разные значения порога, и он начал работать в моем реальном случае. Большое спасибо! - person Tatsiana Mihailova; 28.04.2019
comment
Есть ли способ обучить экстрактор фраз, а затем заставить его добавить в него несколько выбранных вручную биграмм? - person user_1177868; 06.04.2021
comment
Чтобы узнать, как принудительно добавить нужные фразы, см. обсуждение и последнее обновление в этом другом соответствующем ответе: stackoverflow.com/a/ 45806582/130288 - person gojomo; 06.04.2021