【问题标题】:Text Classification with word2vec使用 word2vec 进行文本分类
【发布时间】:2023-03-21 22:08:01
【问题描述】:

我正在做文本分类,并计划使用 word2vec 词嵌入。 我已经使用 gensim 模块进行 word2vec 培训。

我已经尝试了几个选项。但是我在词汇表中没有出现“xyz”这个词的错误。我找不到我的错误。

文本处理

def clean_text(text):

text = text.translate(string.punctuation)

text = text.lower().split()

stops = set(stopwords.words("english"))
text = [w for w in text if not w in stops]

text = " ".join(text)
text = re.sub(r"[^\w\s]", " ",text)
text = re.sub(r"[^A-Za-z0-9^,!.\/'+-=]", " ",text)

text = text.split()
lemmatizer = WordNetLemmatizer()
lemmatized_words = [lemmatizer.lemmatize(w) for w in text]
text = " ".join(lemmatized_words)


return text

data['text'] = data['text'].map(lambda x: clean_text(x))

请帮我解决我的问题。

定义语料库

def build_corpus(data):
"Creates a list of lists containing words from each sentence"
corpus = []
for col in ['text']:
    for sentence in data[col].iteritems():
        word_list = sentence[1].split(" ")
        corpus.append(word_list)
return corpus

corpus = build_corpus(data)

Word2vec 模型

from gensim.models import word2vec
 model = word2vec.Word2Vec(corpus, size=100, window=20, min_count=20,    workers=12, sg=1)

words = list(model.wv.vocab)

tokenizer = Tokenizer()
X = data.text
tokenizer.fit_on_texts(X)
sequences = tokenizer.texts_to_sequences(X)
X = pad_sequences(sequences, maxlen=10000)

embedding_vector_size=100

vocab_size = len(words)
embedding_matrix = np.zeros((vocab_size, embedding_vector_size))
for index, word in enumerate(words):    
 embedding_vector = model.wv[word]
 if embedding_vector is not None:
    embedding_matrix[index] = embedding_vector

现在我在下游分类任务中使用我创建的词嵌入。

分类模型

labels = data['Priority']

我有两个优先事项。我要分类。

X_train, X_test, y_train, y_test = train_test_split(X , labels, test_size=0.25, random_state=42)

我正在使用以下网络进行分类

model3 = Sequential()
model3.add(Embedding(input_dim = vocab_size, output_dim = embedding_vector_size, input_length = max_len, weights=[embedding_matrix]))
model3.add(SpatialDropout1D(0.7))
model3.add(LSTM(64, dropout=0.7, recurrent_dropout=0.7))
model3.add(Dense(2, activation='softmax'))
model3.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
print(model3.summary())

我在这里遇到错误:

'ValueError: "input_length" is 10000, but received input has shape (None, 3)'

请帮我解决一下。谢谢。

【问题讨论】:

  • 什么是corpus?更一般地,如果您从 Word2Vec 收到“单词不在词汇表中”错误,它可能真的丢失了 - 可能是因为在创建模型时它不能用作单词标记。值得注意的是,如果 Tokenizer 类是将字符串分解为标记的原因,您将需要在将语料库传递给 Word2Vec 之前使用相同的标记化——这需要单词列表,not 纯字符串,作为每个单独的文本。
  • 谢谢@gojomo。我已经用语料库信息和文本处理更新了我的代码。你能帮我解决一下吗?
  • 这里很难阅读你的代码,因为缩进看起来不太正确(尤其是在clean_text()build_corpus() 函数中。你能确保这里的缩进是正确的吗?实际运行代码?另外,如前所述,在前后使用不同的标记化(拆分字符串到单词)是奇怪/错误的。如果你要使用一个类Tokenizer,它应该是将令牌列表传递给模型之前使用过。(并且,如果在更正此问题后您仍然遇到问题,您应该清楚这个 Tokenizer 类的来源。)
  • 你可以检查'fin'是否在你的训练语料库中,运行:corpus_with_fun = [text in corpus if 'fin' in text]然后print(corpus_with_fin)。 (可能没有,或者至少没有 20 次符合 min_count=20 要求。)

标签: python-3.x word2vec text-classification


【解决方案1】:

并非所有来自 corpus 的单词都会保存在 word2vec 模型中。

替换:

vocab_size = len(tokenizer.word_index) + 1

与:

vocab_size = len(words)

并替换:

for word, i in tokenizer.word_index.items():

与:

for i, word in enumerate(words):

从而确保您的嵌入矩阵仅包含模型中的单词。

【讨论】:

  • 感谢您的意见。我应该用'embedding_matrix [index] = embedding_vector'替换'embedding_matrix [i] = embedding_vector'吗? @帕斯卡
  • 建议的代码非常适合嵌入矩阵。我已经相应地编辑了代码。我正面临分类任务中的问题。你能帮我弄清楚@Pascal吗?这可能是个愚蠢的错误。但我对所有东西都很陌生。
猜你喜欢
  • 2020-10-08
  • 2018-09-13
  • 2019-01-06
  • 2017-07-21
  • 2020-05-16
  • 1970-01-01
  • 2015-09-03
  • 2018-05-19
  • 2019-01-06
相关资源
最近更新 更多