关于机器学习:存储用于二进制分类的文本数据集

Store textual dataset for binary classification

我目前正在研究一个机器学习项目,并且正在构建数据集。数据集将由许多不同的文本特征组成,长度从1句到大约50句不等(包括标点符号)。存储这些数据的最佳方法是什么,然后预处理并用于使用Python进行机器学习?


在大多数情况下,您可以使用一种称为"词袋"的方法,但是,在某些情况下,当您执行更复杂的任务(如相似性提取)或希望在句子之间进行比较时,您应该使用word2vec。

词袋

您可以使用经典的词袋表示法,在这种方法中,您将每个样本编码为一个长向量,指示所有样本中所有单词的计数。例如,如果您有两个示例:

"I like apple, and she likes apple and banana."

"I love dogs but Sara prefer cats."

那么所有可能的词都是(这里顺序不重要):

1
I she Sara like likes love prefer and but apple banana dogs cats , .

然后将两个样本编码为

1
2
First:  1 1 0 1 1 0 0 2 0 2 1 0 0 1 1
Second: 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1

如果您使用的是sklearn,那么任务将简单如下:

1
2
3
4
5
6
7
8
9
10
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
corpus = [
    'This is the first document.',
    'This is the second second document.',
    'And the third one.',
    'Is this the first document?',
]
X = vectorizer.fit_transform(corpus)
# Now you can feed X into any other machine learning algorithms.

Word2VEC

word2vec是一种较为复杂的方法,它试图通过训练一个嵌入的神经网络来发现单词之间的关系。嵌入,在纯英语中,可以被认为是一个单词的数学表示,在提供的所有样本的上下文中。核心思想是,如果上下文相似,单词是相似的。

word2vec的结果是所有示例中显示的所有单词的矢量表示(嵌入)。令人惊奇的是,我们可以对向量执行算法运算。一个很酷的例子是:这里的Queen - Woman + Man = King引用

要使用word2vec,我们可以使用一个名为gensim的包,下面是一个基本设置:

1
2
3
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
model.most_similar(positive=['woman', 'king'], negative=['man'])
>>> [('queen', 0.50882536), ...]

这里,sentences是你的数据,size是嵌入的尺寸,size越大,表示一个词的空间就越大,总是有我们应该考虑的过度拟合。window是我们所关注的上下文的大小,它是我们在从上下文预测目标时,在训练时,我们所看到的目标词之前的字数。


一种常见的方法是创建字典(所有可设置位置的单词),然后用这个字典的函数对每个示例进行编码,例如(这是一个非常小且有限的字典),您可以有一个字典:hello,world,from,python。每个单词都将与一个位置相关联,在每个示例中,您定义一个矢量,其中0表示不存在,1表示存在,例如,对于"hello python",您将其编码为:1,0,0,1