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