python獲取txt文件詞向量過程詳解
在讀取https://github.com/Embedding/Chinese-Word-Vectors中的中文詞向量時(shí),選擇了一個(gè)有3G多的txt文件,之前在做詞向量時(shí)用的是word2vec,所以直接導(dǎo)入模型然后indexword即可。
因?yàn)檫@是一個(gè)txt大文件,嘗試了DataFrame,np.loadtxt等,都沒有成功,其中主要遇到的問題是:
- 如何讀取完整的大文件,而不會(huì)出現(xiàn)內(nèi)存不足memery error等問題
- 將讀取出來的文件,保存為npy文件
- 根據(jù)詞找到對(duì)應(yīng)的向量
解決辦法:
嘗試使用的代碼:
代碼1: try: lines=np.loadtxt(filepath) catch: 感覺這塊不會(huì)寫了咦,,, print(ValueError) 但這樣的話,它就不會(huì)繼續(xù)循環(huán)去讀上邊的txt了呢
代碼2: lines=[] with open(filepath) as f: for line in f: lines.append(line) np.save(filepath,lines)
代碼3 def readEmbedFile(embedFile): # embedId = {} # input = open(embedFile,'r',encoding="utf-8") # lines = [] # a=0 # for line in input: # lines.append(line) # a=a+1 # print(a) # nwords = len(lines) - 1 # splits = lines[1].strip().split(' ') # 因?yàn)榈谝恍惺墙y(tǒng)計(jì)信息,所以用第二行 # dim = len(splits) - 1 # embeddings=[] # # embeddings = [[0 for col in range(dim)] for row in range(nwords)] # b=0 # for lineId in range(len(lines)): # b=b+1 # print(b) # splits = lines[lineId].split(' ') # if len(splits) > 2: # # embedId賦值 # embedId[splits[0]] = lineId # # embeddings賦值 # emb = [float(splits[i]) for i in range(1, 300)] # embeddings.append(emb) # return embedId, embeddings
代碼4: def load_txt(filename): lines=[] vec_dict={} with open(filename,r) as f: for line in f: list=line.strip() lines.append(line) for i, line in emuate(lines): if i=0: continue line=line.split(" ") wordID=line[0] wordvec=[float line[i] for i in range(1,300)] vec_dict[wordId]=np.array(wordvec) return vec_dict
具體內(nèi)存不足主要的原因是:
我的虛擬機(jī)中確實(shí)內(nèi)存不太夠,后來使用實(shí)驗(yàn)室32G的主機(jī)后,可以得到idvec,而得不到向量的,報(bào)的錯(cuò)還是memory error.
另一個(gè)原因,是需要把詞向量轉(zhuǎn)換為float形式,在python中str 占的內(nèi)存>float類型,如代碼所示:
print("str",sys.getsizeof("")) print("float",sys.getsizeof(1.1)) print("int",sys.getsizeof(1)) print("list",sys.getsizeof([])) print("tuple",sys.getsizeof(())) print("dic",sys.getsizeof([]))
str 49 float 24 int 28 list 64 tuple 48 dic 64
在我的電腦,64位操作系統(tǒng),64位的python, 所占內(nèi)存大小排序?yàn)椋?/p>
dic=list>str>tuple>int>float
讀取時(shí)候可以用np.load().item就可以復(fù)原原來的字典,主要參照下述文件:
然后通過python的字典操作就可以遍歷得到每個(gè)詞的詞向量了,dic[vocab]
心得:
距離完全解決項(xiàng)目的問題還有5~6的大關(guān)卡,但靜下心來,一步步地做總會(huì)突破的呀!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch的Backward過程用時(shí)太長(zhǎng)問題及解決
這篇文章主要介紹了pytorch的Backward過程用時(shí)太長(zhǎng)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python Matplotlib 實(shí)現(xiàn)3D繪圖詳解
Matplotlib在二維繪圖的基礎(chǔ)上,構(gòu)建了一部分較為實(shí)用的3D繪圖程序包。本文將為大家詳細(xì)介紹通過調(diào)用該程序包接口繪制 3D散點(diǎn)圖、3D曲面圖、3D線框圖。感興趣的同學(xué)可以了解一下2021-11-11新版Pycharm顯示Conda?executable?is?not?found解決辦法
這篇文章主要給大家介紹了關(guān)于新版Pycharm顯示Conda?executable?is?not?found解決辦法,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Pycharm具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07python模塊之sys模塊和序列化模塊(實(shí)例講解)
下面小編就為大家?guī)硪黄猵ython模塊之sys模塊和序列化模塊(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09