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 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 ; 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
i have a question related to strings items in an Array and sorting. Maybe someone can advice me how to solve the issue.
I have an Array of strings, every item of the Array is as following:
INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection] INFO [07.06.2017 08:55:44] [main] MDU5 - Ver 5.1x I want to sort the item in the array by date and time, is there any function which allows me to sort by date/time?
Thanks in advance
I was reading the Helpfile on both GUICtrlRegisterListViewSort and _GUICtrlListView_SimpleSort, and after running my script, I was initially satisfied with the way columns are sorted when the user clicks on the column header.
But at certain occasions, clicking on the column header to sort numbers - integers in particular - seem to have some unexpected behaviour.
I cannot verify if it is due to the way I wrote the script, or because the functions used in AutoIt to sort numbers intentionally work the way they do.
Column ID | Item ID | Item Name | Date
1 | ID_1 | One | 14/05/2014
2 | ID_2 | Two| 14/05/2014
3 | ID_3 | Three| 14/05/2014
10 | ID_4 | Four| 14/05/2014
9 | ID_5 | Five| 14/05/2014
27 | ID_6 | Siz| 15/05/2014
When the user clicks Column ID, logically the order of ascending sorting would look like this:
1, 2, 3, 9, 10, 27
But what I got is like this:
1, 10, 2, 27, 3, 9
Does anyone know the reason behind the way it is sorted this way?
How then do I get the columns to be sorted correctly when the user clicks the column header?
(I did read across other related threads like and )
I attached my codes here to see if I might write them wrongly.
My code for generating ListView:
$inventoryList = GUICtrlCreateListView("ID|item id|item name| Date", 45, 140, expandGUIX(750), expandGUIY(450), $LVS_REPORT, BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE)) _GUICtrlListView_SetColumnWidth(-1, 3, 651) $hInventoryList = GUICtrlGetHandle($inventoryList) For $i = 0 To 3 _GUICtrlListView_SetColumnWidth($inventoryList, $i, $LVSCW_AUTOSIZE_USEHEADER) Next My code for auto-resizing columns:
Func resizeColumns($hWnd, $listView, $iColumns, $iGUI_Width, $iGUI_Height) ; Check top index - if not 0 then we have a scroll bar so increase ListView width Local $iScroll_Allowance If _GUICtrlListView_GetTopIndex($listView) > 0 Then $iScroll_Allowance = 17 EndIf ; Determine ListView width Local $iLV_Width = $iScroll_Allowance Local $iData_Width, $iHeader_Width Local $i = 0 For $i = 0 To $iColumns - 1 ; Size column to fit header _GUICtrlListView_SetColumnWidth($listView, $i, $LVSCW_AUTOSIZE_USEHEADER) $iHeader_Width = _GUICtrlListView_GetColumnWidth($listView, $i) ; Now size column to fit data _GUICtrlListView_SetColumnWidth($listView, $i, $LVSCW_AUTOSIZE) $iData_Width = _GUICtrlListView_GetColumnWidth($listView, $i) ; If header is wider, reset width If $iHeader_Width > $iData_Width Then _GUICtrlListView_SetColumnWidth($listView, $i, $iHeader_Width) $iLV_Width += $iHeader_Width Else $iLV_Width += $iData_Width EndIf Next ; Resize ListView and GUI to fit data ControlMove($hWnd, "", $listView, 10, 10, $iLV_Width + 10, $iGUI_Height - 20) ; Add 10 for internal ListView borders EndFunc ;==>resizeColumns My code for locking users from resizing columns after auto-resize:
Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam ; Get details of message Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam) ; Look for header resize code $iCode = DllStructGetData($tNMHEADER, "Code") Switch $iCode Case $HDN_BEGINTRACKW ; Prevent resizing Return True Case $LVN_COLUMNCLICK ; Sort column $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) $iCol = DllStructGetData($tInfo, "SubItem") _GUICtrlListView_SimpleSort($cListView, $g_bSortSense, $iCol) EndSwitch Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG EndFunc ;==>_WM_NOTIFY
I recently managed to make a ListView sort correctly by clicking on it's columns, it does sort items very well but there's a very annoying thing >_< : every time after the items are sorted out, an item gets focused ! After I click a column, one item gets blue'd, like when its selected, even if its not !
Note that this happens only becuase of this function : _GUICtrlListView_SimpleSort
Instead, the _GUICtrlListView_SortItems function is not doing this , but because of my luck,I must use _GUICtrlListView_SimpleSort ( but it is faster )
Here's my script to test to see what I mean:
#include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GUIListView.au3> $Form1 = GUICreate("Form1", 383, 307, 192, 124) $ListView1 = GUICtrlCreateListView("C1|C2|C3", 56, 16, 257, 241) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 50) $ListView1_0 = GUICtrlCreateListViewItem("1|5|6", $ListView1) $ListView1_1 = GUICtrlCreateListViewItem("2|7|8", $ListView1) $ListView1_2 = GUICtrlCreateListViewItem("3|9|10", $ListView1) $ListView1_3 = GUICtrlCreateListViewItem("4|11|12", $ListView1) GUISetState(@SW_SHOW) Global $toggle = 1 While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $ListView1 _GUICtrlListView_SimpleSort($ListView1, $toggle, GUICtrlGetState($ListView1)) EndSwitch WEnd
How could I get rid of this item focus ?
How can I do to, when I click on on a specific column in a listview control, instead to get clicked/sorted other column. Is this possible ?
I already know how to sort a column when I click on it : after the listview control was created, I add this code : _GUICtrlListView_RegisterSortCallBack(-1)
I know that a gui can wait for a window event to happen, like a click on a control, but how can this be done to look if I clicked on a specific column and if so then, to sort (a clasic sort ) other column instead o.O ?