您的位置:首页 > 其它

深度【文本分类】【关系抽取】模型中,如何读取并处理输出的训练文件(TXT格式)

2017-10-31 12:14 429 查看
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()

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐