为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Keras.preprocessing.sequence 处理字符而不是单词?

为什么 Keras.preprocessing.sequence 处理字符而不是单词?

浮云间 2023-09-12 16:53:38
pad_sequences我正在致力于将语音转录为文本,并在 Keras 中使用时遇到了问题(我认为) 。我预训练了一个在数据帧上使用的模型pad_sequences,它将数据放入一个数组中,每个值的列数和行数都相同。然而,当我用于pad_sequences转录文本时,该语音字符串中的字符数就是作为 numpy 数组返回的行数。假设我有一个包含 4 个字符的字符串,那么它将返回一个4 X 500Numpy 数组。对于 6 个字符的字符串,它将返回6 X 500Numpy 数组等。我的澄清代码:import speech_recognition as srimport pyaudioimport pandas as pdfrom 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我使用辅助函数脚本:def clean_text(text, stem=False):    text_clean = '@\S+|https?:\S|[^A-Za-z0-9]+'    text = re.sub(text_clean, ' ', str(text).lower()).strip()    #text = tf.strings.substr(text, 0, 300) #restrict text size to 300 chars    return textdef tokenize_text(text):    tokenizer = Tokenizer()    tokenizer.fit_on_texts(text)    return tokenizerdef padding(text, tokenizer):    text = pad_sequences(tokenizer.texts_to_sequences(text),                        maxlen = 500)    return text返回的文本将被输入到预先训练的模型中,我非常确定不同长度的行会导致问题。
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

的Tokenizer方法例如fit_on_texts或texts_to_sequences期望文本/字符串列表作为输入(顾名思义,即texts)。但是,您将单个文本/字符串传递给它们,因此它会迭代其字符,同时假设它实际上是一个列表!


解决此问题的一种方法是在每个函数的开头添加检查,以确保输入数据类型实际上是列表。例如:


def padding(text, tokenizer):

    if isinstanceof(text, str):

        text = [text]

    # the rest would not change...

您还应该为该tokenize_text函数执行此操作。进行此更改后,您的自定义函数将同时适用于单个字符串和字符串列表。


作为重要的旁注,如果您在问题中放入的代码属于预测阶段,则存在一个基本错误:您应该使用训练模型时使用的相同实例,以确保完成映射和标记Tokenizer化与训练阶段相同。实际上,为每个或所有测试样本创建一个新实例是没有意义的Tokenizer(除非它具有与训练阶段使用的相同的映射和配置)。


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信