zoukankan      html  css  js  c++  java
  • 列表转换为三维矩阵

    先记录一下刚开始最慢最蠢的方法:(第一个函数是用单词训练的word2vec,第二个是字符训练的)

    '''#相同维度单词级别向量输入(注意列表向数组的转换及向量向数组的转换、向量与列表格式的区别、二维到三维的转换(https://blog.csdn.net/u013044310/article/details/80407220)
    def get_wordvec2(url,url_label):
    model = gensim.models.Word2Vec.load('./url_w2corpus_word_new')
    # print(model['blog.csdn.net'].tolist())#user_w2corpus_word
    # model = gensim.models.Word2Vec.load('./user_w2corpus_word')
    url_all=url
    #将URL转换成去掉空格的列表
    url_wordlist=[]
    maxlen=0#得到最大长度的URL
    for u in url_all:
    sentences = u.split('/')
    for s in sentences:
    if s == '':
    sentences.remove(s)
    if len(sentences)>maxlen:
    maxlen=len(sentences)
    url_wordlist.append(sentences)
    #将URL用矩阵表示
    texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
    text_len=0
    for te in range(len(url_all)): # 先对第一个句子循环一次
    if te==0:#只对第一个句子处理成矩阵
    text_len+=1
    text_vec = []
    for t in url_wordlist[te]:#对分割后的句子中每个元素循环
    print(t)
    try:
    text_vec.append(model[t].tolist()) # 得到句子向量
    except Exception as e:
    print('训练的向量集合中没有留下该词汇', e)
    #遇到长度不一致的URL用0向量补齐
    # for i in range(maxlen-len(text_vec)):
    # text_vec.append([0]*100)#用0补齐
    text_vec=sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
    #将一个句子的所有词向量放同一个列表中
    texts_vec.append(text_vec.transpose())
    texts_vec=(np.array(texts_vec))
    print('初始三维矩阵',texts_vec.shape)
    #接下来对剩余句子处理为矩阵
    dim = texts_vec.shape # 获取原矩阵的维数
    for te in range(1,len(url_all)):
    print('第几条文本',te)
    text_len+=1
    text_vec = [] # 由于默认的w2v训练得到的向量维度为100,所以初始化为100,开始初始化为0,但是如果该句子中只有一个词汇并且该词汇没有训练到,则维度无法与之前保持一致
    for t in url_wordlist[te]: # 每个句子中的每个词汇的向量求和
    try:
    text_vec.append(model[t].tolist()) # 得到句子向量
    except Exception as e:
    print('训练的向量集合中没有留下该词汇', e)
    text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
    data=np.append(texts_vec,text_vec.transpose())
    texts_vec=data
    data1 = texts_vec.reshape(dim[0] + len(url_all)-1, dim[1], dim[2]) # 再通过原矩阵的维数重新组合
    print('最终三维矩阵输入格式',data1.shape)
    # y_train = np.reshape(np.array(url_label),(len(url_label), 1))
    y_train=url_label
    return data1, y_train

    #相同维度字符级别向量输入
    def get_wordvec3(url,url_label):
    model = gensim.models.Word2Vec.load('./url_w2corpus_char_old')
    # print(model['blog.csdn.net'].tolist())
    url_all=url
    # 每个链接词的个数要一致,否则转换矩阵格式的时候会出错
    maxurl_len=max((len(l) for l in url_all))#最大字符长度
    texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
    text_len=0
    for te in range(len(url_all)): # 只处理第一个句子
    if te==0:
    text_len+=1
    text_vec = []
    # 将句子的每个字符循环加入result
    result = []
    char_num = len(url_all[te])
    for ch in range(len(url_all[te])):
    result.append(url_all[te][ch])

    for t in result:
    try:
    text_vec.append(model[t].tolist()) # 得到句子向量
    except Exception as e:
    print('训练的向量集合中没有留下该词汇', e)
    #用0向量补充缺失的维度
    # for i in range(maxurl_len-char_num):
    # text_vec.append(np.zeros(100).tolist())
    text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxurl_len, padding='post',
    dtype='float32')
    # 将一个句子的所有词向量放同一个列表中
    texts_vec.append(text_vec.transpose())

    texts_vec=(np.array(texts_vec))
    print('初始三维矩阵',texts_vec.shape)
    dim = texts_vec.shape # 获取原矩阵的维数
    for te in range(1,len(url_all)):
    print('第几条文本', te)
    text_len+=1
    text_vec = [] # 由于默认的w2v训练得到的向量维度为100,所以初始化为100,开始初始化为0,但是如果该句子中只有一个词汇并且该词汇没有训练到,则维度无法与之前保持一致
    result = []
    char_num=len(url_all[te])
    for ch in range(len(url_all[te])):
    result.append(url_all[te][ch])
    for t in result: # 每个句子中的每个词汇的向量求和
    try:
    text_vec.append(model[t].tolist()) # 得到句子向量
    except Exception as e:
    print('训练的向量集合中没有留下该词汇', e)
    # for i in range(maxurl_len - char_num):
    # text_vec.append(np.zeros(100).tolist())
    text_vec = sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxurl_len, padding='post',
    dtype='float32')
    data = np.append(texts_vec, text_vec.transpose())
    texts_vec=data
    data1 = texts_vec.reshape(dim[0] + + len(url_all)-1, dim[1], dim[2]) # 再通过原矩阵的维数重新组合
    print('最终三维矩阵输入格式',data1.shape)
    y_train = url_label
    return data1, y_train#相同维度字符级别向量输入
    '''

    接下来是正确写法:
    def get_wordvec_word(ifnew,url,url_label):#传入ifnew表示是否用新的词向量;训练集url内容列表、url对应的label(已转化好格式)
    if ifnew==1:
    model = gensim.models.Word2Vec.load('./url_w2corpus_word_new')
    elif ifnew==0:
    model = gensim.models.Word2Vec.load(
    './url_w2corpus_word_old')
    url_all=url

    #将URL(去掉空格)转换成列表
    url_wordlist=[]
    maxlen=0#得到最大长度的URL,之后将所有训练集样本的长度都设为maxlen
    strip_chars = '/.??;+_:-@%="'
    for u in url_all:
    single_line = u.translate(str.maketrans(dict.fromkeys(strip_chars, '#')))
    sentences = single_line.split('#')
    for s in sentences:
    if s == '':
    sentences.remove(s)
    if len(sentences)>maxlen:
    maxlen=len(sentences)
    url_wordlist.append(sentences)

    #将URL用三维矩阵表示
    texts_vec = [] # 将每个计算完单个句子的向量的结果存储到该列表即返回句子向量
    for te in range(len(url_all)): # 将每个句子循环一次
    text_vec = []
    for t in url_wordlist[te]:#对分割后的句子中每个元素循环
    try:
    text_vec.append(model[t].tolist()) # 得到句子向量
    except Exception as e:
    print('训练的向量集合中没有留下该词汇', e)
    text_vec=sequence.pad_sequences(np.array(text_vec).transpose(), maxlen=maxlen,padding='post',dtype='float32')
    #将一个句子的所有词向量放同一个列表中
    texts_vec.append(text_vec.transpose())
    texts_vec=(np.array(texts_vec))
    print('训练集三维矩阵',texts_vec.shape)
     
  • 相关阅读:
    网络安全笔记1-局域网、DOS、用户与组、远程、NTFS、文件共享、DHCP、DNS、WEB、FTP、域、PKI、扫描与爆破
    ASM入网小助手卸载
    列表拖拽排序 ----vue.js
    如何让谷歌索引你的页面
    命令导入大数据库

    大数据-快读
    微服务参考文章
    Java-BigDecimal踩坑记录
    CF1285F Classical?
  • 原文地址:https://www.cnblogs.com/kjkj/p/10531792.html
Copyright © 2011-2022 走看看