您无法将原始文本直接输入深度学习模型。
文本数据必须编码为数字,才能用作机器学习和深度学习模型的输入或输出。
Keras 深度学习库提供了一些基本工具来帮助您准备文本数据。
在本教程中,您将了解如何使用 Keras 准备文本数据。
完成本教程后,您将了解:
- 关于可用于快速准备文本数据的便捷方法。
- Tokenizer API,可以根据训练数据进行拟合,并用于对训练、验证和测试文档进行编码。
- Tokenizer API 提供的 4 种不同文档编码方案的范围。
开始您的项目,阅读我的新书《自然语言处理深度学习》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。

如何为 Keras 深度学习准备文本数据
照片由 ActiveSteve 拍摄,保留部分权利。
教程概述
本教程分为4个部分,它们是:
- 使用 text_to_word_sequence 分词。
- 使用 one_hot 进行编码。
- 使用 hashing_trick 进行哈希编码。
- Tokenizer API
需要深度学习处理文本数据的帮助吗?
立即参加我的免费7天电子邮件速成课程(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
使用 text_to_word_sequence 分词
处理文本的第一步是将其分解为单词。
单词称为标记(token),将文本分解为标记的过程称为分词(tokenization)。
Keras 提供了 text_to_word_sequence() 函数,可用于将文本分解为单词列表。
默认情况下,此函数会自动执行 3 项操作:
- 按空格分词(split=” “)。
- 过滤标点符号(filters=’!”#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n’)。
- 将文本转换为小写(lower=True)。
您可以通过将参数传递给函数来更改任何这些默认设置。
以下是使用 text_to_word_sequence() 函数将文档(本例中为简单字符串)分解为单词列表的示例。
1 2 3 4 5 6 |
from keras.preprocessing.text import text_to_word_sequence # 定义文档 text = 'The quick brown fox jumped over the lazy dog.' # 分词 result = text_to_word_sequence(text) print(result) |
运行示例将创建一个包含文档中所有单词的数组。将打印单词列表以供查看。
1 |
['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'] |
这是一个很好的第一步,但在使用文本之前还需要进一步的预处理。
使用 one_hot 进行编码
将文档表示为一系列整数值是一个常见的做法,其中文档中的每个单词都表示为一个唯一的整数。
Keras 提供了 one_hot() 函数,可用于一步对文本文档进行分词和整数编码。名称表明它将创建一个文档的独热编码,但事实并非如此。
相反,该函数是下一节所述的 hashing_trick() 函数的包装器。该函数返回文档的整数编码版本。由于使用了哈希函数,可能会发生冲突,并非所有单词都会被分配唯一的整数值。
与上一节的 text_to_word_sequence() 函数一样,one_hot() 函数会将文本转换为小写、过滤标点符号,并根据空格分词。
除了文本之外,还必须指定词汇量大小(总单词数)。这可以是文档中的总单词数,也可以更多,如果您打算对包含其他单词的其他文档进行编码。词汇量的大小定义了哈希函数从哪个空间中哈希单词。理想情况下,这应该比词汇量大一些(例如 25%)以尽量减少冲突的数量。默认情况下,会使用“hash”函数,尽管如下一节所示,在直接调用 hashing_trick() 函数时可以指定备用的哈希函数。
我们可以使用上一节的 text_to_word_sequence() 函数将文档分解为单词,然后使用集合来表示文档中唯一的单词。该集合的大小可用于估算单个文档的词汇量大小。
例如
1 2 3 4 5 6 7 |
from keras.preprocessing.text import text_to_word_sequence # 定义文档 text = 'The quick brown fox jumped over the lazy dog.' # 估算词汇量大小 words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size) |
我们可以将此与 one_hot() 函数结合起来,并对文档中的单词进行独热编码。完整的示例列在下面。
词汇量大小增加了三分之一,以最大程度地减少哈希单词时的冲突。
1 2 3 4 5 6 7 8 9 10 11 |
from keras.preprocessing.text import one_hot from keras.preprocessing.text import text_to_word_sequence # 定义文档 text = 'The quick brown fox jumped over the lazy dog.' # 估算词汇量大小 words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size) # 整数编码文档 result = one_hot(text, round(vocab_size*1.3)) print(result) |
运行示例后,首先打印词汇量大小为 8。然后将编码后的文档作为整数编码单词的数组打印出来。
1 2 |
8 [5, 9, 8, 7, 9, 1, 5, 3, 8] |
使用 hashing_trick 进行哈希编码
整数和计数基编码的一个限制是它们必须维护单词及其到整数的映射的词汇表。
这种方法的一种替代方法是使用单向哈希函数将单词转换为整数。这避免了跟踪词汇表的需要,速度更快,所需的内存更少。
Keras 提供了 hashing_trick() 函数,该函数可以像 one_hot() 函数一样对文档进行分词和整数编码。它提供了更大的灵活性,允许您将哈希函数指定为“hash”(默认值)或其他哈希函数,例如内置的 md5 函数或您自己的函数。
下面是使用 md5 哈希函数对文档进行整数编码的示例。
1 2 3 4 5 6 7 8 9 10 11 |
from keras.preprocessing.text import hashing_trick from keras.preprocessing.text import text_to_word_sequence # 定义文档 text = 'The quick brown fox jumped over the lazy dog.' # 估算词汇量大小 words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size) # 整数编码文档 result = hashing_trick(text, round(vocab_size*1.3), hash_function='md5') print(result) |
运行示例将打印词汇量大小和整数编码的文档。
我们可以看到,使用不同的哈希函数会导致与上一节的 one_hot() 函数一致但不同的单词整数。
1 2 |
8 [6, 4, 1, 2, 7, 5, 6, 2, 6] |
Tokenizer API
到目前为止,我们已经研究了 Keras 中用于准备文本的单次便捷方法。
Keras 提供了一个更复杂的 API 来准备文本,该 API 可以进行拟合并重复使用以准备多个文本文档。对于大型项目,这可能是首选方法。
Keras 提供了 Tokenizer 类 来为深度学习准备文本文档。Tokenizer 必须进行实例化,然后根据原始文本文档或整数编码的文本文档进行拟合。
例如
1 2 3 4 5 6 7 8 9 10 11 |
from keras.preprocessing.text import Tokenizer # 定义 5 个文档 文档 = ['做得好!', '好工作', '巨大的努力', '不错的工作', 'Excellent!'] # 创建分词器 t = 分词器() # 在文档上拟合分词器 t.fit_on_texts(文档) |
拟合后,Tokenizer 提供 4 个属性,可用于查询有关文档的学习内容:
- word_counts:一个包含单词及其计数的字典。
- word_docs:一个包含单词以及每个单词出现在多少文档中的字典。
- word_index:一个包含单词及其唯一分配的整数的字典。
- document_count:一个用于对拟合 Tokenizer 的文档总数进行计数的整数。
例如
1 2 3 4 5 |
# 总结学习内容 print(t.word_counts) print(t.document_count) print(t.word_index) print(t.word_docs) |
在 Tokenizer 拟合训练数据后,可用于编码训练集或测试集中的文档。
Tokenizer 上的 texts_to_matrix() 函数可用于为每个输入文档创建向量。向量的长度是词汇表总大小。
此函数提供了一套标准的词袋模型文本编码方案,可通过 mode 参数传递给函数。
可用的模式包括:
- ‘binary’:每个单词是否存在于文档中。这是默认设置。
- ‘count’:文档中每个单词的计数。
- ‘tfidf’:文档中每个单词的词频-逆文档频率 (TF-IDF) 分数。
- ‘freq’:每个单词的频率,作为单词在每个文档中的比例。
我们可以将所有这些内容与一个实际示例结合起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from keras.preprocessing.text import Tokenizer # 定义 5 个文档 文档 = ['做得好!', '好工作', '巨大的努力', '不错的工作', 'Excellent!'] # 创建分词器 t = 分词器() # 在文档上拟合分词器 t.fit_on_texts(文档) # 总结学习内容 print(t.word_counts) print(t.document_count) print(t.word_index) print(t.word_docs) # 整数编码文档 encoded_docs = t.texts_to_matrix(docs, mode='count') 打印(encoded_docs) |
运行示例将使用 5 个小型文档拟合 Tokenizer。将打印拟合 Tokenizer 的详细信息。然后使用单词计数对 5 个文档进行编码。
每个文档都编码为一个 9 元素向量,其中每个单词都有一个位置,并为每个单词位置使用选定的编码方案值。在此示例中,使用了简单的单词计数模式。
1 2 3 4 5 6 7 8 9 |
OrderedDict([('well', 1), ('done', 1), ('good', 1), ('work', 2), ('great', 1), ('effort', 1), ('nice', 1), ('excellent', 1)]) 5 {'work': 1, 'effort': 6, 'done': 3, 'great': 5, 'good': 4, 'excellent': 8, 'well': 2, 'nice': 7} {'work': 2, 'effort': 1, 'done': 1, 'well': 1, 'good': 1, 'great': 1, 'excellent': 1, 'nice': 1} [[ 0. 0. 1. 1. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 1. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 1. 1. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 1. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 1.]] |
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
- Keras 文本预处理 API
- text_to_word_sequence Keras API
- one_hot Keras API
- hashing_trick Keras API
- 分词器 Keras API
总结
在本教程中,您了解了如何使用 Keras API 为深度学习准备文本数据。
具体来说,你学到了:
- 关于可用于快速准备文本数据的便捷方法。
- Tokenizer API,可以根据训练数据进行拟合,并用于对训练、验证和测试文档进行编码。
- Tokenizer API 提供的 4 种不同文档编码方案的范围。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嗨,Jason,
您有计划涵盖使用 word2vec 或 GloVe 进行词嵌入以及它们如何与 Keras 配合使用吗?
是的!我有很多关于词嵌入的文章将在未来几天/几周内发布。
你好 Jason,
看来 Tokenizer 的属性提到了,document_count 和 word_docs 被错误地输入了。
谢谢,
Lalit
谢谢 Lalit,具体是教程的哪一部分?
拟合后,Tokenizer 提供 4 个属性,可用于查询有关文档的学习内容:
如何将神经网络进一步应用于这些数据?
好问题,我将在未来几周内在此博客上发布许多关于如何实现这一点的教程。
嗨,Jason,
感谢您为这些教程付出的所有努力。我有一个问题,在文档分类任务中,例如 CSV 文件,其中每一行都包含来自文档的文本。一个人如何现实地确定适当的词汇量大小和词嵌入的最大长度?谢谢
很好的问题!
通常,我建议测试不同的尺寸/长度,并评估它们对模型技能的影响——例如,敏感性分析。
嗨 Jason
您能用 python/keras 进行敏感性分析吗?我找代码找了好久了。
非常感谢您的帮助。
Kim
当然,选择一个变量,然后进行分析。
您具体遇到了什么问题?
感谢您整理这些内容。
不客气。
嗨,Jason,
您上面段落中有错别字。您重复了句子。
“Keras 提供了 one_hot() 函数,可用于一步对文本文档进行分词和整数编码。名称表明它将创建一个文档的独热编码,但事实并非如此。相反,该函数是下一节所述的 hashing_trick() 函数的包装器。该函数返回文档的整数编码版本。由于使用了哈希函数,可能会发生冲突,并非所有单词都会被分配唯一的整数值。
相反,该函数是下一节所述的 hashing_trick() 函数的包装器。该函数返回文档的整数编码版本。由于使用了哈希函数,可能会发生冲突,并非所有单词都会被分配唯一的整数值。”
已修复,谢谢 David。是我的糟糕的拼写检查插件重复了段落!
感谢您精彩的博客 Jason,
我试图比较 Sklearn 和 Keras 中哈希的不同之处。使用 HashingVectorizer(SciKit Learn),您可以将文档(文本数组)转换为 n 维矩阵。但是,在 Keras 中,我们更类似于 CountVectorizer(SciKit Learn)。这难道不是根本性的不同吗?
哈希和计数是不同的。一种使用哈希函数将词汇表映射到较低维度的空间,另一种则为每个单词提供一个条目,并带有单词计数的旁边。
此外,keras 和 sklearn 都可以实现这两种方法以及更多方法。
在您的数据集上尝试多种方法,并使用模型技能来帮助选择最适合的方法。
谢谢!
不客气。
能否使用自动编码器和解码器对小型数据集进行文本摘要?请提供代码,先生。
感谢您的建议。
嗨,Jason,
非常感谢您的时间和精力来准备教程。
我有一个关于这个教程的问题,我想使用 http://archive.ics.uci.edu/ml/datasets/Adult 作为我的数据集。正如您所见,它同时具有字符串和整数作为输入。
我的问题是如何处理这种类型的数据,以及为训练准备数据的最佳方法是什么?
谢谢
这些字符串看起来像标签或类别。
也许您可以将字符串值编码为整数和/或进行独热编码。
非常棒的帖子:)
我有一个问题。
如果我的测试集包含训练集中不存在的单词,我该如何处理?
Keras 是否会隐式地将 OoV 词嵌入到未知向量中?
如果是,哪个函数涵盖了这一点?
谢谢!
如果您保留 tokenizer,它们将被分配 0 值,我预计是这样。
嗨,Jason,
感谢您提供的精彩教程。我有一个问题。为什么 (vocab_size*1.3) 是 1.3 而不是整数?您说 vocab_size 应该比词汇量大 25%。那么为什么不是 8*125/100 = 10
我指定了词汇量大小的 130%。它也可以是 125。
先生,我如何输入一个包含许多段落的 txt 文件?
您具体遇到了什么问题?
先生,我正在输入
text = open(‘summary.text’ , ‘r’)
words = list(text.read().split)
并且在转换 text_to_word_sequence 时出现错误
AttributeError: ‘list’ object has no attribute ‘lower’
听到这个消息很遗憾。您是否复制了所有代码?确认 Python3 和所有库都已更新?
感谢您提供出色的教程,对我帮助很大。
只是想告诉您,在 Tokenizer API 下的文本中有一个错误…
这段内容
word_counts: 一个包含单词及其计数的字典。
word_docs: 一个整数,用于计数使用了多少文档来拟合 Tokenizer。
word_index: 一个包含单词及其唯一分配的整数的字典。
document_count: 一个包含单词以及每个单词出现在多少文档中的字典。
我认为您混淆了 'word_docs' 和 'document_count' 的解释…
谢谢,已修正。
Jason,
很棒的网站。信息量很大。
我有一个不寻常的情况,我只有短句子(想想推文的大小),所以最多有 24 个标记。这些句子必须归入 64 个类别。
有大约 10E+06 个句子,我无法真正使用计数技术,所以我正在考虑对进入零填充向量的每个标记使用哈希技巧,该向量映射到标签的独热编码。
[123. 456. 789. 0. 0. 0. 0.] => [0. 0. 0. 1. 0. 0.]
这是一个合理的方法吗?
听起来是个不错的开始!
告诉我进展如何。
感谢提供信息。只是一个快速的问题——假设我已经用训练数据完成了训练,并且正在使用测试数据进行预测。
如果测试数据中的词在训练数据中不存在,该怎么办?我处理的是评论文本数据,因此会有很多词只在训练数据中出现。对于进行新预测,情况也一样——如果遇到原始训练数据集中不存在的词,该怎么办?
理想情况下,您希望选择能覆盖您词汇的训练数据。
如果测试数据包含新词,它们将被置零或忽略。
我想构建一个文本分类模型,网络将根据输入句子预测“是”或“否”。我可以使用您提到的上述方法将它们转换为实数,但不确定它们如何给我固定长度的向量。例如,“Okay”和“Let’s do it”可能与“Yes”相关。但如果我使用上述方法,输入向量的大小将不固定。您有什么建议吗?
您可以截断或填充输入词序列。
很棒的网站,可以了解使用 Python 进行 NLP 编码。
谢谢。
你好,
感谢您提供信息丰富的教程!
在文本“The quick brown fox jumped over the lazy dog.”中,唯一重复的词是“the”,但在 one_hot 和 hashing_trick 示例中,分词输出似乎重复了几个词。
独热编码
[5, 9, 8, 7, 9, 1, 5, 3, 8]
这里 5 被使用了两次,对应于“the”出现了两次,但是 9 也出现了两次(quick, jumped),同样 8 也出现了两次(brown, dog)。
哈希技巧
[6, 4, 1, 2, 7, 5, 6, 2, 6]
这里 6 似乎代表(the, the, dog),而 2 是(fox, lazy)。
自己尝试运行代码,我得到了类似的结果,直到我将词汇量大小增加了大约 3 倍,这为每个词分配了唯一的数字。
我是否理解错了什么,或者示例中有错误?
是的,那是哈希而不是编码。
如果您愿意,可以尝试真正的独热编码。
我也得到了相同的结果。不同的词被编码为相同的整数。
是的,它使用哈希编码。
Jason 博士,感谢您的工作。
您能给我一个关于索引如何发生的想法吗?在上面的示例中,print(t.word_index))
{‘work’: 1, ‘effort’: 6, ‘done’: 3, ‘great’: 5, ‘good’: 4, ‘excellent’: 8, ‘well’: 2, ‘nice’: 7}
我相信是在文本内的顺序。
Keras 将使用哈希函数,因此它是非线性的。我建议使用 Tokenizer。
Jason,我想将文本转换为数字,形式是根据最常用的词进行排名,就像 Keras 中的 IMDb 数据集一样。这是否可能,这样做会给我带来更好的结果吗?
这可能有助于选择要删除的低频词。
嗨 Jason
我对阿拉伯语文本摘要感兴趣,
我可以使用 Keras 来准备阿拉伯语文本吗?
我看不出为什么不。
您好,您的博客很棒。非常感谢您为此付出。
谢谢!
您好!精彩的博客。我有一个问题。在使用 fit_on_text(docs) 时,docs 必须是训练数据还是训练+测试数据?
通常只使用训练数据。
你好,先生,
您能否帮助我将英文单词转换为泰米尔语?
抱歉,我没有能力承担新项目。
非常感谢,我又一次把我的头都愁碎了,因为我得到了字符级别的分词器而不是词级别的。为了纠正它,我必须将它作为列表传递。
t = Tokenizer()
t.fit_on_texts([‘Hello world’])
而不是
t = Tokenizer()
t.fit_on_texts(‘Hello world’)
也许API已经改变了?
Jason,在 texts_to_matrix() 示例中,词汇量为 8 个单词,但生成的向量的维度是 9。为什么?
单词从 1 开始,并为 0 或“未知”添加额外的空间。
如何查看 Keras texts_to_matrix 函数创建的词汇表?
encoded_docs = t.texts_to_matrix(docs, mode=’tfidf’)
分词器有一个可以查看的字典。
有关详细信息,请参阅标题为“Tokenizer API”的部分。
非常感谢您提供信息丰富的教程!
我目前正在做 Twitter 项目的情感分析。受到 emoji2vec[1] 工作启发,我尝试将表情符号嵌入(这是一个 100*1 向量)添加到 Keras Tokenizer 中。这样,我就可以构建包含情感分析中的词嵌入和表情符号嵌入的嵌入矩阵。构建的嵌入矩阵可以用作下游嵌入层的权重。
但是,Tokenizer 大多是通过给定的 num_words 参数构建的。词频远高于表情符号,如果我设置 num_words=20000,并非所有表情符号都包含在内,这是毋庸置疑的。因此,我认为我需要手动将表情符号添加到 Keras Tokenizer API 中,以便构建词-表情符号嵌入矩阵。但在 Keras 中可能吗?
[1] https://arxiv.org/abs/1609.08359
好问题。
也许您可以创建自己的方法来仔细地将词语/表情符号映射到您词语和表情符号嵌入中的整数。
Jason您好,感谢您的精彩文章。
我想将一些文本分词到一个令牌序列,我正在使用
tokenizer.fit_on_texts(text_corpus)
sequences = tokenizer.texts_to_sequences(text)
我的问题是,形成这个 text_corpus 的最佳方法是什么?这个 text_corpus 就像一个字典,哪个令牌对应哪个词取决于它。我将来会收到更多文本进行分词,并且我需要,例如,每次“good”这个词都有相同的令牌。所以为此,我需要始终使用相同的 text_corpus。
顺便问一下,您是否有关于文本预处理(如删除停用词、词形还原等)的文章,以及在分词之前进行这些操作是否是个好主意?
text_corpus 是应该代表问题的训练数据。
据我所知,Keras API 分词器不是设计用来更新的。如果您需要更新它,可能需要使用不同的 API 或开发自己的分词器。或者,当有新数据可用时,您可以在未来重新拟合分词器和模型。
您好,我正在为一种印度语言做一个文本摘要器。
当我使用 fit_on_texts fn 时,它会给我一个属性错误 - ‘NoneType’ object has no attribute ‘lower’
tokenizer_outputs = Tokenizer(num_words=MAX_NUM_WORDS, filters=”)
tokenizer_outputs.fit_on_texts(target_texts + target_texts_inputs)
它是否只适用于英语?
也许可以检查一下您的 Python 版本是否是 3.5+?
我正在使用 Python 3.6.5。
嗨,Jason,
有什么方法可以在不先进行分词的情况下进行独热编码吗?
我有一个数据集,其中有一列是位置。它可以包含多个单词的字符串。例如:
JERSEY CITY, NEW JERSEY
ST. LOUIS, MISSOURI
MORRISVILLE, NORTH CAROLINA
我想对这些值进行独热编码。我应该如何使用 Keras 来做到这一点?
单词必须先转换为整数,然后再转换为向量。
您可以哈希或整数编码作为第一步,然后进行独热编码、词袋模型或使用嵌入作为第二步。
Jason您好,感谢您的精彩文章!
它确实帮助我理解了文本数据的预处理步骤。
但我无法理解何时需要“哈希技巧”。
我认为在大多数 NLP 场景中,例如文本分类,为了避免冲突,我应该选择“编码”。
因为如果正面词和负面词被映射到相同的数字,就会有误分类的风险。
为什么以及何时需要“哈希技巧”或“独热编码”?
是的,我也这么认为,但有时您没有足够的空间/内存来处理整个词汇表,并且可能需要哈希技巧来解决这个问题。
此外,哈希技巧还可以让您无缝地处理未来的新词。
你好,
很棒的教程!我实际上正在处理一个 CSV 文件中的文本,其中包含一些 null/空条目。我应该为这些空条目分配什么值才能继续处理?删除不是一个选项。将它们分配为“none”或“empty”是一个好选择吗?
您可以为它们分配一个特殊词,例如 [MISSING],或者在将它们映射到整数时将它们的值设为 0。
我有一个数据集,有 289323 行。
我有一个名为 InstanceDataId 的特征列,它有 25603 个唯一值。
作为 11 个特征之一,处理它的最佳方法是什么?
也许可以比较一下删除它、整数编码、独热编码和嵌入,并使用能获得最佳模型技能的方法。
感谢 Jason 提供有关机器学习主题的精彩教程!
关于独热编码的一个问题。在(独热)编码文本后,是否可以通过 Keras API 获取(并打印)整数代码和原始单词之间的映射?这可以用来验证是否正确。谢谢。
是的,它在 Tokenizer 中可用。
谢谢 Jason。我假设您指的是 Tokenizer.word_index。这只有在我使用了 Tokenizer.fit_on_texts() 后才有效,对吗?当使用 one_hot 函数编码的文本时,它如何工作?
您需要自己进行独热编码或使用分词器来完成,或者可能使用 sklearn 的实现——您可以重复使用/保存并一致地操作文本的东西。
Jason您好,感谢您的辛勤工作!我即将进入深度学习职业生涯。
我有一些问题。
1.如果我们正在处理一个包含大量评论文本句子的情感分析模型,我们应该选择哪种方法?是 Tokenizer 还是 hashing_trick?我认为如果我们将 Tokenizer 用作模型的特征会更好。
2. 哪一个能带来更好的性能?“Tokenizer”还是“hashing_trick”?
谢谢 🙂
词嵌入对于文本分类来说是最好的。
https://machinelearning.org.cn/what-are-word-embeddings/
如果您想尝试其他方法,我的一般最佳建议是进行测试并让结果指导您。
你好 Jason,
感谢您提供出色的教程!
我可以问您一个关于:tokenizer.texts_to_sequences 方法的问题吗?它是否为词汇表中的每个标记分配唯一的整数值?您是否有关于此方法的更详细的帖子?我正在尝试为嵌入层创建编码的文本输入,我想知道使用此方法对文档进行编码是否合理。
是的,在您的数据上拟合 Tokenizer,然后调用 texts_to_matrix() 等函数将文本转换为整数映射。
您可以在这里了解更多关于 API 的信息
https://keras.org.cn/preprocessing/text/
源代码也很有帮助
https://github.com/keras-team/keras-preprocessing/blob/master/keras_preprocessing/text.py#L139
嗨 Jason,
我试图从多页文档中对特殊指令文本子句进行分类。请指导我应该如何处理。
也许这里的一些教程可以帮助您入门。
https://machinelearning.org.cn/start-here/#nlp
嗨 Jason,
我已经了解了深度学习和 NLP 的基础知识。但我在寻找一种实现方式,在这种方式中,我们可以使用深度学习对文档中存在的单行注释进行分类。
您可以将多行注释加载为一个文档并按需进行分类。
Jason您好,这是一个很好的主题,也是一个很好的教程。
我有一个问题。
我在我的文本数据(texts)上训练了一个 word2vec 模型,min_count = 5,所以我只对出现至少 5 次的单词有向量。
现在,如果我要对我的文本进行分词以将其输入神经网络,
我是否必须在初始文本数据 (text) 上拟合分词器?然后也将其用于测试数据 (texts_test)?所以它看起来是这样的:
tokenizer_obj = Tokenizer()
tokenizer_obj.fit_on_texts(texts)
seq = tokenizer_obj.texts_to_sequences(texts)
seq_test = tokenizer_obj.texts_to_sequences(texts_test)
1. 或者我必须为我的测试数据拟合一个新的分词器对象?
2. 或者我必须将分词器对象拟合到我的 word2vec 模型中的字典,例如
dictionary = list(model.wv.vocab.keys())
dictionary
tokenizer_obj_dict = Tokenizer()
tokenizer_obj_dict.fit_on_texts(dictionary)
seq = tokenizer_obj_dict.texts_to_sequences(texts)
我读了很多,但对这个主题越来越感到困惑。
然后是另一个对我来说最重要的问题:当我到达网络训练好的时候:我该如何对所谓的未来数据(texts_future)进行分词,以对其进行预测?也是使用我在“第一个”步骤中拟合的相同分词器对象吗?所以
seq_future_text = tokenizer_obj.texts_to_sequences(texts_future)
我希望您能在这个主题上帮助我。这将是太棒了!
非常感谢 Jason。
是的,第一种方法是合适的。在训练集上拟合,在测试集上应用。这才是您在实践中将模型用于您的方式。
一旦您选择了配置,就在所有数据上拟合分词器和模型,保存模型和分词器(以及其他数据准备过程),并使用它来准备未来的新数据。新数据必须与训练数据完全相同——因为模型会期待如此。
非常感谢您的快速回复。
有没有理由不将其拟合到我从 Word2Vec 中获得的字典?
我以为这会有意义,因为我只对出现至少 X 次的词进行分词,而其他词被标记为额外的令牌。
换句话说,您能否解释一下为什么我必须将其拟合到初始文本数据,而不是拟合到所谓的清理后的初始文本(initial_text – words_that_appear_only_X-1_times)?
我希望问题是可理解的。
您可以根据需要选择词汇表。
选择基于删除不频繁词的词汇表是一个绝妙的主意。
这有帮助吗?
当然,您分享了如何将深度学习应用于 NLP 的好概念,这是热门话题!谢谢!
但是如何为我自己的语料库准备大型文档以进行文本分类?
谢谢。
与小型文档相比,您在大型文档方面遇到了什么问题?
texts_to_sequences 的作用是什么?
将文本转换为数字序列。例如,每个单词都被分配一个唯一的数字。
嗨,Jason,
当我使用不同大小的句子集并对每个句子应用 text_to_word_sequence 时,我会得到不同的 vocab_lengths。我应该取这些 vocab_lengths 的最大长度或平均长度,然后应用 130% 并用于 OneHotEncoding 吗?
词汇量应该基于整个训练数据集。
假设 X_train 是包含大约 1000 个句子/文档的整个训练集。
X_unique_wordseq = [ set ( text_to_word_sequence ( x ) ) for x in X_train]
word_seq_len = [ len(x) for x in X_wordseq ]
vocab_size = ? #我们如何获得词汇量大小?
[ vocab_size = np.max(X_train_words_len) ] #这样吗??
X_train_oneH = [one_hot (x, vocab_size) for x in X_train]
词汇量大小是训练数据集中唯一单词的总数。
这里的教程将帮助您入门。
https://machinelearning.org.cn/start-here/#nlp
亲爱的 Jason,
感谢您的文章,Tokenizer API 是否提供词袋模型或词嵌入?
不,不完全是。它执行基本清理并将数字分配给单词。
我明白了,谢谢。TF-IDF 呢?它是一个词袋模型吗?
tf-idf 是比词袋模型更高级的文本表示方法。
Jason 您好,
在使用 one_hot 之后,是否有办法获得编码后的字符串??
是的,您可以通过调用以下方式编码单个字符串
谢谢你,Jason。我一直在找这个,解释得很棒。
不客气。
你好Jason,非常感谢你的教程!
我有一个深度学习项目,需要理解一个特定评论数据库的一些行为。因此,我需要将数据库中的每个单词转换为一个特定的数字,但当单词出现多次时,它应该得到相同的数字,例如:
我喜欢你在游戏中放的音乐。
1, 2, 3, 4, 5, 6, 7 , 8 , 3 ,9
你能否告诉我keras是否可以做到这一点?对于你提供的“one hot”示例,我不确定它是否适用于我描述的用例。
你好Carol……请澄清您想实现什么,以便我们能更好地帮助您。