LDA для тегов (gensim)

Я использую пакет Gensim для моделирования тем. Идея состоит в том, чтобы понять, какие темы указаны в тегах flickr. До сих пор я использую этот код (документ - это теги):

    texts = [[word for word in document.split(";") if word not in stoplist] for document in documents]
    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]
    lda = ldamodel.LdaModel(corpus, id2word=dictionary, alpha = 0.1, num_topics=10)
    topic = []
    for f in lda.print_topics(num_topics=4, num_words=10):
        topic_number = f[0]
        keywords = f[1]
        keywords = keywords.split(" + ")
        keywords_update = {}
        for ii in keywords:
            ii = str(ii)
            keyword = ii[6:]
            probab = ii[0:5]
            probab = float(probab)
            if probab > 0.02:
                keywords_update.update({keyword:probab})
        topic.append(keywords_update)
    print topic

По сути, я обучаю LDA работе со всеми своими документами, а затем печатаю 10 наиболее вероятных слов для каждой темы. Это правильно? Или мне нужно обучить данные в какой-то части документов, а затем использовать corpus_lda = lda [corpus], чтобы применить обученную модель к невидимым документам? Если при каждом запуске модели результаты будут разными, значит ли это, что количество тем неверное? Как лучше всего оценить результаты?


person student    schedule 03.03.2016    source источник
comment
Чтобы узнать, к каким темам относится каждый документ, вам нужно использовать lda[corpus]. Чтобы узнать, какие слова наиболее связаны с каждой темой, вы можете вывести 10 наиболее вероятных слов для каждой темы. См. здесь, где описаны другие функции, которые могут помочь вам распечатать эти вещи.   -  person interpolack    schedule 12.03.2016


Ответы (1)


Распределение вероятности невидимых документов будет меняться каждый раз, когда вы запрашиваете модель, потому что классификатор в модели использует вариант теоремы Байеса для статистический вывод. Gensim сделает большую часть работы за вас, чтобы получить лучшие слова из каждой темы.

Это вернет диктант topic_id: {слово: вероятность} с 10 основными словами каждой темы в модели.

topn_words = {i: {word: prob for word, prob in lda.show_topic(i, topn=10)} for i in range(0, lda.num_topics)}

Когда вы используете lda[unseen_document], он возвращает вектор распределения вероятностей, который представляет собой размер количества тем в модели, где каждое значение - это вероятность того, что документ вписывается в тему, соответствующую индексу вектора.

Когда у вас есть вектор распределения вероятностей для коллекции невидимых документов, вы можете вычислить сходство между ними. В Gensim встроено косинусное подобие.

bow = dictionary.doc2bow(tokenize(text))
vec_1 = lda[bow]
bow = dictionary.doc2bow(tokenize(text))
vec_2 = lda[bow]
gensim.matutils.cossim(vec_1, vec_2)

В этом примере tokenize - это придуманная функция, в которой вы либо используете встроенный метод Gensim simple_preprocess (), либо сокращаете и токенизируете текст другим способом. Метод dictionary.doc2bow () требует список слов и выводит пакет слов или список кортежей (word_id, frequency).

person Kenneth Orton    schedule 29.05.2017