from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
d1="a b c d"
d2="e f g h"
vectorizer = CountVectorizer(stop_words=None, token_pattern="(?u)\b\w+\b")
X = vectorizer.fit_transform([d1,d2])
r = pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names())
transformer = TfidfTransformer(smooth_idf=True)
Z = transformer.fit_transform(X)
r = pd.DataFrame(Z.toarray(),columns=vectorizer.get_feature_names())
print(r)
想把d1換成打開一個txt檔 有大神可以教教我嗎
有用d1 =open('test.txt','r',encoding='utf-8')
可是還是有錯誤
另外一個問題TF-IDF 是不是算出來的頻率不會等於1 為什麼
其實我不懂標題的TD-IDF也不知道內文改問的TF-IDF,但是關於python的open問題我可以稍微回答一下。
樓主的問題其實沒有描述清楚,那麼我假設樓主要的是將d1變數的值是從一個檔案讀進來的第一行資料,d2也是這樣。那麼下面是程式片段來取代d1="a b c d"及d2="e f g h"這兩行
d1_fo = open("/path/for/d1/file", mode='r', encoding='utf-8')
d2_fo = open("/path/for/d2/file", mode='r', encoding='utf-8')
d1 = d1_fo.readline()
d2 = d2_fo.readline()
d1_fo.close()
d2_fo.close()
d1 = d1.strip("\n")
d2 = d2.strip("\n")
對了,那兩行open()並沒有做錯誤處理,就是沒處理open失敗的情況,所以你可以自己加強一下喔。
另外一個問題TF-IDF 是不是算出來的頻率不會等於1 為什麼
https://zh.wikipedia.org/wiki/Tf-idf
看數學式
tf 一定小於1,這沒問題
idf是取對數,當檔案總數大,詞語出現在檔案次數小的時候,大於1。
tf-idf就兩個相乘,怎麼會沒有可能等於1?只是通常不會大於或等於1,因為取對數造成idf不會太大。
問題是tf-idf只是粗略的判別詞語在特定文件裡常出現,並且不屬於通用語句,是單純讓你比大小判斷權重而已,你問會不會等於1要幹麻?等於1也不會有任何特別意義。
with open(file_name)) as file1: (使用with as 會處理檔案讀取過程中發生的例外,並且最後確定檔案一定會關閉)
for line in file1: (使用For 迴圈的原因是要將整個檔案以行的方式, 全部讀出, 不然用 line()時只會讀到第一行)
fields = line.strip().split() (讀完整行後, 去除前後空白字元. Python 3 可以用string())
給你參考囉
應該如下:
with open('test.txt','r',encoding='utf-8') as f:
d1 = f.read()
tf-idf 不是算機率,而是轉換為向量,總和不會等於1,公式請參閱:
https://zh.wikipedia.org/wiki/Tf-idf