自然言語処理について勉強しています。
Wikipediaのdumpデータ(xml)から本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が出なくて困っています。
欲しい出力は3つです.
1,,<text>〜</text>の開始ポイントとバイト数.
2.<title>〜</title>の開始ポイントとバイト数.
3.<id>〜</id>の開始ポイントとバイト数.
コンパイルは通りますが,実行しても秒で終了し,何も出力されません.
プログラミングはあまり得意ではないです。
以下にソースコードを貼り付けます。
wiki_getter1_byte.c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main() 6{ 7 8 size_t p, pb[3]; 9 char line[BUFSIZ]; 10 char title[BUFSIZ]; 11 char idnum[BUFSIZ]; 12 char startw[] = "<text";//ここと一つ下ををtitleやidに変えて実行したい 13 char endw[] = "</text>"; 14 char nextw[] = "</page>"; 15 char *readfilename = "jawiki-20211220-pages-articles-multistream2.xml"; //読み込むファイル 16 char *writefilename = "wiki_byte1.txt"; //書き込むファイル 17 18 FILE *fp = fopen(readfilename, "r"); 19 FILE *fw = fopen(writefilename, "w"); 20 if ((NULL == fp) || (NULL == fw)) 21 abort(); 22 else{ 23 printf("ファイル開きます"); 24 } 25 while (p = ftell(fp), fgets(line, BUFSIZ, fp)) 26 { 27 28 if (strstr(line, startw)) 29 pb[0] = p; 30 else if (strstr(line, endw)) 31 { 32 pb[1] = p - pb[0]; 33 printf("%zu\t%zu\n", pb[0], pb[1]);//欲しい出力 34 strstr(line, nextw);//revisionの下の<id>を読み込まないため 35 // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ...書き込み用, 36 // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... 37 } 38 fclose(fw); 39 fclose(fp); 40 } 41} 42 43
実行時はファイル読み込みは出ているようです.
欲しい部分の理解用にwikiのxmlファイルの一例を示します.
<page> <title>鳥取砂丘</title> <ns>0</ns> <id>19812</id> <revision> <id>53717095</id> <parentid>53211643</parentid> <timestamp>2014-12-06T03:46:16Z</timestamp> <contributor> <ip>58.156.158.18</ip> </contributor> <comment>/* 砂丘の利用と周辺住民とのかかわり */</comment> <model>wikitext</model> <format>text/x-wiki</format> <text xml:space="preserve">{{Coord|35|32|27.821|N|134|13|41.789|E|region:JP|display=title}} [[ファイル:Tottori-Sakyu Tottori Japan.JPG|thumb|300px|馬の背]] {{mapplot|134.2290|35.5407|鳥取砂丘}} '''鳥取砂丘'''(とっとりさきゅう)は、[[鳥取県]][[鳥取市]]の[[日本海]]海岸に広がる広大な砂礫地で、代表的な[[海岸砂丘]]。日本三大砂丘の1つである<ref>その他の2つについては、諸説ある。</ref>。[[山陰海岸国立公園]]の特別保護地区に指定されており、南北2.4km、東西16kmに広がる日本最大の観光可能な[[砂丘]]である。(一般に立ち入れない物も含めると、日本最大の砂丘は<!--(内陸にある砂丘を含めると-->[[青森県]]の[[猿ヶ森砂丘]])。<!--内陸砂丘は大陸内部の砂丘を示し、日本には内陸砂丘なないため編集しました--> <中略> [[Category:日本の海岸景勝地]] [[Category:砂丘]] [[Category:平成百景]] [[Category:日本の地質百選]]</text> <sha1>axvz6j2vrmxe3n68ssg11m0w8qtcobn</sha1> </revision> </page>
追記:現在のソースを追記しておきます.
Wiki_parser1_Byte.c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE 256 * 1024 * 1024 5 6int main() 7{ 8 9 size_t p, pb[2]; 10 char *line = malloc(SIZE); 11 FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); 12 FILE *fw = fopen("get_text_byte.txt", "w"); 13 // printf(fw,"startbyte\t記事のbyte \n"); 14 if ((NULL == fp) || (NULL == fw)) 15 abort(); 16 while (p = ftell(fp), fgets(line, SIZE, fp)) 17 { 18 if (strstr(line, "<page>")) 19 { 20 pb[0] = p; 21 22 if (strstr(line, "</page>")) 23 { 24 pb[1] = p - pb[0]; 25 26 // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ... 27 // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... テキスト形式で観察可能 28 } 29 printf("%zu\t%zu\n", pb[0], pb[1]); 30 } 31 } 32 printf("process ok"); 33 free(line); 34 fclose(fw); 35 fclose(fp); 36}
現在の出力も載せておきます.
1536124776 0 1536146103 0 1536146845 0 1536147939 0 1536153955 0 1536159921 0 1536174339 0 1536177008 0 1536181947 0 1536187730 0 1536188261 0 1536205531 0 1536286862 0 1536292238 0 1536295216 0 1536302579 0 1536318555 0 process ok
処理自体は動いていますがバイト数が常に0です.
回答2件
あなたの回答
tips
プレビュー