我正在为网页编写分类器,所以我有各种数字功能,我也想对文本进行分类。我正在使用词袋方法将文本转换为(大)数字向量。代码最终是这样的:
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个对象,只有两个数字特征。即使是最简单的文本也会产生具有九个特征的向量(因为语料库中有九个不同的单词)。显然,对于真实文本,将会有数百个或数千个不同的单词,因此最终的特征向量将是< 10个数值特征但是>基于1000个单词。
因此,分类器(SVM)不会将数字特征上的单词加权100到1倍吗?如果是这样,我如何进行补偿以确保单词包的数量与数字特征的权重相等?
答案 0 :(得分:1)
我认为,对于稀疏文本令牌以幼稚的方式(作为多热点矢量)产生的更高维度,您的担忧是完全正确的。您至少可以通过以下两种方法解决该问题。两者都会从文本中产生一个低维向量(例如100维)。词汇量增加时,维数不会增加。
答案 1 :(得分:-2)
您可以使用Tf–idf:
对计数进行加权import numpy as np
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
np.set_printoptions(linewidth=200)
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one',
'Is this the first document?',
]
vectorizer = CountVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
print(words)
words_counts = X.toarray()
print(words_counts)
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(words_counts)
print(tfidf.toarray())
输出是这样的:
# words
[u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
# words_counts
[[0 1 1 1 0 0 1 0 1]
[0 1 0 1 0 2 1 0 1]
[1 0 0 0 1 0 1 1 0]
[0 1 1 1 0 0 1 0 1]]
# tfidf transformation
[[ 0. 0.43877674 0.54197657 0.43877674 0. 0. 0.35872874 0. 0.43877674]
[ 0. 0.27230147 0. 0.27230147 0. 0.85322574 0.22262429 0. 0.27230147]
[ 0.55280532 0. 0. 0. 0.55280532 0. 0.28847675 0.55280532 0. ]
[ 0. 0.43877674 0.54197657 0.43877674 0. 0. 0.35872874 0. 0.43877674]]
使用此表示法,您应该能够合并其他二进制功能以训练SVC。