做nlp的時候,如果用到tf-idf,sklearn中用countvectorizer與tfidftransformer兩個類,下面對和兩個類進行講解:
countvectorizer與tfidftransformer在處理訓練資料的時候都用fit_transform方法,在測試集用transform方法。fit包含訓練的意思,表示訓練好了去測試,如果在測試集中也用fit_transform,那顯然導致結果錯誤。
#變數:content_train 訓練集,content_test測試集
vectorizer = countvectorizer()
tfidftransformer = tfidftransformer()
#訓練 用fit_transform
count_train=vectorizer.fit_transform(content_train)
tfidf = tfidftransformer.fit_transform(count_train)
#測試count_test=vectorizer.transform(content_test)
test_tfidf = tfidftransformer.transform(count_test)
測試集的if-idf
test_weight = test_tfidf.toarray()
我們總是需要儲存tf-idf的詞典,然後計算測試集的tfidf,這裡要注意sklearn中儲存有兩種方法:pickle與joblib。我們這裡用pickle
train_content = segmentword(x_train)注意:vectorizer 與tfidftransformer都要儲存,而且只能 fit_transform 之後儲存,表示vectorizer 與tfidftransformer已經用訓練集訓練好了。test_content = segmentword(x_test)
# replace 必須加,儲存訓練集的特徵
vectorizer = countvectorizer(decode_error="replace")
tfidftransformer = tfidftransformer()
# 注意在訓練的時候必須用vectorizer.fit_transform、tfidftransformer.fit_transform
# 在**的時候必須用vectorizer.transform、tfidftransformer.transform
vec_train = vectorizer.fit_transform(train_content)
tfidf = tfidftransformer.fit_transform(vec_train)
# 儲存經過fit的vectorizer 與 經過fit的tfidftransformer,**時使用
feature_path ='models/feature.pkl'
withopen(feature_path,'wb')asfw:
pickle.dump(vectorizer.vocabulary_, fw)
tfidftransformer_path ='models/tfidftransformer.pkl'
withopen(tfidftransformer_path,'wb')asfw:
pickle.dump(tfidftransformer, fw)
# 載入特徵feature_path ='models/feature.pkl'loaded_vec = countvectorizer(decode_error="replace", vocabulary=pickle.load(open(feature_path,"rb")))
# 載入tfidftransformer
tfidftransformer_path ='models/tfidftransformer.pkl'tfidftransformer = pickle.load(open(tfidftransformer_path,"rb"))
#測試用transform,表示測試資料,為list
test_tfidf = tfidftransformer.transform(loaded_vec.transform(test_content))
# 對每條分詞後的文字表示成tf-idf向量(去除停用詞之後的案由文字)### 訓練 訓練集:train_textsvectorizer = tfidfvectorizer(stop_words=stpwrdlst,use_idf=true,smooth_idf=true)
words_sets = vectorizer.get_feature_names()
# 文字的詞彙表
print('從訓練集中提取出來的文字的詞彙表:',words_sets)
print('資料文字的詞彙表長:',len(words_sets))
train_tfidf = vectorizer.fit_transform(train_texts)
train_x = train_tfidf.toarray() # 結果是乙個矩陣形式
# train_tfidf結果是乙個tf-idf的矩陣,上面兩個返回同一矩陣
print('train_tfidf的結果形式:',train_x.shape)
### 測試 測試集:test_texts
test_tfidf = vectorizer.transform(test_texts).toarray()## 分類器訓練
clf1 = multinomialnb(alpha=0.001).fit(train_tfidf,train_y)## 分類器測試train_predicted = clf1.predict(train_tfidf)
train_predicted_proba = clf1.predict_proba(train_tfidf)
test_predicted = clf1.predict(test_tfidf)
文字向量表示及TFIDF詞彙權值
文字相似計算是進行文字聚類的基礎,和傳統結構化數值資料的聚類方法類似,文字聚類是通過計算文字之間 距離 來表示文字之間的相似度並產生聚類。文字相似度的常用計算方法 有餘弦定理和jaccard係數。但是文字資料與普通的數值資料或類屬資料不同,文字資料是一種半結構化資料,在進行文字挖掘之前必須要對文字資...
文字向量表示及TFIDF詞彙權值
文字相似計算是進行文字聚類的基礎,和傳統結構化數值資料的聚類方法類似,文字聚類是通過計算文字之間 距離 來表示文字之間的相似度並產生聚類。文字相似度的常用計算方法有餘弦定理和jaccard係數。但是文字資料與普通的數值資料或類屬資料不同,文字資料是一種半結構化資料,在進行文字挖掘之前必須要對文字資料...
TF IDF 文字的一種向量表示
tf idf是term frequency inverse document frequency的簡稱。她是一種非常常見的用於將文字轉化為有意義的數字表示的演算法。這個技術被廣泛的應用與nlp的各個方面。本文將會介紹怎樣計算和應用tf idf。為了將機器學習演算法或統計技術應用到任何形式的文字上,應...