1 function AI_WordRecognition(env){
4 AI_WordRecognition.prototype = {
5 slideLookUpCandidateWordByHistory: function(input){
6 var h = this.env.input.historyList;
7 var cList = new Array();
8 for(var i = 0, iLen = input.length; i < iLen; i++){
10 var iStr = input.substr(i);
13 for(var j = 0, jLen = h.length; j < jLen; j++){
16 for(var k = 0, kLen = hStrBase.length; k < kLen; k++){
17 //history character loop
18 var hStr = hStrBase.substr(k);
19 var m = hStr.compareLeftHand(iStr);
20 if(m > cLen && m != iStr.length){
26 cList.pushUnique(new AI_CandidateWordTag(iStr.substr(0, cLen).trim())).wordCount++;
30 this.filterCandidateWordList00(cList);
31 this.filterCandidateWordList01(cList, 2);
33 this.mergeCandidateWordList(cList);
36 appendCandidateWordList: function(strTag){
37 var s = this.env.memory.candidateWordList.isIncluded(strTag, function(a, b){ return (a.str == b.str); });
42 this.env.memory.appendMemoryTag(strTag);
45 mergeCandidateWordList: function(strTagList){
46 for(var i = 0, iLen = strTagList.length; i < iLen; i++){
47 this.appendCandidateWordList(strTagList[i]);
50 debugShowCandidateWordList: function(){
51 var c = (new Array()).concat(this.env.memory.candidateWordList);
53 this.env.debug("candidateWordList:" + c.length + "\n");
55 for(var i = 0, iLen = c.length; i < iLen; i++){
56 this.env.debug((i + 1) + ":\t" + c[i].wordCount.toString() + ":\t" + c[i].wordLevel.toString() + ":\t" + c[i].str + "\n");
58 this.env.debug("candidateWordList end\n");
60 filterCandidateWordList00:function(cList){
61 //00:長い単語に含まれており、かつ出現頻度が長い単語と等しい単語を削除
62 //cList内の候補単語に対して、フィルターをかける。
63 var iLen = cList.length;
67 var baseStrTag = cList[0];
68 for(var i = 1; i < iLen; i++){
70 if(baseStrTag.str.indexOf(c.str) != -1){
71 //c.strはbaseStrTag.strに含まれている
72 if(baseStrTag.wordCount == c.wordCount){
74 //後で削除する。出現回数を0にマークする。
79 //単語は削除されなかった、つまり異なる単語なので、baseStrTagを更新
84 for(var i = 1; i < iLen; i++){
87 cList.removeByIndex(i);
93 filterCandidateWordList01:function(cList, minLen){
94 //01:minLenに満たない文字数の候補を削除
96 var iLen = cList.length;
97 for(var i = 0; i < iLen; i++){
98 if(cList[i].str.length < minLen){
99 cList.removeByIndex(i);
105 filterCandidateWordList02:function(cList, minCount){
106 //02:minCountに満たない出現回数の候補を削除
108 var iLen = cList.length;
109 for(var i = 0; i < iLen; i++){
110 if(cList[i].wordCount < minCount){
111 cList.removeByIndex(i);
117 sortCandidateWordListByWordCount: function(){
118 this.env.memory.candidateWordList.stableSort(function(a, b){
119 return a.wordCount - b.wordCount;
122 sortCandidateWordListByWordLevel: function(){
123 this.env.memory.candidateWordList.stableSort(function(a, b){
124 return a.wordLevel - b.wordLevel;
127 computeWordLevel: function(strTag){
131 strTag.wordLevel = 0;
133 for(var i = 0; i < iLen; i++){
134 if(s.isHiraganaAt(i)){
136 } else if(s.isKanjiAt(i)){
138 } else if(s.isKatakanaAt(i)){
140 } else if(s.isHankakuKanaAt(i)){
146 for(var i = 0; i < 5; i++){
152 strTag.wordLevel = 1 / strTag.wordLevel;
155 computeEachWordLevel: function(){
156 var iLen = this.env.memory.candidateWordList.length;
157 for(var i = 0; i < iLen; i++){
158 this.computeWordLevel(this.env.memory.candidateWordList[i]);