如何将单词映射到数字以输入到 Tensorflow 神经网络

Posted

技术标签:

【中文标题】如何将单词映射到数字以输入到 Tensorflow 神经网络【英文标题】:How to map words to numbers for input into Tensorflow Neural Network 【发布时间】:2019-03-18 06:33:22 【问题描述】:

我正在尝试使用 Python 中的 Tensorflow 构建一个具有 seq2seq 神经网络实现的聊天机器人。我以前从未做过 seq2seq,而且我的大部分研究都没有什么帮助。

我不会直截了当地要求序列到序列聊天机器人的代码。相反,我的问题是如何最好地准备一个单词列表作为网络的输入。我还没有深入了解代码,但是我制作了一个脚本,该脚本将从文件中加载训练数据并对其进行标记。

但是,显然 Tensorflow 神经网络不能接受字符串作为输入。我需要将这些字符串转换为网络知道如何处理的数据;即数字。

到目前为止,这是我的代码;希望 cmets 让您了解我在哪里:

#Import dependencies
import tensorflow as tf

#Fetch and preprocess data

#Define a tokenizer function
def tokenize(string):
    tokenized_list = []
    tmp_indx = 0
    for i in range(len(string)):
        if string[i] in "?.,!;":
            tokenized_list.append(string[tmp_indx:i])
            tokenized_list.append(string[i])
            tmp_indx = i+1
        elif string[i] == " ":
            tokenized_list.append(string[tmp_indx:i])
            tmp_indx = i+1

    #A quick and dirty way out :/
    tokenized_list = [x for x in tokenized_list if x!=""]


    return tokenized_list


raw_file_data = ""
with open("training_dialogue.txt") as file:
    raw_file_data = file.read()
raw_file_data = raw_file_data.split("\n")

#Train data as list of values like so: [query, target_response]
train_data = []

for i in range(0,len(raw_file_data)):
    if i%2!=0:
        #Perform the most basic tokenization algorithm
        query = tokenize(raw_file_data[i-1])
        target_response = tokenize(raw_file_data[i])
        train_data.append([query, target_response])

#Now that I have a list of tokens in the form of strings, I need to map these to numbers somehow


#Load encoder and decoder networks



#Define hyperparameters


#Train them on the data

如果有人能告诉我如何以某种方式将这些单词处理成数字,那就太好了。我还需要能够将它们从数字变成文字。

【问题讨论】:

您可能会发现this answer 很有用。 嗯...这很有趣。我没有意识到 TF 有这种能力。 我也只是想我可能会使用声音序列而不是单词。这个聊天机器人应该是类似于 Siri 或 Google 助理的东西,你可以在那里说话,他们可以回应。 目前我打算使用谷歌语音识别将语音转换为文本,通过网络运行,然后使用文本到语音。但是,您认为将声音数据作为序列简单地输入是否可行? ...并发出声音作为响应。抱歉,我不是要发送垃圾邮件,我只是一直用完字符。 【参考方案1】:

我相信最好的方法是创建映射到数字的单词字典/索引。这也有助于将数字转换回单词。 this 线程以及 NLP 上下文中讨论了相同的问题。

基于此建议的代码 -

wordList = []
wordMap = 
def getNumber(word):
  if word in wordMap:
    return wordMap[word];

  wordIndex = len(wordList)
  wordList.append(word)
  wordMap[word] = wordIndex
  return wordIndex

def getWord(number):
  if number < len(wordList):
    return wordList[number]

  raise Exception("Unable to find Word for []".format(number))

# Main
print(getNumber('Hello'))
print(getNumber("World"))
print(getWord(getNumber("World")))

【讨论】:

是的,我想过这个,但是英语中有很多单词。我必须找到一个可以找到这样一本字典的来源 您应该能够使用上面的 getNumber() 和 getWord() 方法,当您继续使用该程序时,它们会逐步构建此库。如果您想重用映射,您可以增强它以将 wordMap dict 写入/加载到文件/从文件中加载。 有一种方法可以直接在 TensorFlow 中执行此操作。我相信使用这个作为答案可能会更可取....查看embedding的内容 @sgarg,我现在确实看到了。它可能很有用。 dennlinger,我以前听说过嵌入,我会更多地研究它。就我所见,Tensorflow 的学习曲线相当陡峭,而且我不知道在哪里可以找到最全面的指南。但我会继续寻找。不过,感谢您的回答!

以上是关于如何将单词映射到数字以输入到 Tensorflow 神经网络的主要内容,如果未能解决你的问题,请参考以下文章

散列表(has table哈希表)

将输入数字提高到幂;重复的话;输入单词

程序员面试金典-面试题 16.20. T9键盘

代码高尔夫:数字到单词

如何将状态保存为 db 中的代码,但将它们映射到 rails 中有意义的单词?

将 PIN 映射到字符串数组和从字符串数组映射