Word2Vec 将字母“s”添加到中文

问题描述

我正在做一个使用 LSTM 对中文文本进行分类的项目。我选择了 word2vec 来表示文本并适合 LSTM。
这是我的代码

import gensim
DIM=100
w2vec_model=gensim.models.Word2Vec(sentences=cop3,size=DIM,window=10,min_count=1)

##tokenize
tokenizer=Tokenizer()
tokenizer.fit_on_texts(cop3)
X=tokenizer.texts_to_sequences(cop3)

# add padding
max_len=30
X=pad_sequences(X,maxlen=max_len)

# create vocabulary
vocab_size=len(tokenizer.word_index)+1
vocab=tokenizer.word_index

#to get the weight of each word in vocabulary
def get_weight(model):
  weight_martrix=np.zeros((vocab_size,DIM))
  for word,i in vocab.items():
        weight_martrix[i]=model.wv[word]
    
  return weight_martrix

embeeding=get_weight(w2vec_model)

然后我得到错误:KeyError

回溯(最近一次调用最后一次)在 () ----> 1 嵌入=get_weight(w2vec_model)

3 帧 /usr/local/lib/python3.7/dist-packages/gensim/models/keyedvectors.py 在 word_vec(self,word,use_norm) 450 返回结果 451 其他: --> 452 raise KeyError("词 '%s' 不在词汇表中" % word) 453 454 def get_vector(self,word):

KeyError: "词 '大s' 不在词汇表中"

有谁知道为什么他们在我的单词中添加了字母“s”?以及如何解决这个问题?

解决方法

此错误实际上表明您的 tokenizer.word_index 序列中的单词版本可能包含该 s。 (错误表明这样的标记没有出现在 Word2Vec 步骤中,因此它没有该词的条目。)

因此:您应该将分析/示例缩小到仅创建和检查 tokenizer,以查看其结果是否合理。 (由于 Tokenizer 类的实际来源未显示,因此很难推测那里可能出了什么问题。但将您的语料库精简为显示问题的最小或单个文本也可能有所帮助。 )

另外:请注意,min_count=1 中的 Word2Vec 几乎总是一个坏主意。该算法仅适用于具有许多不同用法示例的单词 - 当您丢弃非常低频率的单词时,实际上可以改进剩余的单词。