[英]How to unpack a pkl file?
我需要解壓一個 pkl 文件,但由於我不熟悉 pickle 和 pandas,所以我很難做到這一點。
pkl 文件的內容類似於:
{
'woodi': array([-0.07377538, 0.01810472, 0.03796827, -0.01185564, -0.12605625,
-0.03709966, 0.07863396, 0.04245366, -0.09158159, -0.01418831,
-0.03165198, -0.01235643, 0.00833164, -0.08156401, -0.10466748,
0.11343367, -0.1291647 , 0.02277501, -0.12230705, 0.08400519,
0.01631752, -0.03204752, -0.10115118, 0.01796065, -0.08914784,
0.00336748, 0.02858992, 0.13387977, -0.01711662, -0.05058149,
0.09866285, 0.00623399, -0.11368696, 0.03389056, 0.03049786,
-0.11235228, 0.03964651, 0.18348881, 0.00356622, -0.09299972,
0.11804404, 0.10598116, 0.04603285, 0.10211086, -0.07094006,
0.19667923, -0.22645354, -0.02930884, -0.21891772, -0.07495865]),
'bad-boy': array([-0.01525861, -0.0145514 , 0.02207321, 0.01273549, 0.0034881 ,
-0.00045474, 0.01104943, 0.00057228, -0.01515725, 0.00329882,
0.01570324, -0.03927545, 0.00393151, 0.00355666, -0.00503297,
-0.01088151, -0.0354947 , -0.010477 , -0.01945165, 0.0312498 ,
0.00195288, -0.03095445, -0.00803227, 0.02864361, -0.01416729,
0.00375061, 0.00546439, 0.03621898, 0.01337988, -0.03205173,
0.00451094, 0.02180656, -0.02587242, -0.01276209, 0.02721113,
-0.00075289, -0.00218841, 0.00531534, -0.0074188 , 0.00312647,
0.00424174, 0.02444418, 0.0222739 , -0.00477895, 0.02220114,
0.03402764, -0.02423164, 0.00724037, -0.03526915, 0.01470344]),
...
}
我需要獲取每個單詞的單詞和實值向量並創建一個 csv 文件...... csv 文件的內容必須如下所示:
woodi -0.07377538 0.01810472 ... -0.07495865
bad-boy -0.01525861 -0.0145514 ... 0.01470344
我試過這個python代碼:
import pickle
import pandas as pd
fin = 'SGlove.pkl'
fout = 'SGlove.csv'
words, embeddings = pickle.load(open(fin, 'rb'), encoding='latin1')
m, n = embeddings.shape
print("Emebddings contains {} words embedded as vectors of length {}".format(m, n))
df = pd.DataFrame(embeddings)
df.insert(0, "word", words)
df.to_csv(fout, header=False, index=False, sep=" ")
但我收到以下錯誤消息:
Traceback (most recent call last):
File "pkl_to_csv.py", line 10, in <module>
words, embeddings = pickle.load(open(fin, 'rb'), encoding='latin1')
ValueError: too many values to unpack (expected 2)
我認為問題在於pickle.load()
正在返回一個 Python 字典,這導致了ValueError
。
我使用您提供鏈接的SGlove.pkl
文件對此進行了測試,並且該前提似乎是正確的,但是字典中似乎沒有一個鍵pickle.load()
返回對應於'embeddings'
,所以這阻止了我更進一步。
無論如何,下面的代碼通常顯示了如何從load()
返回的內容中提取(我最初認為的)您想要的兩個值。 請描述字典中的'enbeddings'
鍵對應的是什么?
注意:我已經上傳了正在返回的字典中的鍵列表——這里是文本文件的鏈接。
import pickle
fin = 'SGlove.pkl'
data_dict = pickle.load(open(fin, 'rb'), encoding='latin1')
words = data_dict['woodi']
embeddings = data_dict['embeddings'] # -> KeyError: 'embeddings'
martineau 大部分都在那兒。 pickle.load() 返回一個字典,您需要對它進行額外的工作才能獲取單詞和嵌入。
你可以從
import pickle
fin = 'SGlove.pkl'
data_dict = pickle.load(open(fin, 'rb'), encoding='latin1')
然后單詞列表由下式給出
word_list = list(data_dict.keys())
然后您可以使用
embedding_list = [data_dict[word] for word in word_list]
如果您需要所有單詞的 2D 嵌入數組,則需要在 embedding_list 上使用np.concatenate
或類似的東西來獲得一個。 例如,如果您希望嵌入具有形狀[n_words, len_vector]
(如您所願),您可以使用
embeddings = np.concatenate([item[None, :] for item in embedding_list], axis=0)
您也可以將其直接加載到 pd 數據框中,如下所示:
data_fname = 'yourFile.pkl'
df = pd.read_pickle(data_fname)
df.shape
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.