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

Why does Keras.preprocessing.sequence pad_sequences process characters instead of words?

我正在研究 t运行在 Keras 中使用 pad_sequences 时将语音写成文本并将 运行 写成一个问题(我认为)。我预训练了一个在数据帧上使用 pad_sequences 的模型,它将数据放入一个数组中,每个值的列数和行数相同。但是,当我在 t运行 划线文本上使用 pad_sequences 时,该口语字符串中的字符数就是 return 作为 numpy 数组编辑的行数。

假设我有一个包含 4 个字符的字符串,那么它将 return 一个 4 X 500 Numpy 数组。对于具有 6 个字符的字符串,它将 return 6 X 500 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

我使用辅助函数脚本:

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 text

def tokenize_text(text):
    tokenizer = Tokenizer()
    tokenizer.fit_on_texts(text)
    return tokenizer

def padding(text, tokenizer):
    text = pad_sequences(tokenizer.texts_to_sequences(text), 
                       maxlen = 500)
    return text

文本 returned 将被输入到预训练模型中,我很确定不同长度的行会导致问题。

Tokenizer 的方法,例如 fit_on_textstexts_to_sequences 期望 texts/strings 的 list 作为输入(如他们的名字暗示,即 texts)。但是,您将单个 text/string 传递给它们,因此它会迭代其字符,同时假设它实际上是一个列表!

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

def padding(text, tokenizer):
    if isinstanceof(text, str):
        text = [text]
    # the rest would not change...

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


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