notes
This commit is contained in:
parent
ef66c21cad
commit
bcf40e1334
0
data/sentence_function/labels.txt
Normal file
0
data/sentence_function/labels.txt
Normal file
0
data/sentence_function/sentences.txt
Normal file
0
data/sentence_function/sentences.txt
Normal file
5
docs/acceptable_mistakes.txt
Normal file
5
docs/acceptable_mistakes.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
Greeting function misinterpretation
|
||||||
|
Misinterpreting a greeting sentence as an information-querying sentence is an acceptable mistake.
|
||||||
|
Lots of people make it when greeted with "How are ya?"
|
||||||
|
|
||||||
10
docs/concepts_to_graph.txt
Normal file
10
docs/concepts_to_graph.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
A list of things to consider fleshing out in the web
|
||||||
|
|
||||||
|
|
||||||
|
Qualia
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
22
docs/feature_justification.txt
Normal file
22
docs/feature_justification.txt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
|
||||||
|
Arguments justifying different features
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Information Priority
|
||||||
|
Pieces of information have different priorities and should be handled accordingly.
|
||||||
|
Keep a 'hot' web of the most important parts of info that should immediately be searchable every frame.
|
||||||
|
This can link into 'colder' webs that store lower priority information.
|
||||||
|
Will have this with both relations and nodes in the web.
|
||||||
|
To justify for nodes, some people in your life are of higher importance than others to remember.
|
||||||
|
You don't keep all people you know immediately accessible in your brain.
|
||||||
|
To justify for relations, relations between specific numbers are thrown out almost immediately when done solving a math problem.
|
||||||
|
|
||||||
|
|
||||||
|
Layered webs
|
||||||
|
If you have a conversation about the color of a hat, you will not store the color of the hat in your immediately accessible brain long term.
|
||||||
|
This lets you not constantly scan a huge repertoire of information when you want to perform day-to-day tasks.
|
||||||
|
Thus, I want to create an information heirarchy to mimic this and make engineering potentially easier.
|
||||||
|
|
||||||
|
|
||||||
6
docs/mantas.txt
Normal file
6
docs/mantas.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
1. keep it simple, stupid
|
||||||
|
|
||||||
|
2. make everything easily debug-able
|
||||||
|
|
||||||
|
3. work on a single sentence at a time
|
||||||
@ -1 +1,11 @@
|
|||||||
|
|
||||||
summarize previous statements to provide context instead of using full statement
|
summarize previous statements to provide context instead of using full statement
|
||||||
|
|
||||||
|
Come up with strategies for culling the number of connections in the knowledge web
|
||||||
|
- Particularly, connections used during immediate processing
|
||||||
|
- don't need to keep track of the color of the paper that a sentence you're going to forget about is written on
|
||||||
|
- Assign value weight to different nodes in web and use that to periodically clean web (?)
|
||||||
|
|
||||||
|
Layered webs
|
||||||
|
- Have more fine grained processing data get pushed into a lower priority web that is not immediately searched all the time
|
||||||
|
- ie low value detail relations, like colors or other qualities of objects, relations between people, etc
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
package org.studiorailgun.conversation.evaluators;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates a greeting
|
||||||
|
*/
|
||||||
|
public class GreetingEval {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates a greeting
|
||||||
|
* @param input The sentence
|
||||||
|
*/
|
||||||
|
public static void evaluate(String input){
|
||||||
|
switch(input){
|
||||||
|
case "Hello": {
|
||||||
|
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -36,6 +36,10 @@ public class SentenceSubjectParser {
|
|||||||
// System.out.println(model.functions().get(0).signature().getInputs().values().iterator().next().shape);
|
// System.out.println(model.functions().get(0).signature().getInputs().values().iterator().next().shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates a sentence
|
||||||
|
* @param sentence The sentence to evaluate
|
||||||
|
*/
|
||||||
public void evaluate(String sentence){
|
public void evaluate(String sentence){
|
||||||
//run predict
|
//run predict
|
||||||
TInt64 tensor = TInt64.scalarOf(10);
|
TInt64 tensor = TInt64.scalarOf(10);
|
||||||
|
|||||||
105
src/main/python/conversation/sentence/function.py
Normal file
105
src/main/python/conversation/sentence/function.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import tensorflow as tf
|
||||||
|
keras = tf.keras
|
||||||
|
from tensorflow import Tensor
|
||||||
|
from keras.api.layers import TextVectorization, Embedding, LSTM, Dense, Input
|
||||||
|
from keras.api.models import Sequential
|
||||||
|
import numpy as np
|
||||||
|
import numpy.typing as npt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Description: The purpose of this model is to qualify sentences into different 'functions'
|
||||||
|
#
|
||||||
|
# - "Utility" - A sentence whose purpose is to perform some non-informational duty in a conversation.
|
||||||
|
# An example of this could be a greeting or farewell.
|
||||||
|
#
|
||||||
|
# - "Transfer" - Transfers a piece of information to another participant. For instance, describing
|
||||||
|
# the details of an object.
|
||||||
|
#
|
||||||
|
# - "Query" - Queries a piece of information from another participant.
|
||||||
|
#
|
||||||
|
# - "Imperative" - Commands a participant to do something.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Model constants.
|
||||||
|
max_features: int = 20000
|
||||||
|
embedding_dim: int = 128
|
||||||
|
sequence_length: int = 500
|
||||||
|
epochs: int = 50
|
||||||
|
max_tokens: int = 5000
|
||||||
|
output_sequence_length: int = 4
|
||||||
|
|
||||||
|
|
||||||
|
# read sentences
|
||||||
|
data_path: str = './data/semantic/subject.txt'
|
||||||
|
data_raw: str = open(data_path).read()
|
||||||
|
vocab: list[str] = data_raw.split('\n')
|
||||||
|
|
||||||
|
# read labels
|
||||||
|
label_data_path: str = './data/semantic/subject_label.txt'
|
||||||
|
label_data_raw: str = open(label_data_path).read()
|
||||||
|
labels: list[int] = list(map(int,label_data_raw.split()))
|
||||||
|
|
||||||
|
# init vectorizer
|
||||||
|
textVec: TextVectorization = TextVectorization(
|
||||||
|
max_tokens=max_tokens,
|
||||||
|
output_mode='int',
|
||||||
|
output_sequence_length=output_sequence_length,
|
||||||
|
pad_to_max_tokens=True)
|
||||||
|
|
||||||
|
# Add the vocab to the tokenizer
|
||||||
|
textVec.adapt(vocab)
|
||||||
|
input_data: list[str] = vocab
|
||||||
|
data: Tensor = textVec.call(input_data)
|
||||||
|
|
||||||
|
# construct model
|
||||||
|
model: Sequential = Sequential([
|
||||||
|
keras.Input(shape=(None,), dtype="int64"),
|
||||||
|
Embedding(max_features + 1, embedding_dim),
|
||||||
|
LSTM(64),
|
||||||
|
Dense(1, activation='sigmoid')
|
||||||
|
])
|
||||||
|
|
||||||
|
#compile the model
|
||||||
|
# model.build(keras.Input(shape=(None,), dtype="int64"))
|
||||||
|
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
|
||||||
|
|
||||||
|
|
||||||
|
# fit the training data
|
||||||
|
npData = np.array(data)
|
||||||
|
npLabel = np.array(labels)
|
||||||
|
model.fit(npData,npLabel,epochs=epochs)
|
||||||
|
|
||||||
|
|
||||||
|
# evaluate here
|
||||||
|
|
||||||
|
|
||||||
|
# predict
|
||||||
|
predictTargetRaw: list[str] = ['saf']
|
||||||
|
predictTargetToken: list[int] = textVec.call(predictTargetRaw)
|
||||||
|
npPredict: npt.NDArray[np.complex64] = np.array(predictTargetToken)
|
||||||
|
# print(npPredict)
|
||||||
|
result: list[int] = model.predict(npPredict)
|
||||||
|
print("predict result:")
|
||||||
|
print(predictTargetToken)
|
||||||
|
print(result)
|
||||||
|
print(data)
|
||||||
|
print(labels)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# save the model so keras can reload
|
||||||
|
# savePath: str = './data/semantic/model.keras'
|
||||||
|
# model.save(savePath)
|
||||||
|
|
||||||
|
# export the model so java can leverage it
|
||||||
|
exportPath: str = './data/semantic/model'
|
||||||
|
model.export(exportPath)
|
||||||
|
|
||||||
|
# tf.keras.utils.get_file('asdf')
|
||||||
|
# asdf: str = 'a'
|
||||||
Loading…
Reference in New Issue
Block a user