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()