如何在python 3中分类大量文本?

时间:2019-04-29 22:17:12

标签: python-3.x machine-learning keras scikit-learn nlp

我必须将大量文本分类为10,000多个类别。我仍然是学生,所以我需要专家的意见。

我的数据是分类为商品的描述和标题。例如,标题为“大而优质的键盘”的键盘在办公>计算机>键盘类别中。

现在,我使用“ from sklearn.feature_extraction.text import TfidfVectorizer”表示我的文本数据。但是矩阵的内存太大。 您有什么技巧可以代表大量数据?

我当时正在考虑使用word-2-vec表示数据,然后使用神经网络进行分类。

但是我需要您的建议才能走上正确的路!!

谢谢

2 个答案:

答案 0 :(得分:0)

如果您想减小Tfidf向量化的大小,我为您提供了两种选择。

假设您具有以下数据:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

X = ["When I wake up in the morning I always eat apples",
"What do you eat in the morning",
"Usually I only drink coffee",
"How awful, I really cannot stand coffee"]

应用Tfidf变换时,您将获得形状为(4,21)的矩阵:

vectorizer = TfidfVectorizer()
vectorized_X = vectorizer.fit_transform(X)
vectorized_X.shape
>>> (4,21)

现在让我们假设21列太多了,我们想减少它。

选项1

您可以使用降维。一旦执行了Tfidf,最自然的是使用截断的SVD。这将对tfidf向量化执行线性降维。这样做的好处是您可以指定希望保留的新组件的数量:

svd = TruncatedSVD(n_components=2)
reduced_X = svd.fit_transform(vectorized_X)
reduced_X.shape
>>> (4,2)

选项2

Tfidf允许您指定要在向量化中保留的单词数。然后,它返回仅在术语频率方面对前几个单词执行的向量化。

vectorizer_reduction = TfidfVectorizer(max_features = 5)
vectorized_reduced_X = vectorizer_reduction.fit_transform(X)
vectorized_reduced_X.shape
>>> (4,5)

如果我可以在两者之间进行选择,我会选择选项1 ,因为它首先考虑了所有信息,然后对其进行了汇总,而选项2 只是舍弃了从一开始就提供信息。但是我也希望选项1 需要更长的时间...因此,最佳解决方案可能是两者的混合(首先应用限制性Tfidf,然后应用SVD)?

答案 1 :(得分:0)

我找到了一种训练分类器的解决方案,而不必将所有数据存储在内存中。

假设您有2个数据集用于火车1分类器。

#Data 1
X1_text = ["When I wake up in the morning I always eat apples",
     "What do you eat in the morning"]
y1 = [1,1] #target 1
#Data 2
X2_text = ["Usually I only drink coffee",
     "How awful, I really cannot stand coffee"]
y2 = [2,2] #target 2

我们使用散列对数据进行矢量化

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18)
X1 = vectorizer.transform(X1_text)
X2 = vectorizer.transform(X2_text)

我们将使用partial_fit分两步训练SGDClassifier。 https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html

from sklearn.linear_model.stochastic_gradient import SGDClassifier
clf = SGDClassifier()

第一步,对X1 / y1使用partial_fit。参数类别必须包含所有可能的类别才能进行预测。这是1和2。 注意:例如,如果具有所有目标的变量类,则可以使用classes = np.unique(classes)。请参阅文档。

clf.partial_fit(X1, y1, classes = [1,2])

第二步,用其他数据重新训练分类器。不要使用归因类。

clf.partial_fit(X2, y2)