使用 GenSim 学习字符嵌入

数据挖掘 word2vec 词嵌入 gensim
2022-03-07 20:05:18

我正在学习深度学习,作为我自己的第一个练习,我正在尝试构建一个系统来学习一项非常简单的任务——将每个单词的首字母大写。作为第一步,我尝试创建“字符嵌入”——每个字符的向量。我正在使用以下代码:

import gensim
model = gensim.models.Word2Vec(sentences)

其中 sentence 是我从这个长长的 Wikipedia 页面中获取的字符列表的列表。例如,句子[101] 是:

[' ', ' ', ' ', ' ', 'S', 'p', 'e', 'a', 'k', 'i', 'n', 'g', ' ', 'a', 't', ' ', 't', 'h', 'e', ' ', 'c', 'o', 'n', 'c', 'l', 'u', 's', 'i', 'o', 'n', ' ', 'o', 'f', ' ', 'a', ' ', 'm', 'i', 's', 's', 'i', 'l', 'e', ' ', 'e', 'x', 'e', 'r', 'c', 'i', 's', 'e', ... ]

为了测试模型,我做了:

model.most_similar(positive=['A', 'b'], negative=['a'], topn=3)

我希望在顶部得到'B',因为'A'-'a'+'b'='B',但我得到了:

[('D', 0.5388374328613281),
 ('N', 0.5219535827636719),
 ('V', 0.5081528425216675)]

(另外,我的大写应用程序运行得不太好,但这可能是因为嵌入)。

我应该怎么做才能获得识别大写的嵌入?

1个回答

我相信您误解了 word2vec 的概念。基本上对于单词,单词的特征向量是从周围的单词中学习的。

You shall know a word by the company it keeps- 菲尔斯.JR

在您的情况下,已使用字符,因此每个字符的特征向量取决于存在的相邻字符。如果您有以下训练句子,您的示例可能会起作用。

  • ABCDEFGHI
  • abcdefghi
  • AbcDEFghi
  • aBcdEfgHI
  • abcDEFgHi
  • ABcdEFGHi

通过这些训练句子,字符“A”、“a”、“B”、“b”将保留大写特征和英文字母顺序特征。但是,当使用维基百科句子进行训练时,这些字符将保留出现在有意义的单词中的概率。例如,最接近 'C' 的字母是 'a','o','e' 但几乎没有 'x' 或 'd' 因为会有像 'covenant','country','cat' 这样的词没有常见的词是'cx..'