我必须对超过 10,000 个类别的大量文本进行分类。我需要专家的建议,因为我还是一名学生。
我的数据是按类别分类的商业产品的描述和标题。例如,标题为“又大又好的键盘”的键盘位于类别办公室>计算机>键盘中。
现在,我使用“from sklearn.feature_extraction.text import TfidfVectorizer”来表示我的文本数据。但矩阵在内存中太大了。 对于表示大量数据,您有什么建议吗?
我正在考虑使用 word-2-vec 来表示数据,然后使用神经网络进行分类。
但是我需要你的建议才能走上正确的道路!!
谢谢
最佳答案
如果您想减小 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)?
关于python-3.x - 如何在Python 3中对大量文本进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55911531/