1

需要对 keras 中的一种热门或散列技巧有基本的了解。

from keras.preprocessing.text import hashing_trick
from keras.preprocessing.text import text_to_word_sequence
# define the document
text = 'The quick brown fox jumped over the lazy dog dog.'
# estimate the size of the vocabulary
words = set(text_to_word_sequence(text))
print(words)
vocab_size = len(words)
print(vocab_size)
# integer encode the document
result = hashing_trick(text, round(vocab_size*1.3), hash_function='md5')
print(text)
print(result)

输出:

{'over', 'the', 'lazy', 'dog', 'quick', 'brown', 'jumped', 'fox'} 8 敏捷的棕色狐狸跳过了懒狗狗。[6、4、1、2、7、5、6、2、6、6]

结论:这里为每个标记分配一个整数。例如。“快被分配4”--6
快--4棕--1狐--2跳--7超--5--6懒--2狗--6

我想了解如何为“the”和“dog”分配相同的整数 6。如果我错了,请纠正我,并请提供解释它是如何做到的?

4

1 回答 1

0

这是一个散列冲突的例子。哈希函数只是对输入词计算的函数。例如,Java 的默认哈希函数会执行类似第一个字符乘以 1、第二个字符乘以 31、第三个字符乘以 31^2 等操作,然后将它们加在一起。

不能保证两个不同的字符串可能不会计算出相同的数字。

如果我们选择较小的词汇量,这个问题会变得更加明显。例如,如果词汇表大小为 10,则 11 的散列可能“环绕”为 1。(应用模运算符将任意大的整数映射到范围 1-vocab_size中。)

如果你想让散列不太可能,使用vocab_size = 10*len(words)orvocab_size = 10*len(words)可以减少冲突的数量。

但是,我不确定更大词汇量的下游成本是多少。

于 2020-06-16T17:38:25.573 回答