How do I convert an array of indexes back to the word, using a Keras model for slot/intent detection

I put the code in https://stackoverflow.com/questions/59024502/convert-from-tensorflow-coreml-3-0-for-slot-intent-detection but basically I took a Keras model, converted it to CoreML 3.0 and put it into my application.


I get back an array similar to this truncated one:

******** intents 540 ********

[0.0028914143331348896, 0.0057610333897173405, 4.1651015635579824e-05, 0.15935245156288147, 5.6665314332349226e-05, 5.7797817134996876e-05, 0.0044302307069301605, 0.00012486864579841495, 0.0004683282459154725, 0.003053907072171569, 3.806956738117151e-05, 0.012112349271774292, 5.861848694621585e-05, 0.0031344725284725428,


when I try to look at what was returned.


This is my code, as the only thing missing is that I use text from a textfield to call the predict function.


So, how do I get back the correct intent and slot values?


Also, is there any book/tutorial that can help with doing deep learning for language? All of them seem to be for images.


func tokenizeSentences(instr: String) -> [Int] {

let s = instr.lowercased().split(separator: " ")

var ret = [Int]()

if let filepath = Bundle.main.path(forResource: "atis.dict.vocab", ofType: "csv") {

do {

let contents = try String(contentsOfFile: filepath)

print(contents)

var lines = contents.split { $0.isNewline }

var pos = 0

for word in s {

if let index = lines.firstIndex(of: word) {

print(index.description + " " + word)

ret.append(index)

}

}

return ret

} catch {

// contents could not be loaded

}

} else {

// example.txt not found!

}

return ret

}

func predictText(instr:String) {

let model = lstm_nopooling300()

guard let mlMultiArray = try? MLMultiArray(shape:[20,1,1],

dataType:MLMultiArrayDataType.int32) else {

fatalError("Unexpected runtime error. MLMultiArray")

}

let tokens = tokenizeSentences(instr: instr)

for (index, element) in tokens.enumerated() {

mlMultiArray[index] = NSNumber(integerLiteral: element)

}


guard let m = try? model.prediction(input: lstm_nopooling300Input.init(main_input: mlMultiArray))

else {

fatalError("Unexpected runtime error. MLMultiArray")

}

let mm = m.intent_output

let length = mm.count

let doublePtr = mm.dataPointer.bindMemory(to: Double.self, capacity: length)

let doubleBuffer = UnsafeBufferPointer(start: doublePtr, count: length)

let output = Array(doubleBuffer)

print("******** intents \(mm.count) ********")

print(output)

let mn = m.slot_output

let length2 = mn.count

let doublePtr2 = mm.dataPointer.bindMemory(to: Double.self, capacity: length2)

let doubleBuffer2 = UnsafeBufferPointer(start: doublePtr2, count: length2)

let output2 = Array(doubleBuffer2)

print("******** slots \(mn.count) ********")

print(output2)

}

}