Восстановление оригинального термина doc-id в sci-kit tfidf Vectorizer

Я использую tdidf vectorizer в sci-kit learn, чтобы вычислить значения td-idf для обзоров разных фильмов. Я успешно внедрил код, но теперь пытаюсь его усовершенствовать, чтобы оптимизировать вывод. При этом я хотел бы включить в свой вывод CSV информацию об исходном movie или документе, к которому относится каждый термин.

Чтобы решить эту проблему, я уже посмотрел здесь и здесь для вдохновения без каких-либо успехов.

Для этого я пытаюсь восстановить идентификатор документа или идентификатор строки в моей плотной матрице td-idf. Очень важно, чтобы я знал, к какому документу относятся термины, которые я оцениваю.

В настоящее время я пробовал

counter = 0
corpus = []
key = {}
for id, movie in sorted(movies.iteritems(), key=lambda t: int(t[0])):
    corpus.append(movie)
    key[id] = counter
    counter+=1

tf = TfidfVectorizer(analyzer='word', ngram_range=(1,1), min_df = 0)
tfidf_matrix =  tf.fit_transform(corpus)
feature_names = tf.get_feature_names()

def get_doc_row(docid):
    rowid = key[docid]
    row = tf[rowid,:]
    return row

при построении моего вывода следующим образом я не уверен, как связать row с word, чтобы иметь правильный идентификатор для movie в моем CSV:

with open("output.csv", "w") as file:
    writer = csv.writer(file, delimiter=",")
    writer.writerow(["Col1", "Col2", "Col3", "Col4"])

    word_list = "words.txt"
    word_dict = {}
    with open(word_list) as f:
        for line in f:
            depurated_line = line.rstrip()
            (key, val) = depurated_line.split("\t")
            word_dict[key] = val

    doc_id = 0
    for doc in tfidf_matrix.todense():
        word_id = 0
        for score in doc.tolist()[0]:
            if score > 0:
                word = feature_names[word_id].encode("utf-8")
                wordPosish = row(word)
                print wordPosish
                if word in word_dict:
                    scoreWeight = score * 100
                    writer.writerow([doc_id+1, word.decode("utf-8"), scoreWeight, word_dict[word]])
            word_id +=1
        doc_id +=1

В настоящее время порядок doc_id, который у меня есть, не соответствует порядку ввода документов в систему, поэтому важно, чтобы я нашел способ как-то восстановить эту информацию, чтобы включить ее в вывод.

Есть ли конкретное место, куда я должен включить row, определенное выше, чтобы восстановить конкретное doc, к которому изначально относилось это слово?


person loropro    schedule 16.12.2015    source источник


Ответы (1)


Мне удалось решить эту проблему, создав еще один словарь, который связывает docID с текстом перед преобразованием этих данных в матрицу.

Затем я смог связать в своем выводе отдельное слово с его исходным документом.

Это код, который я реализовал, я все еще запускаю тесты, но, похоже, проблема решена.

idTracker = {}
idCounter = 1
for id, movie in movies.iteritems():
    corpus.append(movie)
    idTracker[idCounter] = id
    idCounter +=1
person loropro    schedule 17.12.2015