9

gensim を使用して LDA トピック モデリング用のコーパスをトレーニングしました。

gensim ウェブサイトのチュートリアル (これはコード全体ではありません):

question = 'Changelog generation from Github issues?';

temp = question.lower()
for i in range(len(punctuation_string)):
    temp = temp.replace(punctuation_string[i], '')

words = re.findall(r'\w+', temp, flags = re.UNICODE | re.LOCALE)
important_words = []
important_words = filter(lambda x: x not in stoplist, words)
print important_words
dictionary = corpora.Dictionary.load('questions.dict')
ques_vec = []
ques_vec = dictionary.doc2bow(important_words)
print dictionary
print ques_vec
print lda[ques_vec]

これは私が得る出力です:

['changelog', 'generation', 'github', 'issues']
Dictionary(15791 unique tokens)
[(514, 1), (3625, 1), (3626, 1), (3627, 1)]
[(4, 0.20400000000000032), (11, 0.20400000000000032), (19, 0.20263215848547525), (29, 0.20536784151452539)]

question最後の出力が、 !!!の可能なトピックを見つけるのにどのように役立つかわかりません。

助けてください!

4

3 に答える 3

7

新しいクエリの可能なトピックを与える関数をPythonで作成しました。

def getTopicForQuery (question):
    temp = question.lower()
    for i in range(len(punctuation_string)):
        temp = temp.replace(punctuation_string[i], '')

    words = re.findall(r'\w+', temp, flags = re.UNICODE | re.LOCALE)

    important_words = []
    important_words = filter(lambda x: x not in stoplist, words)

    dictionary = corpora.Dictionary.load('questions.dict')

    ques_vec = []
    ques_vec = dictionary.doc2bow(important_words)

    topic_vec = []
    topic_vec = lda[ques_vec]

    word_count_array = numpy.empty((len(topic_vec), 2), dtype = numpy.object)
    for i in range(len(topic_vec)):
        word_count_array[i, 0] = topic_vec[i][0]
        word_count_array[i, 1] = topic_vec[i][1]

    idx = numpy.argsort(word_count_array[:, 1])
    idx = idx[::-1]
    word_count_array = word_count_array[idx]

    final = []
    final = lda.print_topic(word_count_array[0, 0], 1)

    question_topic = final.split('*') ## as format is like "probability * topic"

    return question_topic[1]

これを行う前に、このリンクを参照してください。

コードの最初の部分では、ストップ ワードや不要な句読点を削除できるように、クエリが前処理されています。

次に、独自のデータベースを使用して作成された辞書がロードされます。

次に、新しいクエリのトークンを単語の袋に変換し、上記のリンクで説明されているように、訓練されたモデルのtopic_vec = lda[ques_vec]場所によってクエリのトピック確率分布が計算されます。lda

次に、分布はトピックの確率でソートされます。最も確率の高いトピックが で表示されquestion_topic[1]ます。

于 2013-04-30T13:41:25.233 に答える
4

次のコード スニペットの可能性が最も高いトピックだけが必要であると仮定すると、役立つ場合があります。

def findTopic(testObj, dictionary):
    text_corpus = []
    '''
     For each query ( document in the test file) , tokenize the 
     query, create a feature vector just like how it was done while training
     and create text_corpus
    '''
    for query in testObj:
        temp_doc = tokenize(query.strip())
        current_doc = []

        for word in range(len(temp_doc)):
            if temp_doc[word][0] not in stoplist and temp_doc[word][1] == 'NN':
                current_doc.append(temp_doc[word][0])

        text_corpus.append(current_doc)
    '''
     For each feature vector text, lda[doc_bow] gives the topic
     distribution, which can be sorted in descending order to print the 
     very first topic
    ''' 
    for text in text_corpus:
        doc_bow = dictionary.doc2bow(text)
        print text
        topics = sorted(lda[doc_bow],key=lambda x:x[1],reverse=True)
        print(topics)
        print(topics[0][0])

トークン化関数は、句読点/ドメイン固有の文字を削除してフィルター処理し、トークンのリストを提供します。ここでは、トレーニングで作成された辞書が関数のパラメーターとして渡されますが、ファイルから読み込むこともできます。

于 2016-06-18T05:00:52.157 に答える
1

基本的に、Anjmesh Pandey は良いサンプル コードを提案しました。ただし、トピック内で確率が最も高い最初の単語が、そのトピックだけを表しているとは限りません。クラスター化されたトピックには、最も頻繁に発生する単語を他のトピックと共有しているトピックがいくつかある場合があるためです。したがって、クエリに最も近いトピックのインデックスを返すだけで十分です。

topic_id = sorted(lda[ques_vec], key=lambda (index, score): -score)

ques_vec の変換により、トピックごとのアイデアが得られます。次に、トピックに主に貢献しているいくつかの単語をチェックして、ラベルのないトピックが何であるかを理解しようとします。

latent_topic_words = map(lambda (score, word):word lda.show_topic(topic_id))

show_topic() メソッドは、トピックに貢献している各単語のスコアで降順にソートされたタプルのリストを返します。これらの単語を重みでチェックすることで、潜在的なトピックを大まかに理解できます。

于 2015-03-23T19:07:16.027 に答える