2016-11-22 5 views
0

У меня есть текстовое тело с 5 документами, каждый документ разделяется между собой/n. Я хочу предоставить идентификатор каждому слову в документе и рассчитать его соответствующую оценку tfidf. к примеру, предположим, что у нас есть текстовый корпус под названием «corpus.txt» следующим образом: -преобразование текстового документа в текстовый документ с помощью словаря vocabulary_id и соответствующего tfidf

«Стек над потоком текста векторизации scikit питон SciPy разреженный ЦСР» при расчете tfidf с использованием

mylist =list("corpus.text") 
vectorizer= CountVectorizer 
x_counts = vectorizer_train.fit_transform(mylist) 
tfidf_transformer = TfidfTransformer() 
x_tfidf = tfidf_transformer.fit_transform(x_counts) 

выход

(0,12) 0.1234 #for 1st document 
(1,8) 0.3456 #for 2nd document 
(1,4) 0.8976 
(2,15) 0.6754 #for third document 
(2,14) 0.2389 
(2,3) 0.7823 
(3,11) 0.9897 #for fourth document 
(3,13) 0.8213 
(3,5) 0.7722 
(3,6) 0.2211 
(4,7) 0.1100 # for fifth document 
(4,10) 0.6690 
(4,2) 0.0912 
(4,9) 0.2345 
(4,1) 0.1234 

я преобразовал эту scipy.sparse.csr матрицу в список списков, чтобы удалить идентификатор документа, а также к eeping только vocabulary_id и его соответствующий tfidf счета с помощью:

m = x_tfidf.tocoo() 
mydata = {k: v for k, v in zip(m.col, m.data)} 
key_val_pairs = [str(k) + ":" + str(v) for k, v in mydata.items()] 

, но проблема в том, что я получаю выход, где vocabulary_id и его соответствующая tfidf оценки расположена в возрастающем порядке и без каких-либо ссылок на документ.

Например, для приведенного выше корпуса мой выходной ток (I сбросили в текстовый файл с помощью JSON) выглядит следующим образом:

1:0.1234 
2:0.0912 
3:0.7823 
4:0.8976 
5:0.7722 
6:0.2211 
7:0.1100 
8:0.3456 
9:0.2345 
10:0.6690 
11:0.9897 
12:0.1234 
13:0.8213 
14:0.2389 
15:0.6754 

тогда я бы хочу, чтобы мой текстовый файл, чтобы быть как выглядит следующим образом:

12:0.1234 
8:0.3456 4:0.8976 
15:0.1234 14:0.2389 3:0.7823 
11:0.9897 13:0.8213 5:0.7722 6:0.2211 
7:0.1100 10:0.6690 2:0.0912 9:0.2345 1:0.1234 

любая идея как это сделать?

+0

I ответили на ваш вопрос, надеюсь, он будет Ты! –

ответ

1

Я думаю, это то, что вам нужно. Здесь corpus представляет собой набор документов.

from sklearn.feature_extraction.text import TfidfVectorizer 
corpus = ["stack over flow stack over flow text vectorization scikit", "stack over flow"] 

vectorizer = TfidfVectorizer() 
x = vectorizer.fit_transform(corpus) # corpus is a collection of documents 

print(vectorizer.vocabulary_) # vocabulary terms and their index 
print(x) # tf-idf weights for each terms belong to a particular document 

Это печатает:

{'vectorization': 5, 'text': 4, 'over': 1, 'flow': 0, 'stack': 3, 'scikit': 2} 
    (0, 2) 0.33195438857 # first document, word = scikit 
    (0, 5) 0.33195438857 # word = vectorization 
    (0, 4) 0.33195438857 # word = text 
    (0, 0) 0.472376562969 # word = flow 
    (0, 1) 0.472376562969 # word = over 
    (0, 3) 0.472376562969 # word = stack 
    (1, 0) 0.57735026919 # second document 
    (1, 1) 0.57735026919 
    (1, 3) 0.57735026919 

Из этой информации, вы можете представлять документы в нужном Вам, как следующее:

cx = x.tocoo() 
doc_id = -1 
for i,j,v in zip(cx.row, cx.col, cx.data): 
    if doc_id == -1: 
     print(str(j) + ':' + "{:.4f}".format(v), end=' ') 
    else: 
     if doc_id != i: 
      print() 
     print(str(j) + ':' + "{:.4f}".format(v), end=' ') 
    doc_id = i 

Печатается:

2:0.3320 5:0.3320 4:0.3320 0:0.4724 1:0.4724 3:0.4724 
0:0.5774 1:0.5774 3:0.5774 
+0

Здравствуйте, Извините за поздний ответ. Ваше решение - именно то, что мне нужно. Я хотел спросить, хочу ли я, чтобы результат сортировался, как мне это сделать? – Saurabh

 Смежные вопросы

  • Нет связанных вопросов^_^