2013-03-12 2 views
1

Я использую scikit-learn для извлечения текстовых функций из текста «мешок слов» (текст, обозначаемый на отдельных словах). Для этого я использую TfidfVectorizer, чтобы уменьшить вес очень частых слов (например: «a», «the» и т. Д.).Связывание текстовых функций с их значением tfidf

text = 'Some text, with a lot of words...' 
tfidf_vectorizer = TfidfVectorizer(
    min_df=1, # min count for relevant vocabulary 
    max_features=4000, # maximum number of features 
    strip_accents='unicode', # replace all accented unicode char 
    # by their corresponding ASCII char 
    analyzer='word', # features made of words 
    token_pattern=r'\w{4,}', # tokenize only words of 4+ chars 
    ngram_range=(1, 1), # features made of a single tokens 
    use_idf=True, # enable inverse-document-frequency reweighting 
    smooth_idf=True, # prevents zero division for unseen words 
    sublinear_tf=False) 

# vectorize and re-weight 
desc_vect = tfidf_vectorizer.fit_transform([text]) 

Теперь я хотел бы, чтобы иметь возможность соединить каждую предсказанную функцию с его соответствующим tfidf значение с плавающей точкой, хранить его в Словаре

{'feature1:' tfidf1, 'feature2': tfidf2, ...} 

я достиг его с помощью

d = dict(zip(tfidf_vectorizer.get_feature_names(), desc_vect.data)) 

Хотелось бы узнать, есть ли лучший способ научиться чему-то научиться.

спасибо.

ответ

5

Для одного документа это должно быть хорошо. Альтернатива, которая работает, когда набор документов мал, равен this recipe of mine, который использует Pandas.

Если вы хотите сделать это для нескольких документов, то вы можете адаптировать код в DictVectorizer.inverse_transform:

desc_vect = desc_vect.tocsr() 

n_docs = desc_vect.shape[0] 
tfidftables = [{} for _ in xrange(n_docs)] 
terms = tfidf_vectorizer.get_feature_names() 

for i, j in zip(*desc_vect.nonzero()): 
    tfidftables[i][terms[j]] = X[i, j] 
+0

Большое спасибо за ваш ответ. –

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