Python 为什么Keras.preprocessing.sequence pad_序列处理字符而不是单词?
我正在将语音转录成文本,在Keras中使用Python 为什么Keras.preprocessing.sequence pad_序列处理字符而不是单词?,python,keras,nlp,speech-to-text,text-processing,Python,Keras,Nlp,Speech To Text,Text Processing,我正在将语音转录成文本,在Keras中使用pad_序列时遇到了一个问题(我想)。我对一个模型进行了预训练,该模型在数据帧上使用了pad_序列,它将数据放入一个数组中,每个值的列和行数相同。但是,当我在转录文本时使用pad_序列时,该语音字符串中的字符数是作为numpy数组返回的行数 假设我有一个包含4个字符的字符串,那么它将返回一个4x500Numpy数组。对于包含6个字符的字符串,它将返回6x500Numpy数组,依此类推 我的澄清代码: import speech_recognition a
pad_序列时遇到了一个问题(我想)。我对一个模型进行了预训练,该模型在数据帧上使用了pad_序列
,它将数据放入一个数组中,每个值的列和行数相同。但是,当我在转录文本时使用pad_序列
时,该语音字符串中的字符数是作为numpy数组返回的行数
假设我有一个包含4个字符的字符串,那么它将返回一个4x500
Numpy数组。对于包含6个字符的字符串,它将返回6x500
Numpy数组,依此类推
我的澄清代码:
import speech_recognition as sr
import pyaudio
import pandas as pd
from helperFunctions import *
jurors = ['Zack', 'Ben']
storage = []
storage_df = pd.DataFrame()
while len(storage) < len(jurors):
print('Juror' + ' ' + jurors[len(storage)] + ' ' + 'is speaking:')
init_rec = sr.Recognizer()
with sr.Microphone() as source:
audio_data = init_rec.adjust_for_ambient_noise(source)
audio_data = init_rec.listen(source) #each juror speaks for 10 seconds
audio_text = init_rec.recognize_google(audio_data)
print('End of juror' + ' ' + jurors[len(storage)] + ' ' + 'speech')
storage.append(audio_text)
cleaned = clean_text(audio_text)
tokenized = tokenize_text(cleaned)
padded_text = padding(cleaned, tokenized) #fix padded text elongating rows
返回的文本将被输入到预先训练好的模型中,我很确定不同长度的行会引起问题。标记器
的方法,如fit_on_text
或text_to_sequences
需要一个文本/字符串列表作为输入(如其名称所示,即text
)。但是,您正在向它们传递一个文本/字符串,因此它将迭代其字符,而假设它实际上是一个列表
解决此问题的一种方法是在每个函数的开头添加一个检查,以确保输入数据类型实际上是一个列表。例如:
def padding(text, tokenizer):
if isinstanceof(text, str):
text = [text]
# the rest would not change...
对于tokenize\u text
函数,您也应该这样做。更改后,自定义函数将同时处理单个字符串和字符串列表
作为一个重要的补充说明,如果您在问题中输入的代码属于预测阶段,则其中存在一个基本错误:您应该使用在培训模型时使用的相同的
标记器
实例,以确保映射和标记化以与培训阶段相同的方式完成。实际上,为每个或所有测试样本创建一个新的标记器实例是没有意义的(除非它与培训阶段使用的映射和配置相同)。谢谢!实际上,我在发布这篇文章后立即阅读了一些文档,其中指定我希望保存和重用标记化权重。不过,您的解释让它更加清晰,代码也起了作用!
def padding(text, tokenizer):
if isinstanceof(text, str):
text = [text]
# the rest would not change...