我可以将单词或句子匹配到 Python 中的预矢量化句子语料库以进行 NL 处理吗?
Can I match words or sentences to a pre-vectorized corpus of sentences in Python for NL processing?
几个小时以来,我一直在寻找这个特定问题的答案,虽然我学到了很多东西,但我仍然没有弄明白。
我有一个约 70,000 个句子的数据集,其中约 4,000 个句子的子集已被适当分类,其余未分类。目前我正在使用带有 CountVectorizer 和 TfidfTransformer 的 scikit 管道对数据进行矢量化,但是我只是基于 4,000 个句子进行矢量化,然后通过交叉验证测试各种模型。
我想知道是否有一种方法可以使用 Word2Vec 或类似的东西来矢量化整个数据语料库,然后将这些矢量与我的 4,000 个句子子集一起使用。我的目的是通过使用包含语料库中所有语义数据的词向量来提高我的模型预测的准确性,而不仅仅是来自 4,000 个句子的数据。
我目前使用的代码是:
svc = Pipeline([('vect', CountVectorizer(ngram_range=(3, 5))),
('tfidf', TfidfTransformer()),
('clf', LinearSVC()),
])
nb.fit(X_train, y_train)
y_pred = svc.predict(X_test)
其中 X_train 和 y_train 分别是我的特征和标签。我还有一个列表 z_all,其中包括所有剩余的未分类功能。
只要指出正确的方向(或告知这是否可行)就会非常有帮助。
谢谢!
我的意见是,如果您要使用 word2vec 嵌入,请使用一个预训练或使用的通用文本来生成它。
Word2vec 嵌入通常用于为您的文本数据赋予意义和上下文,如果您仅使用您的数据训练嵌入,它可能有偏见并且不代表一种语言。这意味着它的向量没有任何意义。
在嵌入工作之后,你还必须考虑如何处理你的单词,因为一个句子有 1 个或多个单词(嵌入在单词级别工作),而你想用 1 个句子来喂养你的模型-> 1 个矢量。不是 1 个句子 -> N 个向量。
人们通常对这些向量进行平均或相乘,例如,对于句子 "Hello there" 和 5 dims 的嵌入:
你好 -> [0, 0, .2, .3, .8]
那里 -> [.1, .2, 0, 0, .5]
AVG 你好 -> [.05, .1, .1, .15, .65]
这就是您要用于模型的内容!
因此,与其使用 TF-IDF 生成句子向量,不如像这样使用 word2vec,你应该没有任何问题。我已经在一个文本分类项目中工作,我们最终使用了一个嵌入了 ExtraTrees 模型的自我训练的 w2v,并取得了惊人的结果。
我会说答案是是的:您可以使用Word2Vec或其他类似的词嵌入方法来获取数据中每个句子的向量,然后使用这些向量作为线性支持向量机 (SVC) 中的训练和测试数据。
是的,您可以先为大约 70,000 个句子的整个语料库创建这些向量,然后再对您的数据进行实际训练。
然而,它并不像您当前使用的方法那么简单。
有很多不同的方法可以做到这一点,所以我将只介绍其中一种,以帮助您了解如何完成这项工作的基础知识。
在我们开始查看您可以遵循哪些可能的步骤之前,让我们记住这里的目标是为您的语料库中的每个句子获取一个向量。
如果您不知道 word-embeddings 是什么,我强烈建议您阅读它,但简而言之,这只是 link 预定义词汇表中每个单词的一种方式到给定维度的向量。
例如,您将拥有:
# the vector associated with the word "cat" is the following vector of fixed-length
word_embeddings["cat"] = [0.0014, 0.6710, ..., 0.3281]
现在您已经知道了,下面是您可以遵循的步骤:
标记化 - 你要做的第一件事是 tokenize each of your sentences. This can be done using a NLP library (SpaCy 例如)这将帮助你:
- 拆分单词列表中的每个句子
- 从这些单词中删除所有标点符号并将它们转换为小写
- 删除停用词 - 可选
- lemmatize 所有单词 - 可选
训练一个词嵌入模型 - 现在你已经将每个句子作为一个预处理的词列表,你需要训练一个word-embedding model using your corpus. There are many different algorithms to do that. I would suggest using GenSim and Word2Vec or fastText. What you can also do is using pre-trained word embeddings, like GloVe 或根据 language/context 最适合您的语料库的任何内容。无论哪种方式,您都可以:
- 为你的语料库词汇表中的每个单词准备一个预定义大小的向量
- 为语料库中的每个句子获取大小相等的向量列表
采用加权方法 - 一旦你有了语料库中每个句子的向量列表,主要是因为你的句子长度不同(有些有6 个词,其他一些有 13 个词,等等)你想要做的是为每个句子得到一个向量。为此,您可以简单地对与每个句子中的单词相对应的向量进行加权。您可以:
- 平均所有向量
- 使用 TF-IDF weights 这样的权重让一些词比其他词更重要
- 使用其他加权方法...
训练和测试 - 最后,您要做的就是使用这些向量训练模型,例如使用线性支持向量机 ( SVC),并在测试数据集上测试模型的准确性(您也可以使用验证数据集)。
几个小时以来,我一直在寻找这个特定问题的答案,虽然我学到了很多东西,但我仍然没有弄明白。
我有一个约 70,000 个句子的数据集,其中约 4,000 个句子的子集已被适当分类,其余未分类。目前我正在使用带有 CountVectorizer 和 TfidfTransformer 的 scikit 管道对数据进行矢量化,但是我只是基于 4,000 个句子进行矢量化,然后通过交叉验证测试各种模型。
我想知道是否有一种方法可以使用 Word2Vec 或类似的东西来矢量化整个数据语料库,然后将这些矢量与我的 4,000 个句子子集一起使用。我的目的是通过使用包含语料库中所有语义数据的词向量来提高我的模型预测的准确性,而不仅仅是来自 4,000 个句子的数据。
我目前使用的代码是:
svc = Pipeline([('vect', CountVectorizer(ngram_range=(3, 5))),
('tfidf', TfidfTransformer()),
('clf', LinearSVC()),
])
nb.fit(X_train, y_train)
y_pred = svc.predict(X_test)
其中 X_train 和 y_train 分别是我的特征和标签。我还有一个列表 z_all,其中包括所有剩余的未分类功能。
只要指出正确的方向(或告知这是否可行)就会非常有帮助。
谢谢!
我的意见是,如果您要使用 word2vec 嵌入,请使用一个预训练或使用的通用文本来生成它。
Word2vec 嵌入通常用于为您的文本数据赋予意义和上下文,如果您仅使用您的数据训练嵌入,它可能有偏见并且不代表一种语言。这意味着它的向量没有任何意义。
在嵌入工作之后,你还必须考虑如何处理你的单词,因为一个句子有 1 个或多个单词(嵌入在单词级别工作),而你想用 1 个句子来喂养你的模型-> 1 个矢量。不是 1 个句子 -> N 个向量。
人们通常对这些向量进行平均或相乘,例如,对于句子 "Hello there" 和 5 dims 的嵌入:
你好 -> [0, 0, .2, .3, .8] 那里 -> [.1, .2, 0, 0, .5]
AVG 你好 -> [.05, .1, .1, .15, .65]
这就是您要用于模型的内容!
因此,与其使用 TF-IDF 生成句子向量,不如像这样使用 word2vec,你应该没有任何问题。我已经在一个文本分类项目中工作,我们最终使用了一个嵌入了 ExtraTrees 模型的自我训练的 w2v,并取得了惊人的结果。
我会说答案是是的:您可以使用Word2Vec或其他类似的词嵌入方法来获取数据中每个句子的向量,然后使用这些向量作为线性支持向量机 (SVC) 中的训练和测试数据。
是的,您可以先为大约 70,000 个句子的整个语料库创建这些向量,然后再对您的数据进行实际训练。
然而,它并不像您当前使用的方法那么简单。
有很多不同的方法可以做到这一点,所以我将只介绍其中一种,以帮助您了解如何完成这项工作的基础知识。
在我们开始查看您可以遵循哪些可能的步骤之前,让我们记住这里的目标是为您的语料库中的每个句子获取一个向量。
如果您不知道 word-embeddings 是什么,我强烈建议您阅读它,但简而言之,这只是 link 预定义词汇表中每个单词的一种方式到给定维度的向量。
例如,您将拥有:
# the vector associated with the word "cat" is the following vector of fixed-length
word_embeddings["cat"] = [0.0014, 0.6710, ..., 0.3281]
现在您已经知道了,下面是您可以遵循的步骤:
标记化 - 你要做的第一件事是 tokenize each of your sentences. This can be done using a NLP library (SpaCy 例如)这将帮助你:
- 拆分单词列表中的每个句子
- 从这些单词中删除所有标点符号并将它们转换为小写
- 删除停用词 - 可选
- lemmatize 所有单词 - 可选
训练一个词嵌入模型 - 现在你已经将每个句子作为一个预处理的词列表,你需要训练一个word-embedding model using your corpus. There are many different algorithms to do that. I would suggest using GenSim and Word2Vec or fastText. What you can also do is using pre-trained word embeddings, like GloVe 或根据 language/context 最适合您的语料库的任何内容。无论哪种方式,您都可以:
- 为你的语料库词汇表中的每个单词准备一个预定义大小的向量
- 为语料库中的每个句子获取大小相等的向量列表
采用加权方法 - 一旦你有了语料库中每个句子的向量列表,主要是因为你的句子长度不同(有些有6 个词,其他一些有 13 个词,等等)你想要做的是为每个句子得到一个向量。为此,您可以简单地对与每个句子中的单词相对应的向量进行加权。您可以:
- 平均所有向量
- 使用 TF-IDF weights 这样的权重让一些词比其他词更重要
- 使用其他加权方法...
训练和测试 - 最后,您要做的就是使用这些向量训练模型,例如使用线性支持向量机 ( SVC),并在测试数据集上测试模型的准确性(您也可以使用验证数据集)。