python sklearn使用的不仅仅是天真贝叶斯学习的计数功能

时间:2016-11-28 18:55:27

标签: python scikit-learn nlp naivebayes countvectorizer

首先,我是python和nlp /机器学习的新手。 现在我有以下代码:

vectorizer = CountVectorizer(
   input="content", 
   decode_error="ignore", 
   strip_accents=None,
   stop_words = stopwords.words('english'),
   tokenizer=myTokenizer
)
counts = vectorizer.fit_transform(data['message'].values)
classifier = MultinomialNB()
targets = data['sentiment'].values
classifier.fit(counts, targets)

现在这实际上运作得很好。我通过CountVectorizer获得稀疏矩阵,classifier使用矩阵以及目标(0,2,4)

但是,如果我想在向量中使用更多功能而不仅仅是单词计数,我该怎么办?我似乎无法找到它。提前谢谢。

2 个答案:

答案 0 :(得分:1)

在你的情况下,import numpy as np from scipy import sparse as sp counts = vectorizer.fit_transform(data['message'].values) ones = np.ones(shape=(len(data), 1)) X = sp.hstack([counts, ones]) classifier.fit(X, targets) 是一个稀疏矩阵;您可以使用其他功能为其添加列:

estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
combined = FeatureUnion(estimators)

# then you can do this:
X = combined.fit_transform(my_data)

scikit-learn还为此提供了内置助手;它被称为FeatureUnion。在scikit-learn docs中有一个组合来自两个变换器的特征的例子:

QTimer* timer=new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(findUpdate()));
    timer->setSingleShot(false);
    timer->start(frequency*1800000);

void MainWindow::findUpdate()
{
    for (int i=0;i<aplikace.count();i++){
        QNetworkAccessManager* manager=new QNetworkAccessManager(this);
        connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(checkUpdate(QNetworkReply*)));
        manager->get(QNetworkRequest(QUrl("http://www.gibucsoft.8u.cz/"+lang+"gibuclauncher/verze.php?ver="+aplikace.at(i))));
   }
}

FeatureUnion几乎完全相同:它接受一个矢量化器列表(带有名称),为相同的输入数据调用它们,然后按列连接结果。

通常最好使用FeatureUnion,因为您可以更轻松地使用scikit-learn交叉验证,挑选最终管道等等。

另见这些教程:

答案 1 :(得分:0)

这取决于您的数据以及您要执行的操作。在单词计数旁边可以使用不同的转换方法:Bag of Words,TFIDF,Word Vector,...

您可以从这些文档中阅读更多内容: - http://billchambers.me/tutorials/2015/01/14/python-nlp-cheatsheet-nltk-scikit-learn.html - http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html