int main(int argc, const char * argv[])\r
{\r
//エントリポイント\r
- int i, i_max;\r
+ int i, i_max, j, count;\r
CHNLIB_String *input, *temp;\r
CHNLIB_UIPArray *separated, *sorted;\r
int passthink;\r
- FILE *readfp;\r
+ FILE *readfp, *writefp;\r
\r
CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);\r
\r
- CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);\r
- \r
AI_System_InitializeSystemWorkingSet();\r
\r
AI_System_LoadMemory(AI_CONFIG_FILE_NAME);\r
\r
readfp = NULL;\r
+ writefp = NULL;\r
\r
- for(;;){\r
+ for(count = 0; ; count++){\r
passthink = False;\r
if(readfp == NULL){\r
input = CHNLIB_ReadLine(stdin);\r
} else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){\r
break;\r
} else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){\r
- sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(WorkingSet.RootWordList);\r
+ temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 4);\r
+ if(temp == NULL){\r
+ //そのまま表示\r
+ sorted = WorkingSet.RootWordList;\r
+ retain(sorted);\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "count")){\r
+ //回数カウント順\r
+ sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(WorkingSet.RootWordList);\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "length")){\r
+ //文字列長順\r
+ sorted = AI_Think_WordList_GetSortedByLength(WorkingSet.RootWordList);\r
+ } else{\r
+ sorted = NULL;\r
+ }\r
+ \r
i_max = CHNLIB_UIPArray_GetNumberOfDatas(sorted);\r
+ j = 0;\r
for(i = 0; i < i_max; i++){\r
printf("word%3d:%3d:%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(sorted, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(sorted, i)));\r
+ j += CHNLIB_UIPArray_GetData32ByIndex(sorted, i);\r
+ }\r
+ if(i > 0){\r
+ printf("Average:%d\n", j / i);\r
}\r
//CHNLIB_UIPArray_FreeOnlyArray(&sorted);\r
release(sorted);\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "memlist")){\r
+ CHNLIB_Debug_PrintStructureData(WorkingSet.RootMemory, 0);\r
} else if(CHNLIB_String_CompareStringWithCString(temp, "readfile")){\r
//::readfile:filename\r
- readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");\r
if(readfp == NULL){\r
- puts("File open error.");\r
+ readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");\r
+ if(readfp == NULL){\r
+ puts("File open error.");\r
+ }\r
}\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "savewordlist")){\r
+ AI_System_SaveMemory_RootWordList(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)));\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "savememlist")){\r
+ AI_System_SaveMemory_RootMemory(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)));\r
+ } else if(CHNLIB_String_CompareStringWithCString(temp, "addmemtag")){\r
+ //[not implemented]\r
} else{\r
passthink = False;\r
}\r
}\r
\r
- ////WorkingSet.SystemWordList0を使っているので、解放しないように注意\r
- //CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
release(separated);\r
}\r
\r
//入力文字列から単語を抽出して記憶する。\r
CHNLIB_UIPArray *candidateWordList;\r
int i, i_max;\r
- int tagIndex, maxExistingWordIndex;\r
+ int tagIndex;\r
\r
candidateWordList = CHNLIB_UIPArray_Initialize();\r
candidateWordList = AI_Think_SlideLookUpWordByHistory(input);\r
i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidateWordList);\r
- maxExistingWordIndex = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList) - 1;\r
- \r
+\r
printf("Index(Decimal),CountOfContain(Decimal), String\n");\r
for(i = 0; i < i_max; i++){\r
printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(candidateWordList, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(candidateWordList, i)));\r
}\r
\r
//重複抽出フィルタリング\r
+ AI_Think_CandidateWordList_Filter02(&candidatewordlist, 1);\r
AI_Think_CandidateWordList_Filter01(&candidatewordlist, 1);\r
AI_Think_CandidateWordList_Filter00(&candidatewordlist);\r
\r
return candidatewordlist;\r
}\r
\r
-int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray **candidatewordlist)\r
+CHNLIB_UIPArray *AI_Think_WordList_GetSortedByLength(const CHNLIB_UIPArray *wordlist)\r
{\r
- //[Not implemented]\r
- //[UTF-8]\r
- //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。\r
- //00:長い単語に含まれており、かつ出現頻度が長い単語と等しい単語を削除\r
- int i, i_max;\r
- CHNLIB_String *nowstr, *basestr;\r
- int basestrCoC; //CountOfContainInHistoryStrings\r
+ CHNLIB_UIPArray *temp, *sorted;\r
\r
- i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);\r
- basestr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, 0);\r
- basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, 0);\r
- for(i = 1; i < i_max; i++){\r
- nowstr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i);\r
- if(CHNLIB_UTF8_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(basestr), CHNLIB_String_GetReferencePointerOfCString(nowstr)) > 0){\r
- //nowstrはbasestrに含まれている\r
- if(basestrCoC == CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i)){\r
- //かつ出現頻度が等しいので不要な単語\r
- //出現頻度を0にして、後で削除する。\r
- CHNLIB_UIPArray_SetData32ByIndex(*candidatewordlist, i, 0);\r
- }\r
- }\r
- \r
- if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) != 0){\r
- //単語は削除されなかった、つまり異なる単語なので、basestrを更新\r
- basestr = nowstr;\r
- basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i);\r
- }\r
- }\r
+ temp = CHNLIB_UIPArray_CopyArray(wordlist);\r
\r
- for(i = 1; i < i_max; i++){\r
- if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) == 0){\r
- //削除対象\r
- CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);\r
- i--;\r
- i_max--;\r
- }\r
- }\r
+ AI_Think_WordList_SetLengthToData32(&temp);\r
+ sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(temp);\r
\r
- return 0;\r
+ release(temp);\r
+ \r
+ return sorted;\r
}\r
\r
-int AI_Think_CandidateWordList_Filter01(CHNLIB_UIPArray **candidatewordlist, int length)\r
+void AI_Think_WordList_SetLengthToData32(CHNLIB_UIPArray **wordlist)\r
{\r
- //[Not implemented]\r
- //[UTF-8]\r
- //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。\r
- //01:length以下の文字数の単語を削除\r
- \r
int i, i_max;\r
\r
- i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(*wordlist);\r
+ \r
for(i = 0; i < i_max; i++){\r
- if(CHNLIB_UTF8_GetStringLengthByCharacter(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i))) <= length){\r
- CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);\r
- i--;\r
- i_max--;\r
- }\r
+ CHNLIB_UIPArray_SetData32ByIndex(*wordlist, i, CHNLIB_UTF8_GetStringLengthByCharacter(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(*wordlist, i))));\r
}\r
\r
- return 0;\r
-}\r
-\r
-int AI_Memory_AddRootWordData(CHNLIB_String *tag)\r
-{\r
- //WorkingSet.RootWordListに文字列を追加する。\r
- //重複がある場合は警告を出し、追加しない。\r
- //戻り値は追加されたまたは重複したタグのIndex.\r
- \r
- return CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, 0, tag, &AI_Memory_AddRootWordData_IsDuplicated);\r
-}\r
-\r
-int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)\r
-{\r
- //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。\r
- if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){\r
- return False;\r
- }\r
- if(CHNLIB_String_CompareString_Strict(listtag, newtag)){\r
- CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));\r
- return True;\r
- }\r
- return False;\r
+ return;\r
}\r
\r
void AI_System_InitializeSystemWorkingSet(void)\r
{\r
//WorkingSetを初期化する。\r
+ int i, i_max;\r
+ \r
WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();\r
- CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(":")));\r
- CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(",")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Colon, autorelease(CHNLIB_String_Initialize(":")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Comma, autorelease(CHNLIB_String_Initialize(",")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Plus, autorelease(CHNLIB_String_Initialize("+")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Bracket_Start, autorelease(CHNLIB_String_Initialize("[")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Bracket_End, autorelease(CHNLIB_String_Initialize("]")));\r
\r
- WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
+ WorkingSet.SystemWordList1 = CHNLIB_UIPArray_Initialize();\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("未定義")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("真")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("偽")));\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("あいさつ")));\r
\r
- return;\r
-}\r
-\r
-void AI_System_LoadMemory(const char configfilename[])\r
-{\r
- //指定されたファイル名のテキストファイルから設定を読み出す。\r
- FILE *fp;\r
- CHNLIB_String *line, *currentfilename;\r
- int i;\r
+ WorkingSet.SystemWordList2 = CHNLIB_UIPArray_Initialize();\r
+ for(i = 0; i < 10; i++){\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList2, True, autorelease(CHNLIB_String_InitializeWithFormat("%d", i)));\r
+ }\r
+ \r
+ WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
+ WorkingSet.RootMemory = CHNLIB_UIPArray_Initialize();\r
+ WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
\r
- fp = fopen(configfilename, "rb");\r
- currentfilename = CHNLIB_ReadLine(fp);\r
- fclose(fp);\r
+ //WordListへシステム文字列を追加\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList0);\r
+ for(i = 0; i < i_max; i++){\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList0, i));\r
+ }\r
\r
- fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
- release(currentfilename);\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList1);\r
+ for(i = 0; i < i_max; i++){\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList1, i));\r
+ }\r
\r
- WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
- for(i = 1; ;i++){\r
- line = CHNLIB_ReadLine(fp);\r
- if(line == NULL){\r
- break;\r
- }\r
- CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
- release(line);\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList2);\r
+ for(i = 0; i < i_max; i++){\r
+ CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList2, i));\r
}\r
- fclose(fp);\r
\r
return;\r
}\r