質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MediaWiki

MediaWikiは、Wikipediaを運営するウィキメディア財団が開発するコラボレーションツールです。複数ユーザーによるコンテンツ管理機能を備えるなど、Wikipediaと同じ操作性や編集機能を持ちます。PHPで記述されており、MySQLやPostgreSQLをデータベースに使用できます。

Q&A

解決済

4回答

858閲覧

wikipedia dump データの処理について〜読み込みと反映ができない〜

studyprg

総合スコア57

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MediaWiki

MediaWikiは、Wikipediaを運営するウィキメディア財団が開発するコラボレーションツールです。複数ユーザーによるコンテンツ管理機能を備えるなど、Wikipediaと同じ操作性や編集機能を持ちます。PHPで記述されており、MySQLやPostgreSQLをデータベースに使用できます。

0グッド

0クリップ

投稿2022/06/11 11:26

編集2022/06/13 06:08

やりたいこと

自然言語処理について勉強しています。
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つである&lt;ref&gt;その他の2つについては、諸説ある。&lt;/ref&gt;。[[山陰海岸国立公園]]の特別保護地区に指定されており、南北2.4km、東西16kmに広がる日本最大の観光可能な[[砂丘]]である。(一般に立ち入れない物も含めると、日本最大の砂丘は&lt;!--(内陸にある砂丘を含めると--&gt;[[青森県]]の[[猿ヶ森砂丘]])。&lt;!--内陸砂丘は大陸内部の砂丘を示し、日本には内陸砂丘なないため編集しました--&gt; 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/11 14:39

指摘のとうり修正した結果吐き出されたWarningsです。 warning: format specifies type 'int *' but the argument has type 'int' [-Wformat] while (fscanf(fr, "%d \t %d \n ", pb[0], &pb[1]) != EOF) { ~~ ^~~~~ Wiki_getter2_All.c:40:116: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat] printf("現在のファイルポインタの位置は「%d」です。, 読み込むバイトは「%d」\n",p1,&pb[1]); ~~ ^~~~~~ 2 warnings generated.
studyprg

2022/06/11 15:21

指摘の通り修正しましたが変わってないですね。 intで宣言したはずなんですけど。。。
studyprg

2022/06/11 16:54

追記しました。 エラー内容が一部変化しましたが問題解決に至ってません。 ご協力お願いします。
melian

2022/06/12 14:11

あら、確かに fr = fopen("get_text_byte.txt", "r"); が消えてる…
studyprg

2022/06/12 14:16

ありがとうございます! 解決しました!
guest

回答4

0

ベストアンサー

6月12日22:49時点のソースだと、frNULLのまま使用されています。
get_text_byte.txtをオープンする処理が抜けていませんか?

投稿2022/06/12 13:51

m-take

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/12 14:08

ありがとうございました! 普通に動きました!
guest

0

warning: format specifies type 'int *' but the argument has type 'int' [-Wformat] while (fscanf(fr, "%d \t %d \n ", pb[0], &pb[1]) != EOF) {

int *を渡す必要がある部分にintが渡されているという内容です。
pb[0]の内容を読み取った値で変更したいのであれば、&pb[0]とポインタを渡さなければいけません。

Wiki_getter2_All.c:40:116: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat] printf("現在のファイルポインタの位置は「%d」です。, 読み込むバイトは「%d」\n",p1,&pb[1]);

こちらは逆にintを渡すべき部分にint *が渡されています。
&pb[1]ではなくpb[1]とすべきです。

投稿2022/06/11 15:58

m-take

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/11 16:42

指摘された箇所を修正しましたが、segmation faultですね。 以下デバッガのメッセージです。 (lldb) run Process 2548 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x00007fff20456794 libsystem_c.dylib`__svfscanf_l + 7527 libsystem_c.dylib`__svfscanf_l: -> 0x7fff20456794 <+7527>: movl %eax, (%rcx) 0x7fff20456796 <+7529>: jmp 0x7fff204566ef ; <+7362> 0x7fff2045679b <+7534>: movzbl (%r14), %edi 0x7fff2045679f <+7538>: movq %r11, %rsi Target 0: (get_all) stopped.
studyprg

2022/06/12 14:16

ありがとうございます! 解決しました!
guest

0

※ 削除

投稿2022/06/11 18:46

編集2022/06/12 00:21
melian

総合スコア19714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/12 00:10

完全な解答でありがたいのですが、cでやらないといけないかなと思っています。
melian

2022/06/12 00:20

了解です。実は手元の環境(Ubuntu Linux 22.04/gcc 11.2.0)で質問欄のソースコードをコンパイルして実行してみたのですが、問題なく実行できました(スタック領域に256MB確保するところで少し引っ掛かりましたが)。
studyprg

2022/06/12 00:41

OS間の違いですかね? 出力ファイルはちゃんとしてましたか?
melian

2022/06/12 02:11

はい、get_text_byte.txt で指定されている領域が切り出されています。少し気がかりなのは、質問にある get_text_byte.txt は TAB コードであるはずの部分が U+2000(全角スペース)になっていることです。手元で実行する時にはそこを TAB に変更しました。
studyprg

2022/06/12 02:16

なるほどです. ちょっと打ち直して動かしてきます.
studyprg

2022/06/12 02:23

macだとうまくいきませんね.こちらの環境はmacbook pro OS:11.6.7です.
studyprg

2022/06/12 14:15

ありがとうございます! 解決しました!
guest

0

fseek(fp,pb[0],SEEK_CUR);

もし pb[0] に入っているのがファイル先頭からのオフセットなら、SEEK_CUR ではなく SEEK_SET にすべきです。

fgets(line,pb[1],fp);

fgets() では1行しか読めません。2行以上を読みたいなら、fread() です。fread() のあと line[pb[1]] = 0; で0終端しましょう。


追記:

c

1#define SIZE 256 * 1024 * 1024 2... 3 char line[SIZE] = {}; 4 .... 5 char title[SIZE] = {};

こんな巨大な自動変数は確保できない可能性があります。両方ともmalloc()にしましょう。

char* line = malloc(SIZE); char* title = malloc(SIZE); .... // main()終了前に free(line); free(title);

投稿2022/06/11 14:10

編集2022/06/12 06:42
int32_t

総合スコア20850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/11 14:24

引き続きありがとうございます。 今動かして経過を報告しますね
studyprg

2022/06/11 14:41

追記に記入しました。
int32_t

2022/06/11 15:02

> fread(line,sizeof(size_t),pb[1],fp); fread(line, sizeof(char), pb[1], fp); です。あと、fread() は 0 終端しないので、次に line[pb[1]] = 0; もしないと文字列として扱えませんね。
studyprg

2022/06/11 15:22

ありがとうございます。 修正しましたが追記のエラーと同じですね。 方は合ってると思うんですけど。。。
studyprg

2022/06/12 06:51

追記された部分を入れて動かしましたが実行時にsegmation faultが出てしまいます.
int32_t

2022/06/12 07:27

最新のデバッガ上での bt の結果はどうなりますか。
studyprg

2022/06/12 10:48

Process 11418 launched: '/***/get_all' (x86_64) (lldb) bt * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) * frame #0: 0x00007fff20456794 libsystem_c.dylib`__svfscanf_l + 7527 frame #1: 0x00007fff204496ad libsystem_c.dylib`fscanf + 188 frame #2: 0x0000000100003d74 get_all`main at Wiki_getter2_All.c:23:9 frame #3: 0x00007fff20554f3d libdyld.dylib`start + 1 frame #4: 0x00007fff20554f3d libdyld.dylib`start + 1
melian

2022/06/12 11:29

> studyprg さん つかぬことを伺いますが、jawiki-20211220-pages-articles-multistream2.xml のファイルサイズは 2GB 以上ではありませんか? また、get_text_byte.txt に含まれている数値に、2147483647 を超える値が含まれていませんか?
studyprg

2022/06/12 12:06

jawiki-20211220-pages-articles-multistream2.xml のファイルサイズは 2GB 以上ではありませんか? A.1.54GBですね. get_text_byte.txt に含まれている数値に、2147483647 を超える値が含まれていませんか? A.一番でかい数字で1536318555ですね.
melian

2022/06/12 13:36

> studyprg さん ありがとうございます。ファイルサイズが INT_MAX を超えているのかも、と思ったのですが違いましたね。。。
studyprg

2022/06/12 14:15

ありがとうございます! 解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問