文本张量表示的几种方法及其实现

153 阅读2分钟

1 文本张量表示

将一段文本使用张量进行表示,其中一般将词汇表示成向量,称作词向量,再由各个词向量按顺序组成矩阵形成文本表示.
["人生", "该", "如何", "起头"] ==> # 每个词对应矩阵中的一个向量 
[[1.32, 4,32, 0,32, 5.2], 
[3.1, 5.43, 0.34, 3.2], 
[3.21, 5.32, 2, 4.32], 
[2.54, 7.32, 5.12, 9.54]]
文本张量表示的作用
将文本表示成张量(矩阵)形式,能够使语言文本可以作为计算机处理程序的输入,进行接下来一系列的解析工作.
文本张量表示的方法
one-hot编码
word2vec
word embedding

2 one-hot词向量表示

又称独热编码,将每个词表示成具有n个元素的向量,这个词向量中只有一个元素是1,其他元素都是0,不同词汇元素为0的位置不同,其中n的大小是整个语料中不同词汇的总数.
["改变", "要", "如何", "起手"]` 
==> 
[[1, 0, 0, 0], 
[0, 1, 0, 0], 
[0, 0, 1, 0], 
[0, 0, 0, 1]]
one-hot编码实现
import jieba
from tensorflow.keras.preprocessing.text import Tokenizer
from sklearn.externals import joblib

def dm_onehot_gen():
    vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}
    
    mytokenizer = Tokenizer()
    mytokenizer.fit_on_texts(vocabs)
    
    for vocab in vocabs:
        zero_list =  [0] * len(vocabs)
        idx = mytokenizer.word_index[vocab] - 1
        zero_list[idx] = 1
        print(vocab, '的onehot编码是', zero_list)
     
     mypath = './mytokenizer'
     joblib.dump(mytokenizer, mypath)
     print('保存mytokenizer end')
     
     
     print(mytokenizer.word_index)
     print(mytokenizer.index_word)

输出效果:

  陈奕迅 的onehot编码是 [1, 0, 0, 0, 0, 0] 
  王力宏 的onehot编码是 [0, 1, 0, 0, 0, 0] 
  鹿晗 的onehot编码是 [0, 0, 1, 0, 0, 0] 
  周杰伦 的onehot编码是 [0, 0, 0, 1, 0, 0] 
  李宗盛 的onehot编码是 [0, 0, 0, 0, 1, 0] 
  吴亦凡 的onehot编码是 [0, 0, 0, 0, 0, 1]
  
  保存mytokenizer End 
  
  {'陈奕迅': 1, '王力宏': 2, '鹿晗': 3, '周杰伦': 4, '李宗盛': 5, '吴亦凡': 6} {1: '陈奕迅', 2: '王力宏', 3: '鹿晗', 4: '周杰伦', 5: '李宗盛', 6: '吴亦凡'}

onehot编码器的使用:

def dm_onehot_gen():
    vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}
1 加载已保存的词汇映射器Tokenizer joblib.load(mypath)
mypath = './mytokenizer'
mytokenizer = joblib.load(mypath)

2 编码token为"李宗盛"  查询单词idx 赋值 zero_list,生成onehot
token = "李宗盛"
zero_list = [0] * len(vocabs)
idx = mytokenizer.word_index[token] - 1
zero_list[idx] = 1
print(token, '的onehot编码是', zero_list)`
输出效果
李宗盛 的onehot编码是 [0, 0, 0, 0, 1, 0]

one-hot编码的优劣势: 优势:操作简单,容易理解 劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据大量内存, 正因为one-hot编码明显的劣势,这种编码方式被应用的地方越来越少,取而代之的是接下来我们要学习的稠密向量的表示方法word2vec和wordembedding