深度【文本分類】【關係抽取】模型中,如何讀取並處理輸出的訓練文件(TXT格式)

1、一般在此類模型中,需要原始文件四個:

train.txt  一般格式爲(分類類型 句子)或(關係類型 頭實體 尾實體 句子)

test.txt 格式同上

relation2id.txt  (關係類型 關係id)

vec.txt  (word, vec1,...,vec50)假設Embedding的維度爲50

注意:要保證這些txt文件都是utf-8編碼的


2、先處理vec.txt文件 

目的:

1得到一個wordembedding的矩陣,存放所有word的詞向量。

2對這些word進行編號,因爲我們後面在模型的輸入部分,輸入的是由單詞編號組成的一個個句子,所以這裏要先對word進行編號,其實就是按照文件的讀取順序,從0到len(vec)-1


f = open('./vec.txt', encoding = 'utf-8')

f.readline() #如果文件的第一行有不需要讀入的一些註釋或說明信息 或表頭之類的 可以跳過

word2id = {}  #存放詞典,即word和其對應的id

wordembeddings = [] #這是詞嵌入矩陣

while True:

    content = f.readline()

    if content == '':

        break

    content = content.strip().split()  #刪除字符串的前後空白,並且  按空格鍵隔開

    word2id[content[0]] = len(word2id) #這裏假設content[0]中存放的是word,也就是說第0列是word ,第1~50列是Embedding vector

    content = content[1:] #去後50列 的 向量

    content = [(float) (i) for i in content]#前面從文件裏讀取得到的是字符串類型的,這裏要把它轉化成float類

    wordembeddings.append(content)

f.close()  #養成良好的編程習慣,當你open一個file時,就應該想好在哪裏去close它

#因爲輸入的句子要設置成定長的 比如都是70,所以當不足70時就應該補空,我們認爲,這個空位的id是最後的,也就是len(word2id), 並隨機給空位設一個對應的初始vector值.

blank = np.random.normal(size = embedding_size, loc = 0, scale = 0.05)

wordembeddings.append(blank)

word2id['']=len(word2id)


3、處理relation2id文件

f = open ('relation2id.txt',encoding ='utf-8')

relation2id={}

while True:

    relation = f.readline()

    if relation ==0:

        break

    relation = relation.strip().split()

   relation2id[relation[0]] = int(relation[1])

f.close()

4、處理train.txt文件

目的:1 因爲train.txt文件包含兩部分,一個是關係或分類的類型,一個是訓練樣本也就是句子,所以這裏的處理我們需要得到兩個矩陣,一個矩陣A用來順序存放分類類型,一個矩陣B用來順序存放由單詞id組成的句子,這兩個矩陣的行應該一 一對應,即是:句子A的第i行應是矩陣B的第i行所對應的分類類型。

f = open('train.txt', encoding ='utf-8')

A = []

B = []

while True:

    text = f.readline()

    if text =='':

          break

    text = text.strip().split()

    y = int(text[0])

    b = [0 for i in range(len(word2id))]

    b[y] = 1

    B.append(b)  #存放關係類型矩陣


    sentence = text[1:]

 

    for i in range(len(sentence)):

          a.append(word2id[sentence[i]])

    if len(a)<70:  #不足70補

          for i in range(len(a),70):

               a.append(len(word2id))

    if len(a)>70: #多於70刪除

          del a[70:]

     A.append(a) #存放由word id組成的句子矩陣

f.close()



    









發佈了28 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章