やりたいこと
自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が想定とは全然違って困っています。
欲しい出力は,,<page>~~</page>の中身です。
後述の一例が取得できず困っています。
プログラミングはあまり得意ではないです。
実行環境
Macbook pro(2017)
OS:11.6.7
以下に用意したファイル(記事の始点と記事の大きさのbyte数が入っている。)の一部とソースコードを貼り付けます。
get_text_byte.txt
1607 10049 212666 4195 316871 483 417364 633 518007 68927 686944 3990 790944 52745 8143699 3193 9146902 83814 10230726 1897 11232633 3884 12236527 4580 13241117 571 14241698 4139 15245847 3181 16249038 619 17249667 1711 18251388 3170 19... 20...
Wiki_getter2_All.c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE 256 * 1024 * 1024 5int main() 6{ 7 8 int p, p1 = 0; 9 int pb[5] = {}; 10 char *line = malloc(SIZE); 11 char *title = malloc(SIZE); 12 FILE *fp = NULL; 13 FILE *fr = NULL; 14 FILE *gt = NULL; 15 fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); 16 fr = fopen("get_text_byte.txt", "r"); 17 gt = fopen("get_text_all.txt", "w"); //中身ないからNULL? 18 while (fscanf(fr, "%d\t%d\n", &pb[0], &pb[1]) != EOF) 19 { 20 /* 21 if (strstr(line, "<page>")) 22 pb[0]=p; 23 else if (strstr(line, "</page>")){ 24 pb[1] = p - pb[0]+1;//readしたとき対策. 25 fseek(fp,-pb[1],SEEK_SET); 26 27 fprintf(stderr, "start=%d size=%d BUFSIZ=%d\n", pb[0], pb[1], BUFSIZ); 28 // printf("%d",fp); 29 fgets(line,pb[1],fp); 30 //fwrite(pb, sizeof(size_t), 2, fw); // ... 31 //fprintf(fw, "%hhd\t%hhd\n", pb[0], pb[1]); //... 名残 32 fprintf(fw,"%s \n",line); 33 } 34 */ 35 fseek(fp, pb[0], SEEK_SET); 36 pb[0] = p; 37 printf("現在のファイルポインタの位置は「%d」です。, 読み込むバイトは「%d」\n", pb[0], pb[1]); 38 fread(line, sizeof(char), pb[1], fp); 39 fprintf(gt, "%s \n", line); 40 line[pb[1]] = 0; 41 } 42 printf("process ok"); 43 free(line); 44 free(title); 45 fclose(fp); 46 fclose(fr); 47 fclose(gt); 48} 49
**6/12AM2:00頃:追記のエラー。segmention fault発生。(答えの指摘でもありましたがUbuntsuではうまいこと動くっぽい)
問題は解決してない。。。**
追記:frのopen忘れてました...
解決しました!
欲しい出力の一例です。これが大量に入ったファイルが欲しいです。
sample
1 <page> 2 <title>鳥取砂丘</title> 3 <ns>0</ns> 4 <id>19812</id> 5 <revision> 6 <id>53717095</id> 7 <parentid>53211643</parentid> 8 <timestamp>2014-12-06T03:46:16Z</timestamp> 9 <contributor> 10 <ip>58.156.158.18</ip> 11 </contributor> 12 <comment>/* 砂丘の利用と周辺住民とのかかわり */</comment> 13 <model>wikitext</model> 14 <format>text/x-wiki</format> 15 <text xml:space="preserve">{{Coord|35|32|27.821|N|134|13|41.789|E|region:JP|display=title}} 16[[ファイル:Tottori-Sakyu Tottori Japan.JPG|thumb|300px|馬の背]] 17{{mapplot|134.2290|35.5407|鳥取砂丘}} 18'''鳥取砂丘'''(とっとりさきゅう)は、[[鳥取県]][[鳥取市]]の[[日本海]]海岸に広がる広大な砂礫地で、代表的な[[海岸砂丘]]。日本三大砂丘の1つである<ref>その他の2つについては、諸説ある。</ref>。[[山陰海岸国立公園]]の特別保護地区に指定されており、南北2.4km、東西16kmに広がる日本最大の観光可能な[[砂丘]]である。(一般に立ち入れない物も含めると、日本最大の砂丘は<!--(内陸にある砂丘を含めると-->[[青森県]]の[[猿ヶ森砂丘]])。<!--内陸砂丘は大陸内部の砂丘を示し、日本には内陸砂丘なないため編集しました--> 19 20[[1955年]](昭和30年)に国の[[天然記念物]]に指定された。[[2007年]](平成19年)には[[日本の地質百選]]に選定された。 21 22== 砂丘の状況 == 23[[中国山地]]の[[花崗岩]]質の[[岩石]]が[[風化]]し、[[千代川]]によって日本海へ流されたあと、海岸に集まったものが砂丘の主な[[砂]]となっている。海中の砂を海岸に向けて流れ寄せる潮流と、海岸線に[[堆積]]した砂を内陸へ吹き込む[[卓越風]]の働きで形成された。 24 25砂丘は千代川の東西に広がっているが、通常「鳥取砂丘」というと、千代川の東側の545haの「浜坂砂丘」を指す。砂丘によって海から切り離されて出来た湖である[[多鯰ヶ池]]がすぐ南東にある。 26 27 28<中略> 29 30 31</text> 32 <sha1>axvz6j2vrmxe3n68ssg11m0w8qtcobn</sha1> 33 </revision> 34 </page> 35 36
回答4件
あなたの回答
tips
プレビュー