如何在 scikit-learn 中正确地将数字特征与文本(词袋)结合起来?

2024-02-14

我正在为网页编写一个分类器,因此我混合了数字特征,并且我还想对文本进行分类。我正在使用词袋方法将文本转换为(大)数值向量。代码最终是这样的:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import numpy as np

numerical_features = [
  [1, 0],
  [1, 1],
  [0, 0],
  [0, 1]
]
corpus = [
  'This is the first document.',
  'This is the second second document.',
  'And the third one',
  'Is this the first document?',
]
bag_of_words_vectorizer = CountVectorizer(min_df=1)
X = bag_of_words_vectorizer.fit_transform(corpus)
words_counts = X.toarray()
tfidf_transformer = TfidfTransformer()
tfidf = tfidf_transformer.fit_transform(words_counts)

bag_of_words_vectorizer.get_feature_names()
combinedFeatures = np.hstack([numerical_features, tfidf.toarray()])

这可行,但我担心准确性。请注意,有 4 个对象,并且只有两个数字特征。即使是最简单的文本也会产生具有九个特征的向量(因为语料库中有九个不同的单词)。显然,对于真实文本,将有数百或数千个不同的单词,因此最终的特征向量将是 1000 个基于单词的特征向量。

因此,分类器 (SVM) 是否会以 100 比 1 的系数对单词和数字特征进行加权?如果是这样,我该如何补偿以确保词袋与数字特征的权重相等?


我认为你的担忧是完全正确的,因为稀疏文本标记以一种天真的方式(作为多热向量)产生了更高的维度。您至少可以通过以下两种方法来解决这个问题。它们都会从文本中生成一个低维向量(例如 100 维)。当你的词汇量增加时,维度不会增加。

  • with 特征散列 https://scikit-learn.org/stable/modules/feature_extraction.html#feature-hashing。这适用于您的词袋模型。
  • with 词嵌入 https://en.wikipedia.org/wiki/Word_embedding (an 用法示例 https://stackoverflow.com/questions/55198750/using-pretrained-glove-word-embedding-with-scikit-learn与 scikit-learn 一起使用)或更高级的文本编码器,例如通用句子编码器 https://ai.googleblog.com/2019/07/multilingual-universal-sentence-encoder.html或任何最先进的变体BERT编码器 https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 scikit-learn 中正确地将数字特征与文本(词袋)结合起来? 的相关文章

随机推荐