• R/O
  • HTTP
  • SSH
  • HTTPS

CHNOSProject: 提交

CHNOSProjectのすべてのプロジェクトのソースのルート


Commit MetaInfo

修订版02aa45935c78925c364a331d74f49c60723a180b (tree)
时间2013-05-18 13:14:01
作者hikarupsp <hikarupsp@user...>
Commiterhikarupsp

Log Message

単語抽出の向上

更改概述

差异

--- a/CHNOSProject/AI003/AI003.xcodeproj/project.pbxproj
+++ b/CHNOSProject/AI003/AI003.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
77 objects = {
88
99 /* Begin PBXBuildFile section */
10+ 17289436174406B600071834 /* AITestData_en.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 172894331744069100071834 /* AITestData_en.txt */; };
11+ 17289437174406BB00071834 /* AITestData_ja.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 172894351744069800071834 /* AITestData_ja.txt */; };
1012 173BB42616C6600100126A00 /* config.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 173BB42316C65FBB00126A00 /* config.txt */; };
1113 173BB42816C6618500126A00 /* words.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 173BB42716C660E000126A00 /* words.txt */; };
1214 175A87A516B5827800F5166E /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 175A87A416B5827800F5166E /* main.c */; };
@@ -31,6 +33,8 @@
3133 dstPath = "";
3234 dstSubfolderSpec = 16;
3335 files = (
36+ 17289437174406BB00071834 /* AITestData_ja.txt in CopyFiles */,
37+ 17289436174406B600071834 /* AITestData_en.txt in CopyFiles */,
3438 173BB42816C6618500126A00 /* words.txt in CopyFiles */,
3539 173BB42616C6600100126A00 /* config.txt in CopyFiles */,
3640 );
@@ -49,6 +53,8 @@
4953 /* End PBXCopyFilesBuildPhase section */
5054
5155 /* Begin PBXFileReference section */
56+ 172894331744069100071834 /* AITestData_en.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = AITestData_en.txt; sourceTree = "<group>"; };
57+ 172894351744069800071834 /* AITestData_ja.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = AITestData_ja.txt; sourceTree = "<group>"; };
5258 173BB42316C65FBB00126A00 /* config.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 2; path = config.txt; sourceTree = "<group>"; };
5359 173BB42716C660E000126A00 /* words.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 2; path = words.txt; sourceTree = "<group>"; };
5460 175A87A016B5827800F5166E /* AI003 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = AI003; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -97,6 +103,8 @@
97103 175A87AF16B5833500F5166E /* core.h */,
98104 175A87A416B5827800F5166E /* main.c */,
99105 173BB42716C660E000126A00 /* words.txt */,
106+ 172894331744069100071834 /* AITestData_en.txt */,
107+ 172894351744069800071834 /* AITestData_ja.txt */,
100108 );
101109 path = AI003;
102110 sourceTree = "<group>";
@@ -211,7 +219,7 @@
211219 "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/usr/local/include",
212220 "$(INSTALL_ROOT)/usr/local/include",
213221 );
214- MACOSX_DEPLOYMENT_TARGET = 10.7;
222+ MACOSX_DEPLOYMENT_TARGET = 10.6;
215223 ONLY_ACTIVE_ARCH = YES;
216224 SDKROOT = macosx;
217225 };
@@ -235,7 +243,7 @@
235243 GCC_WARN_UNINITIALIZED_AUTOS = YES;
236244 GCC_WARN_UNUSED_VARIABLE = YES;
237245 "HEADER_SEARCH_PATHS[arch=*]" = "$(INSTALL_ROOT)/usr/local/include";
238- MACOSX_DEPLOYMENT_TARGET = 10.7;
246+ MACOSX_DEPLOYMENT_TARGET = 10.6;
239247 SDKROOT = macosx;
240248 };
241249 name = Release;
Binary files a/CHNOSProject/AI003/AI003.xcodeproj/project.xcworkspace/xcuserdata/hikaru.xcuserdatad/UserInterfaceState.xcuserstate and b/CHNOSProject/AI003/AI003.xcodeproj/project.xcworkspace/xcuserdata/hikaru.xcuserdatad/UserInterfaceState.xcuserstate differ
--- a/CHNOSProject/AI003/AI003.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
+++ b/CHNOSProject/AI003/AI003.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -86,11 +86,11 @@
8686 ignoreCount = "0"
8787 continueAfterRunningActions = "No"
8888 filePath = "AI003/main.c"
89- timestampString = "384873562.138536"
89+ timestampString = "390425099.955042"
9090 startingColumnNumber = "9223372036854775807"
9191 endingColumnNumber = "9223372036854775807"
92- startingLineNumber = "187"
93- endingLineNumber = "187"
92+ startingLineNumber = "272"
93+ endingLineNumber = "272"
9494 landmarkName = "AI_Memory_AddRootWordData()"
9595 landmarkType = "7">
9696 </FileBreakpoint>
@@ -136,11 +136,11 @@
136136 ignoreCount = "0"
137137 continueAfterRunningActions = "No"
138138 filePath = "AI003/main.c"
139- timestampString = "383409448.815474"
139+ timestampString = "390336991.21306"
140140 startingColumnNumber = "9223372036854775807"
141141 endingColumnNumber = "9223372036854775807"
142- startingLineNumber = "46"
143- endingLineNumber = "46"
142+ startingLineNumber = "58"
143+ endingLineNumber = "58"
144144 landmarkName = "main()"
145145 landmarkType = "7">
146146 </FileBreakpoint>
@@ -157,5 +157,109 @@
157157 landmarkName = "CHNLIB_CString_GetCountOfContain()"
158158 landmarkType = "7">
159159 </FileBreakpoint>
160+ <FileBreakpoint
161+ shouldBeEnabled = "No"
162+ ignoreCount = "0"
163+ continueAfterRunningActions = "No"
164+ filePath = "../chn/chnlib00.c"
165+ timestampString = "390419454.056298"
166+ startingColumnNumber = "9223372036854775807"
167+ endingColumnNumber = "9223372036854775807"
168+ startingLineNumber = "73"
169+ endingLineNumber = "73"
170+ landmarkName = "CHNLIB_UIPArray_AppendLast()"
171+ landmarkType = "7">
172+ </FileBreakpoint>
173+ <FileBreakpoint
174+ shouldBeEnabled = "No"
175+ ignoreCount = "0"
176+ continueAfterRunningActions = "No"
177+ filePath = "AI003/main.c"
178+ timestampString = "390425099.955042"
179+ startingColumnNumber = "9223372036854775807"
180+ endingColumnNumber = "9223372036854775807"
181+ startingLineNumber = "107"
182+ endingLineNumber = "107"
183+ landmarkName = "AI_Think_LearnWordFromInputString()"
184+ landmarkType = "7">
185+ </FileBreakpoint>
186+ <FileBreakpoint
187+ shouldBeEnabled = "No"
188+ ignoreCount = "0"
189+ continueAfterRunningActions = "No"
190+ filePath = "AI003/main.c"
191+ timestampString = "390425099.955042"
192+ startingColumnNumber = "9223372036854775807"
193+ endingColumnNumber = "9223372036854775807"
194+ startingLineNumber = "123"
195+ endingLineNumber = "123"
196+ landmarkName = "AI_Think_LearnWordFromInputString()"
197+ landmarkType = "7">
198+ </FileBreakpoint>
199+ <FileBreakpoint
200+ shouldBeEnabled = "No"
201+ ignoreCount = "0"
202+ continueAfterRunningActions = "No"
203+ filePath = "AI003/main.c"
204+ timestampString = "390425099.955042"
205+ startingColumnNumber = "9223372036854775807"
206+ endingColumnNumber = "9223372036854775807"
207+ startingLineNumber = "128"
208+ endingLineNumber = "128"
209+ landmarkName = "AI_Think_LearnWordFromInputString()"
210+ landmarkType = "7">
211+ </FileBreakpoint>
212+ <FileBreakpoint
213+ shouldBeEnabled = "No"
214+ ignoreCount = "0"
215+ continueAfterRunningActions = "No"
216+ filePath = "AI003/main.c"
217+ timestampString = "390473631.009346"
218+ startingColumnNumber = "9223372036854775807"
219+ endingColumnNumber = "9223372036854775807"
220+ startingLineNumber = "117"
221+ endingLineNumber = "117"
222+ landmarkName = "AI_Think_LearnWordFromInputString()"
223+ landmarkType = "7">
224+ </FileBreakpoint>
225+ <FileBreakpoint
226+ shouldBeEnabled = "No"
227+ ignoreCount = "0"
228+ continueAfterRunningActions = "No"
229+ filePath = "AI003/main.c"
230+ timestampString = "390473685.266823"
231+ startingColumnNumber = "9223372036854775807"
232+ endingColumnNumber = "9223372036854775807"
233+ startingLineNumber = "108"
234+ endingLineNumber = "108"
235+ landmarkName = "AI_Think_LearnWordFromInputString()"
236+ landmarkType = "7">
237+ </FileBreakpoint>
238+ <FileBreakpoint
239+ shouldBeEnabled = "No"
240+ ignoreCount = "0"
241+ continueAfterRunningActions = "No"
242+ filePath = "AI003/main.c"
243+ timestampString = "390473859.806502"
244+ startingColumnNumber = "9223372036854775807"
245+ endingColumnNumber = "9223372036854775807"
246+ startingLineNumber = "178"
247+ endingLineNumber = "178"
248+ landmarkName = "AI_Think_SlideLookUpWordByHistory()"
249+ landmarkType = "7">
250+ </FileBreakpoint>
251+ <FileBreakpoint
252+ shouldBeEnabled = "No"
253+ ignoreCount = "0"
254+ continueAfterRunningActions = "No"
255+ filePath = "AI003/main.c"
256+ timestampString = "390474101.310759"
257+ startingColumnNumber = "9223372036854775807"
258+ endingColumnNumber = "9223372036854775807"
259+ startingLineNumber = "184"
260+ endingLineNumber = "184"
261+ landmarkName = "AI_Think_SlideLookUpWordByHistory()"
262+ landmarkType = "7">
263+ </FileBreakpoint>
160264 </FileBreakpoints>
161265 </Bucket>
--- a/CHNOSProject/AI003/AI003.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/CHNOSProject/AI003/AI003.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@
77 <key>AI003.xcscheme</key>
88 <dict>
99 <key>orderHint</key>
10- <integer>1</integer>
10+ <integer>0</integer>
1111 </dict>
1212 </dict>
1313 <key>SuppressBuildableAutocreation</key>
@@ -22,6 +22,11 @@
2222 <key>primary</key>
2323 <true/>
2424 </dict>
25+ <key>1728943B17440B5700071834</key>
26+ <dict>
27+ <key>primary</key>
28+ <true/>
29+ </dict>
2530 <key>175A879F16B5827800F5166E</key>
2631 <dict>
2732 <key>primary</key>
--- /dev/null
+++ b/CHNOSProject/AI003/AI003/AITestData_en.txt
@@ -0,0 +1,17 @@
1+Artificial intelligence, From Wikipedia, the free encyclopedia.
2+Last modified on 14 February 2013 at 15:08.
3+
4+Artificial Intelligence (AI) is the intelligence of machines and robots and the branch of computer science that aims to create it.
5+AI textbooks define the field as "the study and design of intelligent agents" where an intelligent agent is a system that perceives its environment and takes actions that maximize its chances of success.
6+John McCarthy, who coined the term in 1955, defines it as "the science and engineering of making intelligent machines."
7+AI research is highly technical and specialised, deeply divided into subfields that often fail to communicate with each other.
8+Some of the division is due to social and cultural factors: subfields have grown up around particular institutions and the work of individual researchers.
9+AI research is also divided by several technical issues.
10+ There are subfields which are focused on the solution of specific problems, on one of several possible approaches, on the use of widely differing tools and towards the accomplishment of particular applications.
11+The central problems of AI include such traits as reasoning, knowledge, planning, learning, communication, perception and the ability to move and manipulate objects.
12+General intelligence (or "strong AI") is still among the field's long term goals.
13+Currently popular approaches include statistical methods, computational intelligence and traditional symbolic AI.
14+There are an enormous number of tools used in AI, including versions of search and mathematical optimization, logic, methods based on probability and economics, and many others.
15+The field was founded on the claim that a central property of humans, intelligence (the sapience of Homo sapiens) can be so precisely described that it can be emulated by a machine.
16+This raises philosophical issues about the nature of the mind and the ethics of creating artificial beings, issues which have been addressed by myth, fiction and philosophy since antiquity.
17+Artificial intelligence has been the subject of optimism, but has also suffered setbacks Today, it has become an essential part of the technology industry, providing the heavy lifting for many of the most difficult problems in computer science.
\ No newline at end of file
--- /dev/null
+++ b/CHNOSProject/AI003/AI003/AITestData_ja.txt
@@ -0,0 +1,34 @@
1+Wikipedia「人工知能」
2+最終更新 2012年12月25日 (火) 04:33(UTC)
3+
4+人工知能(じんこうちのう、英: Artificial Intelligence, AI)は、コンピュータに人間と同様の知能を実現させようという試み、あるいはそのための一連の基礎技術をさす。
5+「人工知能」という名前は1956年にダートマス会議でジョン・マッカーシーにより命名された。
6+現在では、記号処理を用いた知能の記述を主体とする情報処理や研究でのアプローチという意味あいでも使われている。
7+日常語としての「人工知能」という呼び名は非常に曖昧なものになっており、多少気の利いた家庭用電気機械器具の制御システムやゲームソフトの思考ルーチンなどがこう呼ばれることもある。
8+プログラミング言語LISPによる「Eliza」というカウンセラーを模倣したプログラムがしばしば引き合いに出されるが、計算機に人間の専門家の役割をさせようという「エキスパートシステム」と呼ばれる研究・情報処理システムの実現は、人間が暗黙に持つ常識の記述が問題となり、実用への利用が困難視されている現状がある。
9+人工的な知能の実現へのアプローチとしては、「ファジィ理論 (fuzzy theory)」や「ニューラルネットワーク」などのようなアプローチも知られているが、従来の人工知能(後述のGOFAI)との差は記述の記号的明示性にあると言えよう。
10+近年では「サポートベクターマシン (SVM)」が注目を集めた。
11+また、自らの経験を元に学習を行う強化学習という手法もある。
12+日本には人工知能学会があり、オンラインで機関誌も読める。
13+AIはふたつの学派に大別される。
14+ひとつは従来からのAIであり、もうひとつは計算知能(Computational Intelligence、CI)である。
15+従来からのAIは、現在では機械学習と呼ばれている手法を使い、フォーマリズムと統計分析を特徴としている。
16+これは、記号的AI、論理的AI、正統派AI、古き良きAI(Good Old Fashioned Artificial Intelligence、GOFAI)などと呼ばれる。
17+その手法としては、以下のようなものがある。
18+エキスパートシステム:推論機能を適用することで結論を得る。
19+エキスパートシステムは大量の既知情報を処理し、それらに基づいた結論を提供することができる。
20+Microsoft Office に登場するペーパークリップの Clippy はひとつの例である。
21+ユーザが文字列を打ち込むと、Clippy はそこに一定の特徴を認識し、それに沿った提案をする。
22+事例ベース推論(CBR):その事例に類似した過去の事例をベースにし、部分修正を加え試行を行い、その結果とその事例を事例ベースに記憶する。
23+ベイジアン・ネットワーク
24+ふるまいに基づくAI:AIシステムを一から構築していく手法
25+計算知能は開発や学習を繰り返すことを基本としている(例えば、パラメータ調整、コネクショニズムのシステム)。
26+学習は経験に基づく手法であり、非記号的AI、美しくない(scruffy)AI、ソフトコンピューティングと関係している。
27+その手法としては、以下のものがある。
28+ニューラルネットワーク:非常に強力なパターン認識力を持つシステム。
29+コネクショニズムとほぼ同義。
30+ファジィ制御:不確かな状況での推論手法であり、最近の制御システムでは広く採用されている。
31+進化的計算:生物学からインスパイアされた手法であり、ある問題の最適解を進化や突然変異の概念を適用して求める。
32+この手法は遺伝的アルゴリズムと群知能に分類される。
33+これらを統合した知的システムを作る試みもなされている。
34+ACT-Rでは、エキスパートの推論ルールを、統計的学習を元にニューラルネットワークや生成規則を通して生成する。
\ No newline at end of file
--- a/CHNOSProject/AI003/AI003/core.h
+++ b/CHNOSProject/AI003/AI003/core.h
@@ -22,9 +22,11 @@ struct AI_WORKING_SET {
2222
2323 //@main.c
2424 extern AI_WorkingSet WorkingSet;
25+void AI_Think_LearnWordFromInputString(CHNLIB_String *input);
2526 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input);
26-int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray *candidatewordlist);
27-void AI_Memory_AddRootWordData(CHNLIB_String *tag);
27+int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray **candidatewordlist);
28+int AI_Think_CandidateWordList_Filter01(CHNLIB_UIPArray **candidatewordlist, int length);
29+int AI_Memory_AddRootWordData(CHNLIB_String *tag);
2830 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag);
2931 void AI_System_InitializeSystemWorkingSet(void);
3032 void AI_System_LoadMemory(const char configfilename[]);
--- a/CHNOSProject/AI003/AI003/main.c
+++ b/CHNOSProject/AI003/AI003/main.c
@@ -24,8 +24,9 @@ int main(int argc, const char * argv[])
2424 //エントリポイント
2525 int i, i_max;
2626 CHNLIB_String *input, *temp;
27- CHNLIB_UIPArray *separated;
27+ CHNLIB_UIPArray *separated, *sorted;
2828 int passthink;
29+ FILE *readfp;
2930
3031 CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);
3132
@@ -34,10 +35,21 @@ int main(int argc, const char * argv[])
3435 AI_System_InitializeSystemWorkingSet();
3536
3637 AI_System_LoadMemory(AI_CONFIG_FILE_NAME);
38+
39+ readfp = NULL;
3740
3841 for(;;){
3942 passthink = False;
40- input = CHNLIB_ReadLine(stdin);
43+ if(readfp == NULL){
44+ input = CHNLIB_ReadLine(stdin);
45+ } else{
46+ input = CHNLIB_ReadLine(readfp);
47+ if(input == NULL){
48+ readfp = NULL;
49+ } else{
50+ puts(CHNLIB_String_GetReferencePointerOfCString(input));
51+ }
52+ }
4153
4254 if(CHNLIB_String_CompareStringWithCString(input, "::")){
4355 //システムコマンド解釈
@@ -52,28 +64,32 @@ int main(int argc, const char * argv[])
5264 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){
5365 break;
5466 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){
55- i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
67+ sorted = CHNLIB_UIPArray_SortInDescendingOrderByData32(WorkingSet.RootWordList);
68+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(sorted);
5669 for(i = 0; i < i_max; i++){
57- printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i)));
70+ printf("word%3d:%3d:%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(sorted, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(sorted, i)));
71+ }
72+ CHNLIB_UIPArray_FreeOnlyArray(&sorted);
73+ } else if(CHNLIB_String_CompareStringWithCString(temp, "readfile")){
74+ //::readfile:filename
75+ readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");
76+ if(readfp == NULL){
77+ puts("File open error.");
5878 }
5979 } else{
6080 passthink = False;
6181 }
6282 }
6383
84+ //WorkingSet.SystemWordList0を使っているので、解放しないように注意
6485 CHNLIB_UIPArray_FreeSelectedAll(&separated);
6586 }
6687
6788 if(!passthink){
6889 //AIへの入力
69- separated = CHNLIB_UIPArray_Initialize();
70- separated = AI_Think_SlideLookUpWordByHistory(input);
71- i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated);
72- printf("Index(Decimal),CountOfContain(Decimal), String\n");
73- for(i = 0; i < i_max; i++){
74- printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i)));
75- }
76- CHNLIB_UIPArray_FreeAll(&separated);
90+ //::readfile:AITestData_ja.txt
91+ AI_Think_LearnWordFromInputString(input);
92+
7793 CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);
7894 }
7995 }
@@ -81,6 +97,39 @@ int main(int argc, const char * argv[])
8197 return 0;
8298 }
8399
100+void AI_Think_LearnWordFromInputString(CHNLIB_String *input)
101+{
102+ //入力文字列から単語を抽出して記憶する。
103+ CHNLIB_UIPArray *candidateWordList;
104+ int i, i_max;
105+ int tagIndex, maxExistingWordIndex;
106+
107+ candidateWordList = CHNLIB_UIPArray_Initialize();
108+ candidateWordList = AI_Think_SlideLookUpWordByHistory(input);
109+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidateWordList);
110+ maxExistingWordIndex = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList) - 1;
111+
112+ printf("Index(Decimal),CountOfContain(Decimal), String\n");
113+ for(i = 0; i < i_max; i++){
114+ printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(candidateWordList, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(candidateWordList, i)));
115+
116+ //単語リストに登録。
117+ tagIndex = AI_Memory_AddRootWordData(CHNLIB_UIPArray_GetPointerByIndex(candidateWordList, i));
118+
119+ CHNLIB_UIPArray_SetData32ByIndex(WorkingSet.RootWordList, tagIndex, CHNLIB_UIPArray_GetData32ByIndex(WorkingSet.RootWordList, tagIndex) + CHNLIB_UIPArray_GetData32ByIndex(candidateWordList, i));
120+
121+ if(tagIndex <= maxExistingWordIndex){
122+ //既存のタグなので、解放されるようにdata32をFalseにしておく。
123+ CHNLIB_UIPArray_SetData32ByIndex(candidateWordList, i, False);
124+ }
125+ //新規追加されたタグについては0以上の値つまりTrueが設定されているはずなので、解放されない。
126+ }
127+ //data32 == Falseのタグ、つまり既存のタグと同じだったもののみ解放する。
128+ CHNLIB_UIPArray_FreeSelectedAll(&candidateWordList);
129+
130+ return;
131+}
132+
84133 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
85134 {
86135 //[UTF-8]
@@ -144,47 +193,84 @@ CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
144193 CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, k, j);
145194 }
146195
196+ //重複抽出フィルタリング
197+ AI_Think_CandidateWordList_Filter01(&candidatewordlist, 1);
198+ AI_Think_CandidateWordList_Filter00(&candidatewordlist);
199+
147200 return candidatewordlist;
148201 }
149202
150-int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray *candidatewordlist)
203+int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray **candidatewordlist)
151204 {
152205 //[Not implemented]
153206 //[UTF-8]
154207 //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。
208+ //00:長い単語に含まれており、かつ出現頻度が長い単語と等しい単語を削除
155209 int i, i_max;
156210 CHNLIB_String *nowstr, *basestr;
157- int nowstrlen, basestrlen;
211+ int basestrCoC; //CountOfContainInHistoryStrings
158212
159- i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);
160- basestr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, 0);
161- //basestrlen =
213+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);
214+ basestr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, 0);
215+ basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, 0);
162216 for(i = 1; i < i_max; i++){
163- nowstr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i);
217+ nowstr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i);
218+ if(CHNLIB_UTF8_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(basestr), CHNLIB_String_GetReferencePointerOfCString(nowstr)) > 0){
219+ //nowstrはbasestrに含まれている
220+ if(basestrCoC == CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i)){
221+ //かつ出現頻度が等しいので不要な単語
222+ //出現頻度を0にして、後で削除する。
223+ CHNLIB_UIPArray_SetData32ByIndex(*candidatewordlist, i, 0);
224+ }
225+ }
164226
227+ if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) != 0){
228+ //単語は削除されなかった、つまり異なる単語なので、basestrを更新
229+ basestr = nowstr;
230+ basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i);
231+ }
165232 }
233+
234+ for(i = 1; i < i_max; i++){
235+ if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) == 0){
236+ //削除対象
237+ CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);
238+ i--;
239+ i_max--;
240+ }
241+ }
242+
166243 return 0;
167244 }
168245
169-void AI_Memory_AddRootWordData(CHNLIB_String *tag)
246+int AI_Think_CandidateWordList_Filter01(CHNLIB_UIPArray **candidatewordlist, int length)
170247 {
171- //WorkingSet.RootWordListに文字列を追加する。
172- //重複がある場合は警告を出し、追加しない。
248+ //[Not implemented]
249+ //[UTF-8]
250+ //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。
251+ //01:length以下の文字数の単語を削除
252+
173253 int i, i_max;
174254
175- i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
255+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);
176256 for(i = 0; i < i_max; i++){
177- if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){
178- CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(tag));
179- return;
257+ if(CHNLIB_UTF8_GetStringLengthByCharacter(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i))) <= length){
258+ CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);
259+ i--;
260+ i_max--;
180261 }
181262 }
182263
183- CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);
184-
185- CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);
264+ return 0;
265+}
266+
267+int AI_Memory_AddRootWordData(CHNLIB_String *tag)
268+{
269+ //WorkingSet.RootWordListに文字列を追加する。
270+ //重複がある場合は警告を出し、追加しない。
271+ //戻り値は追加されたまたは重複したタグのIndex.
186272
187- return;
273+ return CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, 0, tag, &AI_Memory_AddRootWordData_IsDuplicated);
188274 }
189275
190276 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)
--- a/CHNOSProject/AI003/AI003/words.txt
+++ b/CHNOSProject/AI003/AI003/words.txt
@@ -1,4 +0,0 @@
1-E
2-Fg
3-コンピューター
4-コンピュータ
\ No newline at end of file
Binary files a/CHNOSProject/CHNOSProject.xcodeproj/project.xcworkspace/xcuserdata/hikaru.xcuserdatad/UserInterfaceState.xcuserstate and b/CHNOSProject/CHNOSProject.xcodeproj/project.xcworkspace/xcuserdata/hikaru.xcuserdatad/UserInterfaceState.xcuserstate differ
--- a/CHNOSProject/chn/chn.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/CHNOSProject/chn/chn.xcodeproj/xcuserdata/hikaru.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@
77 <key>chn.xcscheme</key>
88 <dict>
99 <key>orderHint</key>
10- <integer>2</integer>
10+ <integer>1</integer>
1111 </dict>
1212 </dict>
1313 <key>SuppressBuildableAutocreation</key>
--- a/CHNOSProject/chn/chnlib.h
+++ b/CHNOSProject/chn/chnlib.h
@@ -76,21 +76,33 @@ void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const ch
7676 //@chnlib00.c
7777 typedef struct CHNLIB_UIPARRAY CHNLIB_UIPArray;
7878 struct CHNLIB_UIP_ARRAY;
79+//----配列の初期化
7980 CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void);
81+//----データの追加
8082 int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer);
8183 int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag));
84+//----データの削除
8285 int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index);
86+//----配列の解放
8387 void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array);
8488 void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array);
8589 void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array);
8690 void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array);
8791 void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array);
92+//----配列要素数取得
8893 int CHNLIB_UIPArray_GetNumberOfDatas(const CHNLIB_UIPArray *array);
94+//----Data32取得・設定
8995 uint CHNLIB_UIPArray_GetData32ByIndex(const CHNLIB_UIPArray *array, int index);
9096 uint CHNLIB_UIPArray_SetData32ByIndex(CHNLIB_UIPArray *array, int index, uint data32);
97+//----Pointer取得・設定
9198 void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index);
92-int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32);
9399 void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32);
100+//----Index取得
101+int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32);
102+//----配列のコピー
103+CHNLIB_UIPArray *CHNLIB_UIPArray_CopyArray(const CHNLIB_UIPArray *source);
104+//----配列のソート
105+CHNLIB_UIPArray *CHNLIB_UIPArray_SortInDescendingOrderByData32(const CHNLIB_UIPArray *array);
94106
95107 //@chnlib01.c
96108 typedef struct CHNLIB_STRING CHNLIB_String;
--- a/CHNOSProject/chn/chnlib00.c
+++ b/CHNOSProject/chn/chnlib00.c
@@ -57,6 +57,7 @@ CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void)
5757
5858 int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer)
5959 {
60+ //戻り値:追加されたタグのIndex
6061 //Arrayの末尾にデータを追加する。
6162 int index;
6263
@@ -77,22 +78,20 @@ int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *point
7778
7879 int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag))
7980 {
80- //戻り値:IsAdded(True/False)
81+ //戻り値:追加されたタグ、もしくは重複する既存のタグのIndex
8182 //int (*IsDuplicated)(void *listtag, void *newtag)は、重複を確認する関数へのポインタ。
82- //listtagにarrayのすべてのpointerを与え、すべてがFalseだった場合追加してFalseを返す。
83- //Trueが返った時点で、追加をせずTrueを返す。
83+ //listtagにarrayのすべてのpointerを与え、すべてがFalseだった場合追加する。
84+ //Trueが返った時点で、追加をしないで既存のタグに対するIndexを返す。
8485 int i, i_max;
8586
8687 i_max = CHNLIB_UIPArray_GetNumberOfDatas(*array);
8788 for(i = 0; i < i_max; i++){
8889 if(IsDuplicated(CHNLIB_UIPArray_GetPointerByIndex(*array, i), pointer)){
89- return False;
90+ return i;
9091 }
9192 }
9293
93- CHNLIB_UIPArray_AppendLast(array, data32, pointer);
94-
95- return True;
94+ return CHNLIB_UIPArray_AppendLast(array, data32, pointer);
9695 }
9796
9897 int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index)
@@ -207,7 +206,7 @@ void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array)
207206
208207 void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array)
209208 {
210- //Array及びdata32==TrueのPointerをFree.
209+ //Array及びdata32==FalseのPointerをFree.
211210 CHNLIB_UIPArray_FreeOnlySelectedPointer(*array);
212211 CHNLIB_UIPArray_FreeOnlyArray(array);
213212 return;
@@ -276,6 +275,12 @@ void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index)
276275 return array->tag[index].pointer;
277276 }
278277
278+void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)
279+{
280+ //指定されたdata32を持つindexのデータのPointerを返す。
281+ return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));
282+}
283+
279284 int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)
280285 {
281286 //指定されたdata32を持つ最小のIndexを返す。
@@ -290,10 +295,61 @@ int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)
290295 return CHNLIB_UIPArray_INDEX_NOTFOUND;
291296 }
292297
293-void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)
298+CHNLIB_UIPArray *CHNLIB_UIPArray_CopyArray(const CHNLIB_UIPArray *source)
294299 {
295- //指定されたdata32を持つindexのデータのPointerを返す。
296- return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));
300+ //sourceと等価な配列を新たに生成して返す。
301+ CHNLIB_UIPArray *destination;
302+ int i, i_max;
303+
304+ destination = CHNLIB_UIPArray_Initialize();
305+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(source);
306+
307+ for(i = 0; i < i_max; i++){
308+ CHNLIB_UIPArray_AppendLast(&destination, CHNLIB_UIPArray_GetData32ByIndex(source, i), CHNLIB_UIPArray_GetPointerByIndex(source, i));
309+ }
310+
311+ return destination;
312+}
313+
314+CHNLIB_UIPArray *CHNLIB_UIPArray_SortInDescendingOrderByData32(const CHNLIB_UIPArray *array)
315+{
316+ //タグをData32の値で降順(大きい方から小さい方)になるように整列した新たなArrayを返す。
317+ CHNLIB_UIPArray *sorted, *temp;
318+ int i, i_max;
319+ int candidateIndex, candidateData32, currentData32;
320+
321+ sorted = CHNLIB_UIPArray_Initialize();
322+ temp = CHNLIB_UIPArray_CopyArray(array);
323+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(temp);
324+
325+ for(i = 0; i < i_max; i++){
326+ //tempのData32に1を足す(0を追加済みとマークするため)。
327+ CHNLIB_UIPArray_SetData32ByIndex(temp, i, CHNLIB_UIPArray_GetData32ByIndex(temp, i) + 1);
328+ }
329+
330+ for(;;){
331+ candidateData32 = 0;
332+ for(i = 0; i < i_max; i++){
333+ currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);
334+ if(candidateData32 < currentData32){
335+ candidateData32 = currentData32;
336+ candidateIndex = i;
337+ }
338+ }
339+ if(candidateData32 == 0){
340+ break;
341+ }
342+ for(i = candidateIndex; i < i_max; i++){
343+ currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);
344+ if(candidateData32 == currentData32){
345+ //-1を忘れないように
346+ CHNLIB_UIPArray_AppendLast(&sorted, currentData32 - 1, CHNLIB_UIPArray_GetPointerByIndex(temp, i));
347+ CHNLIB_UIPArray_SetData32ByIndex(temp, i, 0);
348+ }
349+ }
350+ }
351+
352+ return sorted;
297353 }
298354
299355 //
--- a/CHNOSProject/chn/chnlib02.c
+++ b/CHNOSProject/chn/chnlib02.c
@@ -125,6 +125,7 @@ int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const
125125
126126 CHNLIB_String *CHNLIB_ReadLine(FILE *fp)
127127 {
128+ //改行文字を削除して、読み込んだ文字列一行を返す。
128129 char s[CHNLIB_MAX_STRING_LENGTH];
129130
130131 if(fgets(s, sizeof(s), fp) == NULL){
Show on old repository browser