出張+シュッチョー+17 [出張+シュッチョー+17] sh u q ch o:
出張所+シュッチョー{ショ/ジョ}+2 [出張所+シュッチョーショ+2] sh u q ch o: sh o
出張所+シュッチョー{ショ/ジョ}+2 [出張所+シュッチョージョ+2] sh u q ch o: j o
出超+シュッチョー+2 [出超+シュッチョー+2] sh u q ch o:
出直し+デナオシ+2 [出直し+デナオシ+2] d e n a o sh i
出直し+デナオシ+出直す+44/12/6 [出直し+デナオシ+出直す+44/12/6] d e n a o sh i
出直す+デナオス+44/12/2 [出直す+デナオス+44/12/2] d e n a o s u
出廷+シュッテイ+17 [出廷+シュッテイ+17] sh u q t e i
出典+シュッテン+2 [出典+シュッテン+2] sh u q t e N
出展+シュッテン+17 [出展+シュッテン+17] sh u q t e N
出店+シュッテン+17 [出店+シュッテン+17] sh u q t e N
出土+シュツド+17 [出土+シュツド+17] sh u ts u d o
上のように各行に「表記+読み+品詞コード+音素列」が示されているデータ群を音素列の発生頻度から発生確率を求めたいのです。
少し前に作った文字カウントのソースコードに改良して作り、下のようなところまでできたのですが、少し積んでしまいました。
そこで、
- 現在単語を区切る文字をスペースにしているのですが、それだとローマ字表記の部分まで区切られてしまうので、ファイル からの行の読み込みを"sscanf"を利用してそれぞれの行の書式付きで読み込みカウントしたい
- カウントされた結果を高い順に回数とともに出力したい
の2点についてアドバイスお願いします。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define FILENAME "data.txt" /*入力するファイル名*/ #define SEPARATOR " " /*単語を区切る文字*/ #define TABLESIZE 100000 /*word_tableの大きさ*/ struct word_count { char *word; /*単語*/ int count; /*頻度*/ }; int main() { FILE *fp; struct word_count word_table[TABLESIZE]; /*単語と頻度を格納する配列*/ char line[256], *token; int i, table_size, find; table_size = 0; /*ファイル入力にエラーが生じた場合*/ if ((fp = fopen(FILENAME, "r")) == NULL) { printf("file open error!!\n"); exit(1); } while(fgets(line, 256, fp) != NULL) { token = strtok(line, SEPARATOR); for(;token!= NULL;token = strtok(NULL, SEPARATOR)){ find = 0; /*word_tableとの照合*/ for (i = 0; i < table_size; i++) { /*一致する単語を見つけた場合*/ if (strcmp(token, word_table[i].word) == 0) { word_table[i].count++; find = 1; break; } } /*word_table中に一致する単語がなかった場合*/ if (find == 0) { word_table[table_size].word = malloc((strlen(token)+1)*sizeof(char)); strcpy(word_table[table_size].word,token); word_table[table_size].count = 1; table_size++; } } } fclose(fp); /*word_tableを出力*/ for (i = 0; i < table_size; i++) { printf("word=%5s count=%d\n", word_table[i].word, word_table[i].count); } return(0); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。