やりたいこと
自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
segmentation faultがすぐに起きて困ってます.
やりたいこととしては以下です.
・list_history0.txt の各行が欲しい記事の "タイトル" を示している。
・get_X1.txt の各行が (xml ファイル内の記事の ) "タイトル", "id", "開始バイトオフセット", "バイトサイズ" を示している。
・list_history0.txt から一行ずつ読み込み、 get_X1.txt からタイトルが一致する行を探して"開始バイトオフセット", "バイトサイズ"を利用して xml ファイルからその記事を取り出し、「タイトル(タブ)id(改行)記事」を history_0text.txt に書き出す
プログラミングはあまり得意ではないです。
ソースコードとファイル構成
list_history0.txt(get_X1.txtの一部)
日本ゴルフツアー機構 ファイル:十弗駅看板.jpg 桂米朝 国道101号 笑福亭松鶴 リサジュー図形 ムラカ 日淳 井原裕士
次にget_X1.txt
遠山景晋 493646 2948 0 双子 (映画) 1011517 13316 12558 ユダヤ史関連人物の一覧 1855796 18478 68347 Trip trip 56477 87361 0 新銀行東京 615917 91374 90824 東京都道444号下石神井大泉線 61977 144134 143579 野川さくら 1485326 147328 146788 リメンバー・ミー 1740912 231113 230616 ダヒル・リヤレ・カヒン 787401 233208 232520 ソマリランドの大統領一覧 1094317 237068 236399 バルティ 1094317 242216 3511 歌がチカラ 56477 246360 0 トーンチャン 994927 250016 1231 北海道道145号伊達インター線 1428473 251833 0 アクセス禁止 97976 255003 254438 蒲池城 928380 274271 1331 新潟地震 1583832 276296 0 長崎貿易 872478 310391 309847 春牟古丹島 730521 319037 318416 スター誕生! 1873614 325384 324878 サーキット 1037035 456227 455590 Wikipedia:今日は何の日 9月 597321 510011 44598 WP 1617964 555804 2507 栄町駅 (札幌市) 366911 558992 0 北海道中央バス 1599928 574344 573819 広島電鉄1300形電車 6896 668607 668053 柳川鍋 924713 669194 668686 京都市内の通り 191555 676990 37953 由布岳 918416 715450 0 HN 1486874 724007 723488 コンセルヴァトワール 910758 724984 724479 玉川砂記子 1094317 729024 728336 シラガゴケ類 397108 782982 782331 NC 059668 785975 5126 スギゴケ 1781685 791744 0 摂津源氏 990884 794923 794341 NE 262022 805690 805156 NG 1718990 808263 807633 源氏嫡流 279186 810908 810440 魔性の子 1680100 819840 819300 NI 474 844662 844142 NL 104512 846162 845675 翼細胞 208476 847883 847316 NO 230804 848873 848430 多田源氏 990884 850953 850420 NR 786173 863825 863328 フワランポーン駅 1356379 866728 866158 キングカメハメハ 1693773 886601 886041 OM 387704 978075 977510 苔 826261 980849 980395 徐世昌 16765 988907 988200 NY市警緊急出動部隊 トゥルー・ブルー 791294 997442 996895 PE 1627601 1006180 3452 セラミック噴射装置 3751 1010197 0 堀内賢雄 12357 1010829 1010266 筑後宇都宮氏 575671 1197925 1197423 リンカーン (競走馬) 194189 1202581 1201984 PK 703098 1223633 3515 真田町 1231761 1229043 6504 トンファー 503710 1236096 0 情報処理技術者試験 444436 1244748 1244203 キングマンボ 1728221 1308947 1308351 イースター (曖昧さ回避) 120987 1322716 1322186 田中新兵衛 760804 1324023 1323537 PR 703098 1331531 1331062 PT 665832 1336401 1335869 高橋俊昌 291984 1341864 1341250 PW 136753 1350315 1349839 坂城町 685790 1352052 1351543 セレン整流器 1094317 1362107 1361338 ポリアクリルアミドゲル電気泳動 520484 1365670 1365099 シェルピンスキー数 990884 1371139 1370494 はだしのゲン 1126159 1379494 1378926 伊王島町 1338147 1525866 1525301 ノイローゼ 371027 1539066 1538569 原子力発電所 1084393 1540501 1539942 宮崎県総合運動公園第二硬式野球場 320096 1569579 7259 藤田瞳子 1094317 1578500 6210 赤外分光法 1768613 1585235 0 宇都宮清原工業団地 850234 1599642 1599097 樊噲 262022 1603667 1603179 国道385号線 7146 1611313 1610756 深川 1094317 1612117 1611379 碓氷第三橋梁 308365 1616321 5517 //読み込みたいところ 日本ゴルフツアー機構 870371 1623035 25562 ファイル:十弗駅看板.jpg 1780509 1649736 682 桂米朝 1589144 1652031 1217 国道101号 643806 1654059 0 笑福亭松鶴 1143138 1672954 1672423 リサジュー図形 1037035 1682479 1681821 ムラカ 885381 1691394 14441 日淳 1037035 1706472 0 井原裕士 308365 1710132 1709601 //読み込みたいところここまで ソマリア内戦 1037035 1714267 36576 深川 (江東区) 020100 1751367 0 日昇 833366 1764959 1764447 以下略
次にソースコードです.//追記に現在のソースを追加してます.
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5#define MAX_REC (300000) 6typedef struct 7{ 8 char title[256]; 9 char id[128]; 10 int pb1; 11 int pb2; 12} X1_INFO; 13int main() 14{ 15 16 int ll; 17 int i; 18 int x1_ctr = 0; 19 char *p; 20 X1_INFO *wx1; 21 char pb1[16]; 22 char pb2[16]; 23 char *line = malloc(SIZE); 24 char *title = malloc(SIZE); 25 char *id = malloc(SIZE); 26 char *text = malloc(SIZE); 27 char *stitle = malloc(SIZE); 28 X1_INFO *x1ptr = malloc(sizeof(X1_INFO) * MAX_REC); 29 if (x1ptr == NULL) 30 { 31 printf("X1_INFO allocate error\n"); 32 return 10; 33 } 34 FILE *fp = NULL; 35 FILE *fr = NULL; 36 FILE *fr2 = NULL; 37 FILE *gt = NULL; 38 fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "rb"); //大元.wiki記事 39 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 40 fr2 = fopen("get_X1.txt", "r"); //読み込むファイル2タイトルとidが記入 41 gt = fopen("history_0text.txt", "w"); //書き込むファイル 42 // get_X1を全て読み込む 43 while (fgets(line, SIZE, fr2) != NULL) 44 { 45 if (x1_ctr >= MAX_REC) 46 { 47 printf("Max Record Count Over:%d\n", MAX_REC); 48 return 10; 49 } 50 ll = strlen(line); 51 p = strtok(line, "\t\n"); 52 strcpy(title, p); 53 p = strtok(NULL, "\t\n"); 54 strcpy(id, p); //デバッガによるとここでEXC_BAD_ACCESS (code=1, address=0x0) が発生 55 p = strtok(NULL, "\t\n"); 56 strcpy(pb1, p); 57 p = strtok(NULL, "\t\n"); 58 strcpy(pb2, p); 59 wx1 = x1ptr + x1_ctr; 60 strcpy(wx1->title, title); 61 strcpy(wx1->id, id); 62 wx1->pb1 = atoi(pb1); 63 wx1->pb2 = atoi(pb2); 64 x1_ctr++; 65 } 66 while (fgets(line, SIZE, fr) != NULL) 67 { 68 ll = strlen(line); 69 if (line[ll - 1] == '\n' && ll > 0) 70 line[ll - 1] = '\0'; //改行削除 71 strcpy(stitle, line); 72 printf("Stitle(検索対象)is %s.\n", stitle); 73 for (i = 0; i < x1_ctr; i++) 74 { 75 wx1 = x1ptr + i; 76 if (strcmp(wx1->title, stitle) == 0) 77 { 78 printf("%s is found! title:%s\n", stitle, wx1->title); 79 fseek(fp, wx1->pb1, SEEK_SET); 80 memset(text, 0x00, SIZE); 81 if (wx1->pb2 > 0) 82 { 83 fread(text, 1, wx1->pb2, fp); 84 } 85 printf("%s\t%s\n%s\n\n\n", wx1->title, wx1->id, text);//記事の間を3行開けたい. 86 break; 87 } 88 } 89 if (i == x1_ctr) 90 { 91 printf("%s is not found!\n", stitle); 92 } 93 } 94 printf("\n\n\nprocess ok!\n\n\n"); 95 fclose(fp); 96 fclose(fr); 97 fclose(fr2); 98 fclose(gt); 99}