机器学习自然言语处理:运用scikit-learn计算矢量化

图灵汇官网

计数矢量化概述

计数矢量化是一种将文本数据转换成数值向量的方法。这种方法简单易懂,可以将文本中的每个词映射到一个特定的位置,并记录该词出现的次数。虽然这种方法能够准确地反映文本内容,但无法提供词与词之间的语义或关系信息。

我们将使用scikit-learn库来实现这一功能。接下来,我们通过一个简单的例子来说明如何使用计数矢量化方法。

基本示例

下面是一个简单的Python示例,展示如何使用计数矢量化方法:

```python from sklearn.feature_extraction.text import CountVectorizer

创建一个计数矢量化器

vectorizer = CountVectorizer()

示例文本

sample_text = ["One of the most basic ways we can numerically represent words " "is through the one-hot encoding method (also sometimes called " "count vectorizing)."]

训练矢量化器

vectorizer.fit(sample_text)

查看词汇表

print('Vocabulary: ') print(vectorizer.vocabulary_)

获取向量

vector = vectorizer.transform(sample_text) print('Full vector: ') print(vector.toarray())

获取单个词的向量

print('Hot vector: ') print(vectorizer.transform(['hot']).toarray())

获取多个词的向量

print('Hot and one: ') print(vectorizer.transform(['hot', 'one']).toarray())

使用fit_transform方法一次完成所有操作

newtext = ['Today is the day that I do the thing today, today'] newvectorizer = CountVectorizer() print(newvectorizer.fittransform(new_text).toarray()) ```

在真实数据上的应用

现在,我们将在真实的文本数据上应用计数矢量化。我们将使用scikit-learn自带的20个新闻组数据集。

```python from sklearn.datasets import fetch20newsgroups from sklearn.featureextraction.text import CountVectorizer import numpy as np

创建矢量化器

vectorizer = CountVectorizer()

加载数据

newsgroupsdata = fetch20newsgroups()

查看样本数据

print('Sample 0: ') print(newsgroups_data.data[0]) print()

训练矢量化器

vectorizer.fit(newsgroups_data.data)

查看词汇表

print('Vocabulary: ') print(vectorizer.vocabulary_) print()

将第一个样本转换为向量

v0 = vectorizer.transform([newsgroups_data.data[0]]).toarray()[0] print('Sample 0 (vectorized): ') print(v0) print()

向量长度

print('Sample 0 (vectorized) length: ') print(len(v0)) print()

向量中的词数

print('Sample 0 (vectorized) sum: ') print(np.sum(v0)) print()

返回原始文本

print('To the source:') print(vectorizer.inverse_transform(v0)) print()

去除无用信息

newsgroupsdata = fetch20newsgroups(remove=('headers', 'footers', 'quotes'))

查看样本数据

print('Sample 0: ') print(newsgroups_data.data[0]) print()

训练矢量化器

vectorizer.fit(newsgroups_data.data)

查看词汇表

print('Vocabulary: ') print(vectorizer.vocabulary_) print()

将第一个样本转换为向量

v0 = vectorizer.transform([newsgroups_data.data[0]]).toarray()[0] print('Sample 0 (vectorized): ') print(v0) print()

向量长度

print('Sample 0 (vectorized) length: ') print(len(v0)) print()

向量中的词数

print('Sample 0 (vectorized) sum: ') print(np.sum(v0)) print()

返回原始文本

print('To the source:') print(vectorizer.inverse_transform(v0)) print() ```

进一步应用

我们已经了解了如何使用计数矢量化方法将文本转换为向量。接下来,我们可以利用这些向量进行更复杂的分析。例如,我们可以进行聚类、去除停用词、观察词频等。

为了验证这种方法的有效性,我们可以在20个新闻组数据集上进行分类实验。下面是具体的代码:

```python from sklearn.datasets import fetch20newsgroups from sklearn.featureextraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn import metrics

创建矢量化器

vectorizer = CountVectorizer()

加载训练和测试数据

newsgroupstrain = fetch20newsgroups(subset='train', remove=('headers', 'footers', 'quotes')) newsgroupstest = fetch20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))

训练向量

vectors = vectorizer.fittransform(newsgroupstrain.data)

构建分类器

clf = MultinomialNB(alpha=.01)

训练分类器

clf.fit(vectors, newsgroups_train.target)

测试向量

vectorstest = vectorizer.transform(newsgroupstest.data)

预测并评估

pred = clf.predict(vectorstest) accscore = metrics.accuracyscore(newsgroupstest.target, pred) f1score = metrics.f1score(newsgroups_test.target, pred, average='macro')

print('Total accuracy classification score: {}'.format(accscore)) print('Total F1 classification score: {}'.format(f1score)) ```

以上就是使用scikit-learn进行计数矢量化的基本步骤和应用示例。希望这些内容对你有所帮助。

本文来源: 图灵汇 文章作者: 侯寒渊