似乎嵌入向量是这里最好的解决方案。
但是,您可以考虑一种称为“one-hot hashing trick”的 one-hot 编码的变体。在这种变体中,当唯一词的数量太大而无法在字典中分配唯一索引时,可能会散列成固定大小的向量。
您的用例中的一个优势是您可以执行在线编码。如果您还没有遇到每个词汇,您仍然可以分配一个哈希值。然后稍后,可以将新词添加到词汇表中。但一个陷阱是“哈希冲突”。事实上,两个不同的词有可能最终得到相同的哈希值。
我在François Chollet 的优秀“Python 深度学习”中找到了这种散列技巧的一个例子。
import numpy as np
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
dimensionality = 1000
max_length = 10
results = np.zeros((len(samples), max_length, dimensionality))
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
# the word is given a hash with a random integer
index = abs(hash(word)) % dimensionality
results[i, j, index] = 1.0
结果数组:
results.shape
(2, 10, 1000)
您可以观察到两个句子之间的常用词被赋予相同的索引:The
在两个句子的位置 0(维度 2 的位置 0 和 6)。
np.where(results > 0)
(array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int64),
array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4], dtype=int64),
array([ 23, 58, 467, 442, 83, 77, 23, 798, 618, 301, 942], dtype=int64))