iT邦幫忙

1

Python 開啟一個檔案txt然後算出TD-IDF

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 為什麼

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
過時軟碟片
iT邦新手 5 級 ‧ 2021-04-07 10:28:05
最佳解答

其實我不懂標題的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失敗的情況,所以你可以自己加強一下喔。

感謝你的回答 抱歉這麼久才回復
因為最近在弄期中考
用你的程式有成功開啟 並學到了readline和strip的知識

2
froce
iT邦大師 1 級 ‧ 2021-04-07 12:05:09

另外一個問題TF-IDF 是不是算出來的頻率不會等於1 為什麼

https://zh.wikipedia.org/wiki/Tf-idf
看數學式
tf 一定小於1,這沒問題
idf是取對數,當檔案總數大,詞語出現在檔案次數小的時候,大於1。
tf-idf就兩個相乘,怎麼會沒有可能等於1?只是通常不會大於或等於1,因為取對數造成idf不會太大。

問題是tf-idf只是粗略的判別詞語在特定文件裡常出現,並且不屬於通用語句,是單純讓你比大小判斷權重而已,你問會不會等於1要幹麻?等於1也不會有任何特別意義。

看更多先前的回應...收起先前的回應...

借froce 大大的位置,建議一下提問者.學習切勿心急求快.
看了提問的紀錄,之前有問 panda 讀檔. 這裡也是可以使用panda
讀檔啊.不要急著趕進度,把每一步都搞懂,後面的才好走.

froce iT邦大師 1 級 ‧ 2021-04-08 13:19:38 檢舉

唉,現在真的一堆基礎沒打好,就想玩AI。

抱歉這麼晚才回復 最近在忙期中考
這是專題老師出給我們的作業
也沒學過 所以只好上網找答案 但是還是不太懂
所以上it找懂得解釋一下
會問等於1是因為 我檔案數只有1個
按照維基百科裡面的例子去算 為什麼不會等於1呢

回應 一級屠豬士 最後有用panda 的DataFrame匯出來呀

0
tkunlin
iT邦新手 4 級 ‧ 2021-04-08 09:34:45
with open(file_name)) as file1:  (使用with as 會處理檔案讀取過程中發生的例外,並且最後確定檔案一定會關閉)
        for line in file1:    (使用For 迴圈的原因是要將整個檔案以行的方式, 全部讀出, 不然用 line()時只會讀到第一行)
            fields = line.strip().split()  (讀完整行後, 去除前後空白字元. Python 3 可以用string())
        

給你參考囉

/images/emoticon/emoticon02.gif 抱歉小弟 沒學過
看不太懂

0
I code so I am
iT邦高手 1 級 ‧ 2021-04-08 10:09:30

應該如下:

with open('test.txt','r',encoding='utf-8') as f:
    d1 = f.read()

tf-idf 不是算機率,而是轉換為向量,總和不會等於1,公式請參閱:
https://zh.wikipedia.org/wiki/Tf-idf

感謝大大 的回答
抱歉很晚才回復 最近在準備期中考的事情
所以tf算的事詞頻
但對於 逆向檔案頻率 idf的解釋還是不太理解

idf 主要是表達【跨文件出現的次數越多,表示該單字越不重要】,例如冠詞、介係詞、代名詞,他們出現在文件的頻率很高,但他們並無助於理解文章的大意。

我要發表回答

立即登入回答