dim*_*rik 13 python machine-learning scikit-learn
我有一堆带文章的文件.对于每篇文章,应该有一些功能,例如:文本长度,text_spam(所有都是整数或浮点数,在大多数情况下,它们应该从csv加载).我想要做的是 - 将这些功能与CountVectorizer相结合,然后对这些文本进行分类.
我看了一些教程,但我仍然不知道如何实现这些东西.在这里找到了一些东西,但实际上并不能满足我的需求.
任何想法如何用scikit完成?
谢谢.
我现在遇到的是:
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import FeatureUnion
measurements = [
{'text_length': 1000, 'text_spam': 4.3},
{'text_length': 2000, 'text_spam': 4.1},
]
corpus = [
'some text',
'some text 2 hooray',
]
vectorizer = DictVectorizer()
count_vectorizer = CountVectorizer(min_df=1)
first_x = vectorizer.fit_transform(measurements)
second_x = count_vectorizer.fit_transform(corpus)
combined_features = FeatureUnion([('first', first_x), ('second', second_x)])
Run Code Online (Sandbox Code Playgroud)
对于这一堆代码,我不明白如何加载"真实"数据,因为已经加载了训练集.第二个 - 如何加载类别(适合函数的y参数)?
Fre*_*Foo 13
你是误会FeatureUnion.它应该采取两个变压器,而不是两批样品.
你可以强迫它处理你拥有的矢量化器,但是将每个样本的所有特征都放入一个大袋中并使用单个DictVectorizer从这些袋中制作矢量要容易得多.
# make a CountVectorizer-style tokenizer
tokenize = CountVectorizer().build_tokenizer()
def features(document):
terms = tokenize(document)
d = {'text_length': len(terms), 'text_spam': whatever_this_means}
for t in terms:
d[t] = d.get(t, 0) + 1
return d
vect = DictVectorizer()
X_train = vect.fit_transform(features(d) for d in documents)
Run Code Online (Sandbox Code Playgroud)
不要忘记将其标准化sklearn.preprocessing.Normalizer,并注意即使在标准化之后,这些text_length特征也必然在规模方面支配其他特征.使用1. / text_length或np.log(text_length)替代它可能更明智.
第二个 - 如何加载类别(
y适合函数的参数)?
取决于您的数据的组织方式.scikit-learn有很多辅助函数和类,但如果你的设置是非标准的,它确实希望你编写代码.