C_N-gram のバックアップ(No.4) - アールメカブ

アールメカブ


C_N-gram のバックアップ(No.4)


Programming

とりあえず,こんなプログラムを書いてみた

#include <stdio.h>
#include <stdlib.h>
#include <locale>
using namespace std;

int main(int argc, char *argv[]){
 char  input[1024];
/* ワイド文字列 : 日本語文字数  + 1 */
 wchar_t  wbuf[1240];

/* マルチバイトUTF-8 で漢字は3バイト,一文字取るなら 3 + 1 */
 char str1[4] = { 0 };
 char str2[4] = { 0 };
 char gram2[7]  = { 0 };
 int test = 0;
 FILE *fp;
 char * p;
 
 map<string, int> m1;
 map<string, int>::iterator pa; 

 setlocale(LC_ALL,"");
 printf("file = %s\n", argv[1]);

 if((fp = fopen(argv[1], "r")) == NULL){
    printf("file not found\n");
	return(1);
    }else{
	while(!feof(fp)){
	  if(fgets(input, 1024, fp) != NULL){
		 p = strchr( input, '\n' );
		 /* 改行文字があった場合 */
		 if ( p != NULL )
		{
		  /* 改行文字を終端文字に置き換える */
		 *p = '\0';
		}
 
	printf("size of input= %d\n", sizeof(input));
	printf("strlen of input= %d\n", strlen(input));  
	if(strlen(input) > 0){
	   printf("%s\n", input);

         /* マルチバイト文字列をワイド文字列に変換*/

	   mbstowcs(wbuf, input,  strlen(input));
	   printf("strlen of wbuf = %d\n", wcslen(wbuf));  
          while(test < wcslen(wbuf)  ){					
		wctomb(str1,wbuf[test]);
		wctomb(str2,wbuf[test+1]);
		sprintf(gram2, "%s%s",str1, str2);
               /* Windows minGWでは wsprintf とする必要がある */
		pa = m1.find(gram2);
		//出てきた形態素原型は既にマップにあるか?
		  if(pa != m1.end()){
		    pa->second =  pa->second + 1;
			 //二つ目の数値を加算
		  }
		  else{// マップにないなら,新規にマップに追加
		   m1.insert(make_pair(gram2, 1));
                       // 1 は 1個目と言う意味
		  }

		test++;
		}
	    }// while_2
        }// _if 
     } //_while_1

	pa = m1.begin();
	while(pa != m1.end()){ 
	  printf("%s = %d\n", (pa->first).c_str(), (pa->second) ); 
	  pa++;
	}

   }//_else
}