自然言語処理について勉強しています。
Wikipediaのdumpデータ(xml)から本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が出なくて困っています。
欲しい出力は3つです.
1,,<text>〜</text>の開始ポイントとバイト数.
2.<title>〜</title>の開始ポイントとバイト数.
3.<id>〜</id>の開始ポイントとバイト数.
コンパイルは通りますが,実行しても秒で終了し,何も出力されません.
プログラミングはあまり得意ではないです。
以下にソースコードを貼り付けます。
wiki_getter1_byte.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { size_t p, pb[3]; char line[BUFSIZ]; char title[BUFSIZ]; char idnum[BUFSIZ]; char startw[] = "<text";//ここと一つ下ををtitleやidに変えて実行したい char endw[] = "</text>"; char nextw[] = "</page>"; char *readfilename = "jawiki-20211220-pages-articles-multistream2.xml"; //読み込むファイル char *writefilename = "wiki_byte1.txt"; //書き込むファイル FILE *fp = fopen(readfilename, "r"); FILE *fw = fopen(writefilename, "w"); if ((NULL == fp) || (NULL == fw)) abort(); else{ printf("ファイル開きます"); } while (p = ftell(fp), fgets(line, BUFSIZ, fp)) { if (strstr(line, startw)) pb[0] = p; else if (strstr(line, endw)) { pb[1] = p - pb[0]; printf("%zu\t%zu\n", pb[0], pb[1]);//欲しい出力 strstr(line, nextw);//revisionの下の<id>を読み込まないため // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ...書き込み用, // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... } fclose(fw); fclose(fp); } }
実行時はファイル読み込みは出ているようです.
欲しい部分の理解用に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
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { size_t p, pb[2]; char *line = malloc(SIZE); FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); FILE *fw = fopen("get_text_byte.txt", "w"); // printf(fw,"startbyte\t記事のbyte \n"); if ((NULL == fp) || (NULL == fw)) abort(); while (p = ftell(fp), fgets(line, SIZE, fp)) { if (strstr(line, "<page>")) { pb[0] = p; if (strstr(line, "</page>")) { pb[1] = p - pb[0]; // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ... // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... テキスト形式で観察可能 } printf("%zu\t%zu\n", pb[0], pb[1]); } } printf("process ok"); free(line); fclose(fw); fclose(fp); }
現在の出力も載せておきます.
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です.
まだ回答がついていません
会員登録して回答してみよう