2016-08-23 9 views
8

既存のコーパスに追加する機能はありますか?私はすでに行列を生成していますが、私は定期的にテーブル全体をシャンバンを再処理することなく追加するつもりですSklearnに新しいテキストを追加するTFIDIFベクトル化ツール(Python)

例:

articleList = ['here is some text blah blah','another text object', 'more foo for your bar right now'] 
tfidf_vectorizer = TfidfVectorizer(
         max_df=.8, 
         max_features=2000, 
         min_df=.05, 
         preprocessor=prep_text, 
         use_idf=True, 
         tokenizer=tokenize_text 
        ) 
tfidf_matrix = tfidf_vectorizer.fit_transform(articleList) 

#### ADDING A NEW ARTICLE TO EXISTING SET? 
bigger_tfidf_matrix = tfidf_vectorizer.fit_transform(['the last article I wanted to add']) 

答えて

6

あなたが直接あなたのvectoriserのvocabulary_属性にアクセスすることができ、そしてそれは、このような猿 - パッチ何かすることが可能であるので、あなたは、_tfidf._idf_diag経由idf_ベクトルにアクセスすることができます。

import re 
import numpy as np 
from scipy.sparse.dia import dia_matrix 
from sklearn.feature_extraction.text import TfidfVectorizer 

def partial_fit(self, X): 
    max_idx = max(self.vocabulary_.values()) 
    for a in X: 
     #update vocabulary_ 
     if self.lowercase: a = a.lower() 
     tokens = re.findall(self.token_pattern, a) 
     for w in tokens: 
      if w not in self.vocabulary_: 
       max_idx += 1 
       self.vocabulary_[w] = max_idx 

     #update idf_ 
     df = (self.n_docs + self.smooth_idf)/np.exp(self.idf_ - 1) - self.smooth_idf 
     self.n_docs += 1 
     df.resize(len(self.vocabulary_)) 
     for w in tokens: 
      df[self.vocabulary_[w]] += 1 
     idf = np.log((self.n_docs + self.smooth_idf)/(df + self.smooth_idf)) + 1 
     self._tfidf._idf_diag = dia_matrix((idf, 0), shape=(len(idf), len(idf))) 

TfidfVectorizer.partial_fit = partial_fit 
articleList = ['here is some text blah blah','another text object', 'more foo for your bar right now'] 
vec = TfidfVectorizer() 
vec.fit(articleList) 
vec.n_docs = len(articleList) 
vec.partial_fit(['the last text I wanted to add']) 
vec.transform(['the last text I wanted to add']).toarray() 

# array([[ 0.  , 0.  , 0.  , 0.  , 0.  , 
#   0.  , 0.  , 0.  , 0.  , 0.  , 
#   0.  , 0.  , 0.27448674, 0.  , 0.43003652, 
#   0.43003652, 0.43003652, 0.43003652, 0.43003652]]) 
+0

をいただき、ありがとうございます答えに時間がかかる。私はこれを検索インデックスとして使用し、関連性によって結果のリストを生成するためにcosine_similarityを使用しています。新しい文書を追加したいという願いを追加するたびに、私のコーパス全体を再調整する必要はありません。 –

+1

ちょっとハワード、私は 'idf_'を更新する方法を研究しました。私の編集した答えをチェックしてください。 – maxymoo

+0

恐ろしいです!素晴らしい応答をありがとう! –

関連する問題