文本数据需要进行特殊准备,然后才能用于预测建模。
文本必须经过解析以去除单词,这称为分词。然后需要将单词编码为整数或浮点值,以用作机器学习算法的输入,这称为特征提取(或向量化)。
scikit-learn 库提供了易于使用的工具来对文本数据执行分词和特征提取。
在本教程中,您将确切了解如何使用 scikit-learn 在 Python 中为预测建模准备文本数据。
完成本教程后,您将了解:
- 如何使用 CountVectorizer 将文本转换为词频向量。
- 如何使用 TfidfVectorizer 将文本转换为词频向量。
- 如何使用 HashingVectorizer 将文本转换为唯一整数。
通过我的新书《自然语言处理深度学习》启动您的项目,包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

如何使用 scikit-learn 为机器学习准备文本数据
图片来源:Martin Kelly,保留部分权利。
词袋模型
在使用机器学习算法时,我们无法直接处理文本。
相反,我们需要将文本转换为数字。
我们可能希望对文档进行分类,因此每个文档都是我们预测算法的“输入”,而类标签是“输出”。算法将数字向量作为输入,因此我们需要将文档转换为固定长度的数字向量。
在机器学习中,一种简单有效的文本文档思考模型称为词袋模型,或 BoW。
该模型之所以简单,是因为它抛弃了单词的所有顺序信息,而专注于文档中单词的出现。
这可以通过为每个单词分配一个唯一的数字来完成。然后,我们看到的任何文档都可以编码为固定长度的向量,其长度等于已知单词的词汇表。向量中每个位置的值可以用编码文档中每个单词的计数或频率填充。
这就是词袋模型,我们只关注那些表示编码文档中存在哪些单词或存在的程度,而不包含任何顺序信息的编码方案。
有关词袋模型的更多信息,请参阅教程
有许多方法可以扩展这种简单方法,既可以通过更好地澄清什么是“单词”,也可以通过定义在向量中对每个单词进行编码的内容。
scikit-learn 库提供了 3 种不同的方案,我们可以使用,我们将简要介绍每种方案。
需要深度学习处理文本数据的帮助吗?
立即参加我的免费7天电子邮件速成课程(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
使用 CountVectorizer 进行词计数
CountVectorizer 提供了一种简单的方法,既可以对文本文档集合进行分词并构建已知单词的词汇表,也可以使用该词汇表对新文档进行编码。
您可以按如下方式使用它:
- 创建 CountVectorizer 类的一个实例。
- 调用 fit() 函数以从一个或多个文档中学习词汇表。
- 根据需要对一个或多个文档调用 transform() 函数,将每个文档编码为向量。
返回一个编码向量,其长度等于整个词汇表,并包含每个单词在文档中出现的次数的整数计数。
由于这些向量将包含许多零,我们称之为稀疏向量。Python 在 scipy.sparse 包中提供了一种有效处理稀疏向量的方法。
从 transform() 调用返回的向量将是稀疏向量,您可以通过调用 toarray() 函数将它们转换回 numpy 数组,以查看并更好地理解发生了什么。
下面是使用 CountVectorizer 进行分词、构建词汇表,然后编码文档的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from sklearn.feature_extraction.text import CountVectorizer # 文本文档列表 text = ["The quick brown fox jumped over the lazy dog."] # 创建转换器 vectorizer = CountVectorizer() # 分词并构建词汇表 vectorizer.fit(text) # 总结 print(vectorizer.vocabulary_) # 编码文档 vector = vectorizer.transform(text) # 总结编码向量 print(vector.shape) print(type(vector)) print(vector.toarray()) |
上面,您可以看到我们通过调用访问词汇表以查看具体进行了哪些分词。
1 |
print(vectorizer.vocabulary_) |
我们可以看到所有单词默认都已小写,并且标点符号被忽略。这些以及分词的其他方面都可以配置,我鼓励您查阅 API 文档中的所有选项。
运行示例首先打印词汇表,然后打印编码文档的形状。我们可以看到词汇表中共有 8 个单词,因此编码向量的长度为 8。
然后我们可以看到编码向量是一个稀疏矩阵。最后,我们可以看到编码向量的数组版本,显示除“the”(索引和 ID 7)出现 2 次外,其他每个单词都出现 1 次。
1 2 3 4 |
{'dog': 1, 'fox': 2, 'over': 5, 'brown': 0, 'quick': 6, 'the': 7, 'lazy': 4, 'jumped': 3} (1, 8) <class 'scipy.sparse.csr.csr_matrix'> [[1 1 1 1 1 1 1 2]] |
重要的是,相同的向量化器可用于包含词汇表中未包含的单词的文档。这些单词被忽略,并且在结果向量中不给出计数。
例如,下面是一个使用上述向量化器编码包含一个词汇表中的单词和一个不在词汇表中的单词的文档的示例。
1 2 3 4 |
# 编码另一个文档 text2 = ["the puppy"] vector = vectorizer.transform(text2) print(vector.toarray()) |
运行此示例会打印编码稀疏向量的数组版本,显示词汇表中一个单词出现一次,而词汇表中没有的另一个单词则完全被忽略。
1 |
[[0 0 0 0 0 0 0 1]] |
然后可以将编码向量直接用于机器学习算法。
使用 TfidfVectorizer 进行词频计算
词计数是一个很好的起点,但非常基础。
简单计数的一个问题是,“the”等某些词会出现很多次,它们的巨大计数在编码向量中不会很有意义。
另一种方法是计算词频,迄今为止最流行的方法称为 TF-IDF。这是一个缩写,代表“Term Frequency – Inverse Document Frequency”,它们是分配给每个单词的结果分数的分量。
- 词频 (Term Frequency):这总结了一个给定词在文档中出现的频率。
- 逆文档频率 (Inverse Document Frequency):这会降低在许多文档中频繁出现的词的权重。
不深入数学细节,TF-IDF 是词频分数,它试图突出更有趣的词,例如在一个文档中频繁出现但在所有文档中不频繁出现的词。
TfidfVectorizer 将对文档进行分词,学习词汇表和逆文档频率权重,并允许您编码新文档。或者,如果您已经学习了 CountVectorizer,您可以将其与 TfidfTransformer 一起使用,以仅计算逆文档频率并开始编码文档。
与 CountVectorizer 一样,使用相同的创建、拟合和转换过程。
下面是使用 TfidfVectorizer 从 3 个小文档中学习词汇表和逆文档频率,然后编码其中一个文档的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from sklearn.feature_extraction.text import TfidfVectorizer # 文本文档列表 text = ["The quick brown fox jumped over the lazy dog.", "The dog.", "The fox"] # 创建转换器 vectorizer = TfidfVectorizer() # 分词并构建词汇表 vectorizer.fit(text) # 总结 print(vectorizer.vocabulary_) print(vectorizer.idf_) # 编码文档 vector = vectorizer.transform([text[0]]) # 总结编码向量 print(vector.shape) print(vector.toarray()) |
从文档中学习了 8 个单词的词汇表,并且每个单词在输出向量中都被分配了一个唯一的整数索引。
为词汇表中的每个单词计算逆文档频率,将最低分数 1.0 分配给最常观察到的单词:“the”(索引 7)。
最后,第一个文档被编码为 8 元素稀疏数组,我们可以查看每个单词的最终得分,“the”、“fox”和“dog”与其他词汇表中的单词具有不同的值。
1 2 3 4 5 6 |
{'fox': 2, 'lazy': 4, 'dog': 1, 'quick': 6, 'the': 7, 'over': 5, 'brown': 0, 'jumped': 3} [ 1.69314718 1.28768207 1.28768207 1.69314718 1.69314718 1.69314718 1.69314718 1. ] (1, 8) [[ 0.36388646 0.27674503 0.27674503 0.36388646 0.36388646 0.36388646 0.36388646 0.42983441]] |
分数被归一化为 0 到 1 之间的值,然后编码的文档向量可以直接用于大多数机器学习算法。
使用 HashingVectorizer 进行哈希处理
计数和频率可能非常有用,但这些方法的一个限制是词汇表可能变得非常大。
这反过来将需要用于编码文档的大向量,并对内存提出高要求并减慢算法速度。
一个巧妙的解决方法是使用单词的单向哈希将其转换为整数。巧妙之处在于不需要词汇表,并且您可以选择任意长的固定长度向量。缺点是哈希是单向函数,因此无法将编码转换回单词(这对于许多监督学习任务可能无关紧要)。
HashingVectorizer 类实现了这种方法,可用于一致地哈希单词,然后根据需要对文档进行分词和编码。
下面的示例演示了 HashingVectorizer 编码单个文档。
选择了任意固定长度的向量大小为 20。这对应于哈希函数的范围,其中小值(如 20)可能导致哈希冲突。回想一下计算机科学课程,我相信有一些启发式方法可以根据估计的词汇表大小选择哈希长度和冲突概率。
请注意,此向量化器不需要在训练数据文档上调用 fit。相反,实例化后,它可以直接用于开始编码文档。
1 2 3 4 5 6 7 8 9 10 |
from sklearn.feature_extraction.text import HashingVectorizer # 文本文档列表 text = ["The quick brown fox jumped over the lazy dog."] # 创建转换器 vectorizer = HashingVectorizer(n_features=20) # 编码文档 vector = vectorizer.transform(text) # 总结编码向量 print(vector.shape) print(vector.toarray()) |
运行示例将样本文档编码为 20 元素的稀疏数组。
编码文档的值默认对应于归一化的词计数,范围为 -1 到 1,但可以通过更改默认配置使其成为简单的整数计数。
1 2 3 4 5 |
(1, 20) [[ 0. 0. 0. 0. 0. 0.33333333 0. -0.33333333 0.33333333 0. 0. 0.33333333 0. 0. 0. -0.33333333 0. 0. -0.66666667 0. ]] |
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
自然语言处理
scikit-learn
- 第 4.2 节 特征提取,scikit-learn 用户指南
- scikit-learn 特征提取 API
- 处理文本数据,scikit-learn 教程
类 API
- CountVectorizer scikit-learn API
- TfidfVectorizer scikit-learn API
- TfidfTransformer scikit-learn API
- HashingVectorizer scikit-learn API
总结
在本教程中,您学习了如何使用 scikit-learn 为机器学习准备文本文档。
在这些示例中,我们只触及了皮毛,我想强调的是,这些类有许多配置细节可以影响文档的分词,值得探索。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你能告诉我如何在 R 中进行机器学习和特征选择吗!
请看这篇文章
https://machinelearning.org.cn/feature-selection-with-the-caret-r-package/
嗨,布朗利博士,
祝贺这篇精彩的文章。您知道有什么智能解析 HTML 文档(DOM)以用于 ANNs 的技术吗?这些家伙在这篇论文中做到了(http://proceedings.mlr.press/v70/shi17a/shi17a.pdf),但他们没有具体说明如何做。
非常感谢!
不,抱歉,我没有研究过。
嗨,你知道如何解析 DOM 以与 ANN 配合使用吗?
运行这段代码时遇到了一个错误
^
SyntaxError: invalid syntax
这是因为我使用的是 Python 2.7 吗?
该代码是使用 Python 2.7 开发的,也应该可以在 Python 3.5 中运行。
确认您复制了所有代码并保留了缩进。
我应该把学费交给你,谢谢你的所有精彩内容。
谢谢 Eric!
请问我有一个作业,需要从新闻提要中创建一个搜索引擎。解析 RSS 提要后,如何从这些链接中提取单词?
也许这会有帮助。
https://machinelearning.org.cn/clean-text-machine-learning-python/
你好先生,
机器学习如何用于进行基于调查的研究?
我不知道。也许在分析中以某种方式使用?
你好先生,
我正在尝试根据一些数字特征(权重、数量、一些派生特征)以及文本地址数据作为输入来将送货地址分类为住宅和商业。我应该对文本地址数据应用 CountVectorizer 或 Tfidf 吗,以将其转换为数字特征。或者其他任何方法。我计划使用决策树分类器。
尝试多种方法,看看哪种效果最好。
非常感谢您。我正在从事我的项目,并从 HTML 网页的标签中提取数据。
我需要将每个标签中的单词分配为特征。例如,标题标签中的 play 与 header 标签或 anchor 标签中的 play 不同。有什么想法吗?
也许从词袋模型开始,然后尝试词嵌入 + 神经网络,看看效果是否更好。
嗨,先生,您能用一个好的解释来解释一下我们为什么要使用这行代码(from sklearn.modelselection traindata…)吗?
具体哪一行?
嗨,Jason博士,
我如何向当前向量添加新列(或特征)?例如:添加每个文档中拼写错误单词数量的向量。
谢谢
您可能希望将文档表示与该信息分开,并将它们作为两个单独的输入馈送到模型(例如 Keras 中的多输入模型)。
我有一个问题。我有一个包含一些相似兴趣主题的文本文件集群。
我想使用 Python 将这些文档作为文本文件输入到 sklearn 工具中。
您能告诉我流程吗
该过程就是上面的博客文章,这没有帮助吗?
这是一篇很棒的文章。对我的项目有很大帮助。我有一个后续问题:如果我想要所有现有文档的向量怎么办?有没有比这样的 for 循环更有效的方法
for j in len(docs)
vector = vectorizer.transform([text[j]])
我希望将其转换为一个大型数据集,然后将其呈现给 ML 算法
我认为转换可以接受整个文档。
为什么 lazy 和 dog 都得了 1.28768207 分,这个分数介于赋给单词“the”的低分 1.0 和赋给单词 fox 的高分 1.69314718 之间;但是
在分数归一化到 0 到 1 之间之后,分配的分数不再遵循相同的模式……lazy 和 dog 的值 [0.276] 不再介于单词“fox”[0.363] 和“the”[0.429] 的值之间;lazy 和 dog 的值位于分数范围的一端。
就此而言,编码器最初是如何决定给 dog 和 fox 分配不同的分数,而它们出现的次数是相同的?
感谢您分享您的知识。
好问题,拉斯。
我建议查看参考文献并阅读 TF/IDF 的计算。
拉斯 –
获得 1.28768207 分的单词是“dog”和“fox”。分词器从 0 开始计数。
编码向量中模式中断的原因是它仅适用于第一个文档,请注意 [text[0]]。在该文档中,“the”这个词出现了两次,不像所有其他词,因此尽管它在文档之间很常见并因此受到惩罚,但它在该文档中也更常见,因此为此获得了分数。有几点可以尝试,看看这是如何工作的……首先,改变索引以查看不同文档的特征向量如何工作,例如通过执行 [text[1]]。其次,在第一个文档中再添加一个“the”,或者删除一个,然后看看会发生什么。
非常棒的文章。你认为在应用这些技术之前对词汇表进行词干提取会产生更好的性能吗?
它可能会减少词汇量,试试看。
你好 ….
我需要问你一个问题……
我正在考虑研究“使用机器学习算法对蜂窝网络服务提供商进行推文情感分析”……您能帮我一下吗……处理这样的数据是否可能……我从 Twitter 抓取了 2000 条推文,
我正面临特征提取的问题,我不知道如何为这些数据决定特征……如果可以的话,请帮助我……
这篇文章可能会作为模板帮助您
https://machinelearning.org.cn/develop-word-embedding-model-predicting-movie-review-sentiment/
词语在文本中的位置?这不重要吗?在向量表示中是如何处理的?
否则,如果词语顺序不同,具有相同词语和频率的两个文本将导致相同的向量
由于我是机器学习新手,请帮助我理解
对于某些模型(如 LSTMs),它是如此,而对于其他模型(如词袋模型),则不是。
嗨,Jason,
我有一个关于 HashingVectorizer() 的问题。如何用它进行在线学习?它像 tfidf 那样学习文本词汇表吗?此外,当包含一些未见过单词的新文本出现时会发生什么?我该怎么处理?我应该等待一批数据,然后调用 HashingVectorizer() 上的 transform() 并将其馈送给新的文本样本。有关带有“多标签”输出的文本文档在线学习的任何参考文献/视频都会很棒。
理想情况下,词汇表会在一开始就定义好。
否则,您可以以在线方式使用它,只要您对词汇表的大小有一个预期,以确保哈希函数不会发生太多冲突。
非常好的文章。谢谢。
谢谢,很高兴对您有帮助。
嗨,Jason,
首先,感谢您这篇出色的文章,让我可以实际学习 TF/IDF。我有一个关于它的问题。我如何获取词汇表中的术语列表及其相关文档频率。在您的示例中,“The”在所有三个文档中都出现了,所以“The”的 DF 是 3,同样“Dog”和“Fox”的 DF 也是 2。
此致
查看对象上的属性,参见此处
https://scikit-learn.cn/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
杰森,我喜欢你的文章!
我有一个问题,关于将名称列表转换为向量并将其用作分类器中的特征。我不确定使用哪种方法,但我认为哈希会很合适。我的问题是,由于可能的名称数量很多,这不会创建非常稀疏的向量,使我的分类器难以从中学习吗?此外,对于这种情况,我是否应该考虑其他方法?
也许可以比较词袋模型和 word2vec 方法,看看哪种最适合您的特定问题。
嗨,Jason,
首先感谢您这篇精彩的文章。我有两个问题
1. 假设我们有一个类似于 Kaggle 数据的数据集:https://www.kaggle.com/aaron7sun/stocknews/data。我们如何处理一些“N/A”数据?
2. 第二个问题是关于停用词。我想使用 NLTK 删除文本中的停用词,但不幸的是 NLTK 没有波兰语单词。我如何使用我自己的词典?
此致,
卡米尔
我在这里提供了如何处理缺失数据的建议
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-missing-data
您可以使用自己的词汇表,也许 NLTK 在其他语言中也有停用词。值得检查一下。
对于 HashVectorizer 和 countvectorizer 中的示例,我无法理解向量中的值是如何得出的。我理解 tf 和 idf。您能至少说明一个术语,它是如何计算出值的。在 hashvectorizer 的示例中,只有一个文档。
哈希方法使用从字符串到整数的哈希函数。
计数使用文档中每个单词的出现次数。
很棒的文章!我有一个问题。假设我有一个包含数字和文本元素的数据集。我只想将 TF-IDF(例如)应用于我的文本列,然后将其附加到我的数据集,以便我可以使用我的数字和分类数据(现在已转换)进行训练。
例如
col 1 col 2
this is a text 4.5
this is also a text 7.5
我只想将 TF-IDF 应用于我的 col 1,以便我可以使用 ML 算法同时处理 col 1 和 col2。
结果
col 1 col2
(TF-IDFResult) 4.5
(TF-IDFResult) 7.5
您是如何实现这一点的?
谢谢!
也许尝试两个模型并集成它们的预测。
也许尝试一个具有两个输入的神经网络。
我也有同样的问题。
我在想是否可以分离数据(在第 1 列应用 TF-IDF),然后将结果与第 2 列连接起来,作为模型输入准备的一部分。
好的,试试看吧。
嗨,杰森博士,
这是一篇非常好的文章,我一直在寻找这样的解释。我非常喜欢它,它为我澄清了许多观点。
我有一个疑问,因为我想从许多文件中加载文本以生成词袋,疑问是
如果我有许多文本文件(包含两个类别或类别)来生成单个词袋,我应该将它们全部单独加载吗?还是将所有文本合并到一个文本文件中,然后加载一个包含所有文本的单个文本文件,然后生成词袋?
致以最诚挚的问候。
谢谢。
也许您可以将所有文件加载到内存中,然后准备 BoW 模型?
谢谢,我会尝试的。
你好 Jason,首先感谢你的精彩文章,我从中学到了很多!
现在我正在处理日志分析问题。在这个问题中,单词的顺序是一个非常重要的特征,例如日志内容如“No such file or directory”,有些单词总是以某种顺序一起出现。
我的问题是,我可以使用哪种特征提取方法来编码这种顺序信息?
非常感谢!
我推荐使用词嵌入作为一种分布式表示,它允许您保留单词顺序。
https://machinelearning.org.cn/what-are-word-embeddings/
我们如何读取一个文件夹中的文本文档,并将其应用于文章中提到的步骤,尤其是简历?
从读取一个文件开始,然后从中扩展。
关于词袋有两个问题一直困扰着我。
第一个问题是我的源文件有两列,一列是电子邮件内容,是文本格式,另一列是发送电子邮件的国家名称(3个不同的国家),我想标记电子邮件是否是垃圾邮件,这里假设来自不同国家的电子邮件也影响电子邮件是否是垃圾邮件。因此,除了词袋,我还想添加一个特征,即国家,问题是 sklearn 中是否有办法实现它。
另一个问题是除了词袋之外,如果我还想考虑单词的位置,例如如果单词出现在第一个句子中,我想降低它的权重,如果单词出现在最后一个句子中,我想增加它的权重,sklearn 中是否有办法实现它。
谢谢。
国家/地区将是单独的输入,也许是独热编码。您可以将其与 BoW 特征向量连接起来,作为准备模型输入的一部分。
序列预测方法可以处理单词的位置,例如 LSTM。
Jason博士您好,
我有一组 PDF 文档,我想读取 PDF 文档的内容,并使用 PDF 的某些段落通过交互式机器人提供答案。我如何让机器人学习文本内容?请在这里帮助我。
听起来这是一个非常有挑战性的研究问题,我无法在博客评论中简单回答,抱歉。
先生,好作品,
我如何从 PDF 文件中提取特定的文本,如名称、日期、值?
听起来你对命名实体识别感兴趣。
https://zh.wikipedia.org/wiki/Named-entity_recognition
很好的解释!您在这里指的是文档可以是包含词袋(句子/推文)的数据框/列表吗?
另外,在您的所有书中,如果拥有 Python 编程知识,应该从哪里开始?
我们可以从《掌握机器学习算法》或《使用 Python 进行机器学习》或《线性代数》(最不推荐)开始吗,因为我们可能没有时间?
这里是使用 Python 进行机器学习的一个很好的起点。
https://machinelearning.org.cn/start-here/#python
如果您想开始使用 Python 进行文本深度学习,可以从这里开始。
https://machinelearning.org.cn/start-here/#nlp
你好 Jason,
你能帮我吗?我有一个大数据集,大约有 400 万条文本。我不能使用纯粹的 TF-IDF。所以,首先,我使用哈希。但是,我也需要使用 TF-IDF。我如何将这两种方法结合起来?是否可以将稀疏矩阵而不是语料库作为 TF-IDF 的输入?
也许您可以使用渐进式加载,并手动从数据集中构建 tf-idf?
嗨,我正在使用雅虎的数据集,它是 CSV 格式。我已经对数据集进行了分词,并删除了词干和停用词。我使用 skip gram 模型生成了向量值。现在如何将可变基数向量转换为固定长度向量?请在这方面帮助我。
你具体指的是什么?
你好先生,
我想提取与推文相关的情绪,为此我使用了 Tfid Vectorizer 将每个单词转换为数字,但推文的长度会变化,因此每个向量数组的长度也会变化,那么我如何将其应用于我的模型,例如 SVM?
谢谢你
如果您使用向量化表示,您将拥有固定大小的词汇表,但推文的长度可以随意变化。
你好。如何进行训练和测试文本数据??
我想要一个示例代码
你可以从这里开始
https://machinelearning.org.cn/start-here/#nlp
你好 Jason,
谢谢你的好教程。
我正在进行一个文本分类任务,将 10 个不同的类别进行分类。我有一个训练数据集,其中包含每个类别的文本文档。我手中有一份针对每个类别预定义的特征(词/术语)列表,我想将这些特征添加到训练数据集中,以便在 ML 模型训练期间成为最重要的特征。
你有什么办法可以做到吗?
谢谢你,
是的,您可以删除所有其他单词,只保留您想包含的单词,然后对分类问题进行建模。
嗨,Jason,
协方差和共现矩阵有什么区别?我们如何从 Python 中的文本语料库/文本数据中获取共现矩阵?
谢谢
好问题,抱歉我没有共现矩阵的例子。
在使用 TfidfVectorizer 对训练和测试样本进行向量化后,训练和测试样本将具有不同数量的特征。因此,当您应用训练好的模型对验证样本进行预测时,它会抱怨验证样本没有足够的特征。您有什么建议来解决这个问题?谢谢!!!!
您必须使用相同的词汇表来准备这两个数据集,例如,对训练数据进行拟合,然后对训练和测试数据进行转换。
你的教程很有帮助
谢谢,很高兴听到这个。
非常感谢 Jason,你的教程对我帮助很大,我希望你能继续分享更多,再次非常感谢你。
谢谢,很高兴听到这个。
非常感谢您的帮助
我想问两个基于我工作的问题,我目前正在尝试预处理带有已知标签的 Java 源代码,并将输出馈送给我的模型以解决分类问题,
我可以使用这些技术对 Java 源代码进行预处理吗,或者是否有更适合我工作的技术
如果可以,我应该根据什么来选择适合我研究的向量化器
再次非常感谢这篇文章
抱歉,我对代码预处理以进行建模了解不多。
也许可以查阅相关论文,看看常见的方法。
你的解释非常清楚,我很喜欢。我有一个问题,我如何在包含阿拉伯语数据集的文本文件中应用它?你能帮帮我吗?
好问题,抱歉我没有处理阿拉伯文本的例子。
非常感谢,兄弟,做得好
很高兴它有帮助。
我是数据科学(机器学习)的初学者。在我最近的课程中,我使用了 anaconda-paython 并使用了一些算法进行机器学习。
目前我是全栈开发人员(.Net、Angular、sql、firebase 等)
我想提升自己,学习数据科学-机器学习。
您能为初学者推荐一些教程吗?
是的,您可以从这里开始
https://machinelearning.org.cn/start-here/#getstarted
真的很有帮助,谢谢。
我的问题是,如何插入大型语料库而不是您作为示例使用的小文本文档。
您可以使用相同的代码,并加载您的大型语料库。
也许我没有理解你的问题?
先生,我们如何加载大型语料库用于 CountVectorizer?
和小型语料库一样。也许我没有理解您的问题?
非常感谢,TFIDF 可以应用于已经应用了 Hash trick 的文档吗?为什么特征向量中会有负数?
不知道,抱歉。
我有一个关于使用以下方式创建 CountVectorizer 类实例的问题
vectorizer = CountVectorizer(tokenizer=word_tokenize)
您能澄清一下“tokenizer=word_tokenize”的含义吗?
vectorizer = CountVectorizer 和 vectorizer = CountVectorizer(tokenizer=word_tokenize) 之间有什么区别?
非常感谢您的建议。
根据 API,您可以指定一个函数来执行分词
https://scikit-learn.cn/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html
你好,又一篇很棒的文章。
我想问,是否可以在 TfidfVectorizer 示例中更改词汇表的大小?
提前感谢你
谢谢。
是的,它从训练数据中获取词汇表的大小。
嗨,博士。
正如您在我的网站上所说,对于每个文本分类,我们都应该使用一种方法将文本表示为向量,以便准备好将其用作机器学习的输入。
我知道我们应该使用 BOW 或 Word2vec 等方法,但我的问题是我们应该如何将特征表示为向量?假设我想做情感分析并有一个像表情符号词典这样的特征,我应该如何将其表示为向量?
用 word2vec??
请帮帮我
每个表情符号都是一个可以在文本中出现的“单词”。它在数据集中与其他单词一样表示。
嗨,好文章
我有一个疑问
fit() 函数的确切用途是什么?
拟合模型。
具体来说,它运行一个优化算法,以找到最佳捕获数据集中输入和输出之间关系的模型参数。
那么在这种情况下,vectorizer.fit(text) 是在创建一个字典吗?
这如何帮助 transform() 函数?
是的,它定义了词汇表。每次执行 transform() 时,它都受限于 fit 调用时所见的词汇表。
感谢您的实用博客。我有点困惑。请帮忙!
正如您所说:……然后需要将单词编码为整数或浮点值,以用作机器学习算法的输入,这称为特征提取(或向量化)。
我知道一种流行的方法是 BOW,我们可以用它来获得数字表示,对吗?
现在我的问题是:想象一下我想做一些文本分类,我的一个特征是:表情符号图标的数量!显然,通过一些代码,我可以确定每个包含表情符号图标的句子,问题是如何部署这个特征?换句话说,通过什么方法可以将这个特征以数字方式表示,使其适合馈送给 ML 算法?
是的,您可以将这些静态特征与文本的数字表示一起使用。例如,只是更多的特征。模型无法区分。
嗨!
很棒的帖子。有没有办法在作为列表而不是字符串的语料库上使用 CountVectorizer?
嗯,你具体指的是什么?你能详细说明一下吗?
嘿 Jason,很棒的文章。
我想知道您是否可以演示如何将 NLP 与时间序列分析(ARIMA 模型)结合起来,就像您在这篇文章中介绍的那样?https://machinelearning.org.cn/make-sample-forecasts-arima-python/
在线资源很少讨论这个问题,很多错误都来自将 CountVectorizer 与 ARIMA 结合使用
感谢您的建议。
在 CountVectorizer 部分,代码包括“print(vectorizer.vocabulary_)”,它返回一个由令牌及其在数组中的相应索引组成的字典。见下文。
{'dog': 1, 'fox': 2, 'over': 5, 'brown': 0, 'quick': 6, 'the': 7, 'lazy': 4, 'jumped': 3}
令牌似乎是根据字母数字顺序分配索引的。这个顺序还有其他意义吗?
据我所知,没有。
我们如何为模型准备的“X”传递两列?
或许可以分别准备每个变量,然后在建模之前将结果连接起来?
嗨,Jason!我正在尝试对我的 train_x 数据框 (4064, 1) 执行 tfidf 向量化。但是,在调用 fit_transform(train_x).toarray() 后,结果矩阵的大小为 (1,1),这没有意义。为什么会这样?
也许你的输入矩阵形状不对?转置了?