keras - 如何向量化单词?
问题描述
从 Keras 的文档中:
主输入将接收标题,作为整数序列(每个整数编码一个单词)。整数将在 1 到 10,000 之间(10,000 个单词的词汇表),序列长度为 100 个单词。
这里对单词进行编码的方法似乎只是简单地使用构建词汇表中的单词索引来表示单词。如果训练数据中有“n”个单词,那么向量化的整数i将来自 [0, n-1]。
但在 scikit-learn 的 CountVectorizer 中:
此实现使用 scipy.sparse.csr_matrix 生成计数的稀疏表示。
这两种词向量化方式之间有什么联系吗?计数向量表示会比基于索引的向量化更有效吗?CountVectorizer 考虑了词频。
解决方案
这是两个完全不同的东西。Keras 及其索引和嵌入适用于深度学习,scikit-learn 及其CountVectorizer
来自经典机器学习。
在 Keras(或一般的深度学习框架)中,单词通常由整数索引表示。然后这些索引用作嵌入矩阵中的键,以获取要在神经网络中使用的相应词嵌入。在这种情况下,所有向量都是密集的,因为神经网络使用密集的连续表示。
CountVectorizer
在 scikit-learn 中,设计用于表示句子或文档(不是真正孤立的单词)。给定一个训练语料库,它创建语料库中出现的单词的词汇表(使用该fit
方法)。然后,一个句子或一个文档被表示为其中出现的单词的频率向量(当调用该transform
方法时)。由于大多数词汇表不会出现在单个文档中,因此许多值都是零,因此使用稀疏向量是有意义的。
这种表示对传统的机器学习很有意义。通过深度学习,您将改为使用嵌入、平均它们,然后在它们之上使用 RNN/CNN 或其他方法。
推荐阅读
- concurrency - java中的并发grpc调用
- linux - 从官方 maven 映像的 docker 容器内执行 mvn 时权限被拒绝
- windows - 复制文件及其子文件夹
- javascript - 从用户端上传个人资料图片。view.py 中的任何更新方法都可以使用 HTML 来实现吗?
- c - 如何声明函数指针参数
- javascript - 如何单独识别无序列表的元素(由 JSON 对象生成)?
- java - 在 bash 环境中的 Intellij IDE 中启动 spring boot
- python - 如何训练张量流/机器学习应该匹配哪些字符串?
- docker - 如何在 Ubuntu 18.04 上运行 bdist_wheel?
- mysql - 在 SQL 查询中转换列名与转换值有何不同