三种常用文本张量
-
one-hot编码
- 又称独热编码,将每个词表示成具有n个元素的向量,这个词向量中只有一个元素是1,其他元素都是0
-
from sklearn.externals import joblib from keras.preprocessing.text import Tokenizer # 例如: vocab = {'苹果', '菠萝'} t = Tokenizer(num_words=None, char_level=False) t.fit_on_texts(vocab) for token in vocab: zeros_list = [0]*len(vocab) token_index = t.texts_to_sequebces([token])[0][0] - 1 zero_list[token_index] = 1 print(token, "one_hot: ", zero_list) # 使用joblib工具保存映射器 tokenizer_path = './Tokenizer' joblib.dump(t, tokenizer_path) # onehot编码器的使用 t = joblib.load(tokenizer_path) t.texts_to_sequebces([token])[0][0] - 1
-
word2vec
- 通过神经网络模型,将网络参数作为词汇的向量表示,包含CBOW和skipgram两种训练模式
- CBOW:先知道前后字符,预测中间字符 (先指定窗口:3)
- skipgram:先知道中间的字符,预测前后字符 (先指定窗口:3)
-
# fasttext工具进行word2vec # 1.获取训练数据 # 2.训练词向量, 默认使用skipgram model = fasttext.train_unsupervised(data_path) model.get_word_vector(content) # 3.模型超参数设定 model = fasttext.train_unsupervised(data_path, mode='cbow', thread=8) # 4.模型效果检验 model.get_nearest_neighbors(content) # 5.模型的保存与重加载 model.save_model('model.bin') model = fasttext.load_model('model.bin')
- 通过神经网络模型,将网络参数作为词汇的向量表示,包含CBOW和skipgram两种训练模式
-
word Embedding
- 通过一定的方式将词汇映射到指定维度(一般将高维度向低维度)的空间.
-
import torch import json from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() # 100个词汇表示成50维的向量 embedded = torch.randn(100, 50) # 导入100个中文词汇 meta = list(map(lambda x: x.strip(), fileinput.fileInput("./vocab100.csv"))) writer.add_embedding(embedded, metadata=meta) writer.close()
-
三种方法对比:
- one-hot简单,容易理解,但割裂了词与词之间的联系,在长度过大时,很占内存
- Word2vec(特指skipgram和CBOW)会考虑上下文,速度更快;但word2vec是词与向量一一对应关系,对于多义词不好处理,且word2vec是静态生成,对特定任务通用性不强
- word embedding是word2vec的一种表达方式,能处理多义词,通用性更好,且是动态变化的,适用于深度学习,速度相比word2vec较慢,