C_N-gram の変更点 - RとLinuxと...

RとLinuxと...


C_N-gram の変更点


[[Programming]]

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

 #include <stdio.h>
 #include <stdlib.h>
 #include <wchar.h>
 #include <string.h>
 #include <limits.h>
 #include <locale>
 #include <map>
 #include <iostream>

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

 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;

  /* マルチバイトUTF-8 で漢字は3バイト,一文字取るなら 3 + 1 */
  char  str1  [MB_LEN_MAX + 1]; // [4] = { 0 };
  char str2   [MB_LEN_MAX + 1]; // [4] = { 0 };
  char gram2 [7]  = { 0 };
  int i, 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");
    printf("file not found\n");
	return(1);
     }else{
  }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);
		p = strchr( input, '\n' );
		/* 改行文字があった場合 */
		if ( p != NULL )
		  {
			/* 改行文字を終端文字に置き換える */
			*p = '\0';
		  }
 
          /* マルチバイト文字列をワイド文字列に変換*/
 
	   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;
			 //二つ目の数値を加算
		printf("size of input= %lu\n",  sizeof(input));
		printf("strlen of input= %lu\n",  strlen(input));  
		if(strlen(input) > 0){
		  printf("%s\n", input);

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

		  mbstowcs(wbuf, input,  strlen(input));
		  printf("strlen of wbuf = %lu\n", wcslen(wbuf));  
		  while(test < wcslen(wbuf)  ){
			/* ワイド文字列をマルチバイト文字列に変換*/
			i = wctomb(str1,wbuf[test]);
			str1 [i] = '\0';
			cout << "str1 = " <<  i << " = " << str1 << endl;
			i =	wctomb(str2,wbuf[test+1]);
			str2 [i] = '	\0';
			cout << "str2 = " <<  i << " = " << str2 << endl;
			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++;
		  }
		  else{// マップにないなら,新規にマップに追加
		   m1.insert(make_pair(gram2, 1));
                        // 1 は 1個目と言う意味
		  }
 
		test++;
		}
	    }// while_2
         }// _if 
      } //_while_1
 
 	pa = m1.begin();
	  }// _if 
	} //_while_1

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

  }//_else
 }


//#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
//}
// _end_main