Инициализация модели Gensim LDA с заранее определенными априорами - PullRequest
1 голос
/ 15 октября 2019

Я хотел бы создать модель LDA (т.е. экземпляр gensim.models.LdaModel), возвращающую предопределенное распределение тематических слов. Причина для этого заключается в том, что я хотел бы использовать Gensim, pyLDAvis и т. Д., Чтобы отобразить результаты в некотором распределении тематических слов, которые я получаю из других алгоритмов.

Возможно ли это? Ниже я показываю некоторый неполный код (потому что нахожу сообщество ML пугающим):

import gensim
texts=[['a','a','b'], ['a','b','c'],['b','c','c']]
d = gensim.corpora.Dictionary(texts)
bow = [d.doc2bow(doc) for doc in texts]

my_topics=[[2/3, 1/3, 0],[0, 2/3, 1/3]]
model = gensim.models.LdaModel(corpus=bow, id2word=d, num_topics=2, 
        eta=..., alpha..., passes=0, iterations=0, random_state=1)
model.show_topics(num_words=3)
# Hopefully return my_topics above
#[(0, '0.666*"a" + 0.333*"b"'),
# (1, '0.666*"b" + 0.333*"c"')]

Я надеялся достичь этого, инициализируя eta в модели LDA и устанавливая итерации равными 0. В моих попытках (непоказано) результирующие темы не совпадают с «my_topics».

Gensim docs :

eta ({float, np.array, str}, необязательно) -

A-априори вера ввероятность слова, это может быть:

    scalar for a symmetric prior over topic/word probability,
    vector of length num_words to denote an asymmetric user defined probability for each word,
    matrix of shape (num_topics, num_words) to assign a probability for each word-topic combination,
    the string ‘auto’ to learn the asymmetric prior from the data.

РЕДАКТИРОВАТЬ: Это (вызов сброса на состояние модели), кажется, работает, но я не уверен, что это теоретически имеет смысл

model = gensim.models.LdaModel(corpus=bow, id2word=d, num_topics=2, 
    eta=my_topics, alpha=1, passes=0, iterations=0, random_state=1)
model.state.reset()
model.show_topics(num_words=3)
#array([[0.6666667 , 0.33333334, 0.        ],
#   [0.        , 0.6666667 , 0.33333334]], dtype=float32)

Однако, распределение тем для данного документа не обучено, и я не думаю, что оно может поддерживать постоянные темы:

model.get_document_topics(bow[2])
model[bow[2]]
#[(0, 0.55569696), (1, 0.44430298)]
...