Jump to content

Recommended Posts

Hey there!

I was studying about algorithms of machine learning and artificial intelligence inner systems, in specific, i would like to create a similar system like AIML and A.L.I.C.E., but in AU3.

I can re-create pretty much all the functions in AIML by myself, except for "any (*)", which is really useful for pattern detection.



<AIML version :"1.0.1" encoding:"UTF-8"?>
<pattern> WHO IS ABRAHAM LINCOLN</pattern>
<template>Abraham Lincoln was the US President during American civil war.</template>

<pattern>DO VOU KNOW WHO * IS</pattern>
<srai>WHD IS <star/></srai>

That's in AIML, Basically what it does is find the pattern in user sentence and get an answer depending if it was found or not.


How i could re-create it in Au3?

Any help is really appreciated!

Link to post
Share on other sites

This is a whole world unto itself, but you are going to need regular expressions for this. I am no expert, but I created an example. I'm sure it can be improved.

Local $sPattern = "(?i)(.*)(\bdo you know who )(.+)( is\b)(.*)"
MsgBox(0, "Detected:", StringRegExpReplace("Hi, do you know who Abraham Lincoln is?", $sPattern, '$3'))

This is just one of many possible ways to detect patterns using regular expressions.

Edited by czardas
Link to post
Share on other sites

Yeah, i thought about RegExp, but what i need is the basis of the question, then just fill with user's topic.


I.e. : Do you know who * is?

List Array:

Abraham Lincoln: Was a USA president

Barack Obama: Was a USA president

Steve Jobs: Was the founder of Apple

Bill Gates: Is the founder of Microsoft


So that it will search for any of those persons in list array and get the concept, then answer to it.


¡And thanks for ur help!

Link to post
Share on other sites

Funny play - with extreme limitations of course  :)
A possible way : detect the "who...is" pattern, check both array and question, return the answer
Here is a simple example (with no error checking)

Local $who_is[4] = ["Abraham Lincoln: Was a USA president", _
    "Barack Obama: Was a USA president", _
    "Steve Jobs: Was the founder of Apple", _
    "Bill Gates: Is the founder of Microsoft"] 

;$question = "Hi, do you know who Abraham Lincoln is?"
;$question = "Hi, do you know who this crazy Steve Jobs really is?"
;$question = "Hi, do you know who in the world is this damn Bill Gates over there ?"
$question = "Hi, do you know who czardas is ?"

If StringRegExp($question, '(?i)\bwho\b.*?\bis\b') Then Msgbox(0,"", _WhoIs($question))
Func _WhoIs($test)
   For $i = 0 to UBound($who_is)-1
         $name = StringRegExpReplace($who_is[$i], '^[^:]+\K.*', "")
         If StringInStr($test, $name) Then Return $who_is[$i]
   Return "Sorry, I don't know this one ..."


Edited by mikell
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By DynamicRookie
      Hey there!
      I've been developing a artificial intelligence.

      My first hard task was letting the A.I know when a sentence is found in memory with different words
      What i tried to do here is simply, get all the words in user sentence that could be used
      as a identifier
              example: Steve Jobs
              then identify the sentence purpose with the words we found in the past "for" loop
              example: Do/Know/You/Who/Steve/Jobs
              Compare the example in the following matching sentences in memory.
              1-Steve jobs was a known person
              2-Do you know who barack obama is?
              3-Do you know Steve jobs?
              4-Do you know who steve jobs is?
              5-How much money steve jobs had
              Then find the sentence that has way more matches than the other ones, remember that if the identifier words were not found
              (Steve jobs) then the sentence is invalid.
              Every sentence has a different answer and is important that the right one is chosen.
      If there's no more than the half of words in matches, then assign a variable the result of function, such as a return but for a global var.
      I couldn't figure out how to do that with StringRegExp.
      I honestly need help with detecting identifiers on memory sentences.
      I would also like to let the AI know typos, meaning that moeny and money means the same thing.
      Any help is hugely appreciated.

    • By DynamicRookie
      Hey there!
      I was thinking about building a chatting artificial intelligence in AutoIt

      I've been all the day learning about machine learning algorithms, but most of them were made for other type of areas such as marketing.
      Anyone knows an algorithm for sentences and context pattern finding i can study?
      I would also like to implement features like finding on memory related sentences and compare them
      I.e. Hello, how are you
      And split that sentence into 2 type of refferences to the answer, 'Hello' and 'How are you'
      I.e. Wanna play?
      I would like to let the bot understand same for "Wanna play" and "Wanna play?"
      Or for "Hello bot' and "Hello"
      Or memory finding message by conversation
      I have made a memory array based on the conversation i had with the bot, but i couldnt figure a way to make the bot find in memory, even though is supposed to work properly
      $ArrayTraceB = 0 $MemoryArray = StringSplit($Memory, '|') For $D in $SentenceKeyArray If $D = 'about' Then MemoryFunction($D, $ArrayTraceB, $SentenceKeyArray) Else $ArrayTraceB = $ArrayTraceB +1 EndIf Next Like on that code snap which leads to this function
      Func MemoryFunction($Call, $Trace, ByRef $KeyArray) $MemoryArray = StringSplit($Memory, '|') If $Call = 'About' Then $FirstArray = 1 For $Ref In $MemoryArray If $FirstArray = 1 Then $FirstArray = 0 Else $NeuronValues = $NeuronValues & '|' & $Neurons[$Ref] EndIf Next $NeuronValuesArray = StringSplit($NeuronValues, '|') $ArrayTrace = $Trace +1 $Topic = '' While 1 If $ArrayTrace >= $KeyArray[0] Then ExitLoop Else $Topic = $Topic & ' ' & $KeyArray[$ArrayTrace] $ArrayTrace = $ArrayTrace +1 EndIf Sleep(50) WEnd $ArrayTrace = 0 $bFound = False _ArrayDisplay($NeuronValuesArray) For $i = 0 To $NeuronValuesArray[0] ; Test from element 0 to the last element of the array If StringInStr($Topic, $NeuronValuesArray[$i]) Then $bFound = True ExitLoop ; Unless i need to find more instances we exit this part of the code imediately Global $ArrayX = $i EndIf Next If $bFound = False Then MsgBox(0, '', '-' & $Topic & '-') $Answer = "I dont remember anything about " & $Topic $WaitYesNo = True $BehaviorFlag = 2 AnswerSentence($Answer, $BehaviorFlag) Else _ArrayDisplay($NeuronValuesArray) MsgBox(0, '', $ArrayX) $Answer = 'I remember a message saying "' & $NeuronValuesArray[$ArrayX] & '", do you want to talk about that?' $WaitYesNo = True $BehaviorFlag = 4 AnswerSentence($Answer, $BehaviorFlag) EndIf EndIf EndFunc It always misses the last word and adds an empty space char at start.
      I would appreciate any suggestions
    • By DynamicRookie
      Hey There!
      So, what i need to do is an app that can read text in a image (I.e. a png that has text saying "This is a png" and return the text to a variable)
      I'm pretty much a newbie on AutoIt, my purpose is doing that but i don't know any function that can

      Any help is much appreciated
  • Create New...