Closed9

wikipedia dumpファイルからのデータ抽出

Hidden comment
taguchitaguchi

参考にした記事

https://qiita.com/yukinoi/items/78d64aeb3afbaadf52b1

code

https://github.com/ikegami-yukino/misc/blob/master/data/wikipedia_synonym.py

準備

# 対象カテゴリ設定
cat_pattern = re.compile("\((\d+),'?(漫画作品_[ぁ-ん])'?,[^\)]+\)")
# ページの始まりから初めの見出しまでのテキストを抜き取り,紹介文(abstract)とする
abst_pattern = re.compile(r"</ns>\s*<id>(\d+)</id>[\s\S]*?<text\b[^>]*>([\s\S]*?)(?=\n=+|</text>)")
IGNORE_PREFIX = ('削除依頼/', '検証/', '進行中の荒らし行為/', '井戸端/', 'WP:',
                 '利用者:', 'User:', 'ウィキプロジェクト', 'PJ:')
IGNORE_SUBSTR = ('Wikipedia:', 'Template:', 'Listes:', '過去ログ:', 'ファイル:', '画像:',
                 'Section:')
URL_PAGES = ('https://dumps.wikimedia.org/jawiki/latest/'
             'jawiki-latest-page.sql.gz')
URL_CATEGORIES = ('https://dumps.wikimedia.org/jawiki/latest/'
                 'jawiki-latest-categorylinks.sql.gz')
URL_ABST = ('https://dumps.wikimedia.org/jawiki/latest/'
             'jawiki-latest-pages-articles.xml.bz2')
taguchitaguchi

pageid-titleのマッピング抽出

jawiki-latest-page.sql.gz は idとタイトル名のマッピングを抽出するために使用します.
150MB ほどでしたので特に工夫せずにそのまま読みこみが可能です.
このコードは特に変更なし

urllib.urlretrieve(URL_PAGES, os.path.basename(URL_PAGES))

def extract_id_title(path):
    with gzip.GzipFile(path) as fd:
        id2title = dict(re_parentheses.findall(fd.read().decode('utf8')))
    return id2title

id2title  = extract_id_title(path='jawiki-latest-page.sql.gz')

dump

[('1', 'アップロードログ/2004年4月')]

sql.gz 一部抜粋

CREATE TABLE `page` (
  `page_id` int(8) unsigned NOT NULL AUTO_INCREMENT,
  `page_namespace` int(11) NOT NULL DEFAULT 0,
  `page_title` varbinary(255) NOT NULL DEFAULT '',
  `page_is_redirect` tinyint(1) unsigned NOT NULL DEFAULT 0,
  `page_is_new` tinyint(1) unsigned NOT NULL DEFAULT 0,
  `page_random` double unsigned NOT NULL DEFAULT 0,
  `page_touched` binary(14) NOT NULL,
  `page_links_updated` varbinary(14) DEFAULT NULL,
  `page_latest` int(8) unsigned NOT NULL DEFAULT 0,
  `page_len` int(8) unsigned NOT NULL DEFAULT 0,
  `page_content_model` varbinary(32) DEFAULT NULL,
  `page_lang` varbinary(35) DEFAULT NULL,
  PRIMARY KEY (`page_id`),
  UNIQUE KEY `page_name_title` (`page_namespace`,`page_title`),
  KEY `page_random` (`page_random`),
  KEY `page_len` (`page_len`),
  KEY `page_redirect_namespace_len` (`page_is_redirect`,`page_namespace`,`page_len`)
) ENGINE=InnoDB AUTO_INCREMENT=4939794 DEFAULT CHARSET=binary;
/*!40101 SET character_set_client = @saved_cs_client */;

INSERT INTO `page` VALUES 
(1,4,'アップロードログ/2004年4月',0,0,0.00326005555992951,'20240121184624','20240121184810',80312331,106652,'wikitext',NULL),
(2,4,'削除記録/過去ログ_2002年12月',0,0,0.429386262666,'20240208234550','20240121184809',97405943,114,'wikitext',NULL),
(5,0,'アンパサンド',0,0,0.870079839481115,'20240518030248','20240518030301',99347164,14536,'wikitext',NULL),
(6,4,'Sandbox',1,0,0.7534875168963221,'20240606014432','20220314225303',70473293,45,'wikitext',NULL),
(7,2,'Brooke_Vibber',0,0,0.453168387015507,'20240208234510','20240208234510',99177088,8489,'wikitext',NULL),
(10,0,'言語',0,0,0.984009287305185,'20240601040926','20240531213225',100406825,40368,'wikitext',NULL),
(11,0,'日本語',0,0,0.0641177725644016,'20240604154307','20240604154322',100559544,319819,'wikitext',NULL),
(12,0,'地理学',0,0,0.995861652303358,'20240604133111','20240604133114',100161063,32873,'wikitext',NULL)

page_namespace, page_redirect, page_len あたりは使う機会があるかもしれない

テーブル詳細

https://www.mediawiki.org/wiki/Manual:Page_table/ja

taguchitaguchi

カテゴリ情報の抽出

すべてのページではなく,特定のカテゴリのみを絞り込みたいという場合には jawiki-latest-categorylinks.sql.gz を使用します

テーブルデータの確認

CREATE TABLE `categorylinks` (
  `cl_from` int(8) unsigned NOT NULL DEFAULT 0,
  `cl_to` varbinary(255) NOT NULL DEFAULT '',
  `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
  `cl_timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `cl_sortkey_prefix` varbinary(255) NOT NULL DEFAULT '',
  `cl_collation` varbinary(32) NOT NULL DEFAULT '',
  `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
  PRIMARY KEY (`cl_from`,`cl_to`),
  KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
  KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`)
) ENGINE=InnoDB DEFAULT CHARSET=binary;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `categorylinks`
--

/*!40000 ALTER TABLE `categorylinks` DISABLE KEYS */;
INSERT INTO `categorylinks` VALUES 
(5,'ラテン語の語句','あんはさんと\nアンパサンド','2018-05-12 23:37:48','あんはさんと','uppercase','page'),
(5,'出典を必要とする記事/2018年10月','あんはさんと\nアンパサンド','2018-10-08 14:51:00','あんはさんと','uppercase','page'),
(5,'出典を必要とする記述のある記事/2020年5月','あんはさんと\nアンパサンド','2021-05-02 03:36:57','あんはさんと','uppercase','page'),
(5,'独自研究の除去が必要な記事/2018年10月','あんはさんと\nアンパサンド','2018-10-08 14:51:00','あんはさんと','uppercase','page'),
(5,'約物','あんはさんと\nアンパサンド','2018-05-12 23:37:48','あんはさんと','uppercase','page'),
(5,'論理記号','あんはさんと\nアンパサンド','2018-05-12 23:37:48','あんはさんと','uppercase','page'),
(10,'BNFdata識別子が指定されている記事','けんこ\n言語','2023-08-29 14:31:04','けんこ','uppercase','page'),
(10,'BNF識別子が指定されている記事','けんこ\n言語','2022-11-20 03:28:34','けんこ','uppercase','page'),
(10,'GND識別子が指定されている記事','けんこ\n言語','2022-11-20 03:28:34','けんこ','uppercase','page'),
(10,'ISBNマジックリンクを使用しているページ','けんこ\n言語','2024-04-21 05:35:23','けんこ','uppercase','page'),
(10,'J9U識別子が指定されている記事','けんこ\n言語','2023-01-06 11:38:22','けんこ','uppercase','page'),
(10,'LCCN識別子が指定されている記事','けんこ\n言語','2022-11-20 03:28:34','けんこ','uppercase','page'),
...

page_id = 5 : 'アンパサンド' というページには,約物, 論理記号などのカテゴリが付与されていることがわかります.

抽出

ここでは例として,漫画作品カテゴリが付与されているpage_idとの組を抽出することにします.

# 対象カテゴリ設定
cat_pattern = re.compile("\((\d+),'?(漫画作品_[ぁ-ん])'?,[^\)]+\)")

def extract_id_category(path:str, pattern: re.Pattern) -> dict[str:str]:
    """
    指定カテゴリに属するpage_idとカテゴリ名の組を抽出する
    カテゴリのdumpデータはサイズが大きいので分割して読み込む
    """
    with gzip.GzipFile(path) as fd:
        # 50MB ずつ読み込み
        raw_read_size = 1024 * 1024 * 50
        id2category ={}
        while True:
            cont = fd.read(raw_read_size).decode('utf8', errors='ignore')
            if cont:
                id2category.update(dict(pattern.findall(cont)))
            else:
                break
    return id2category

id2cat = extract_id_category(path='jawiki-latest-categorylinks.sql.gz', pattern = cat_pattern)

出力を確認

{'225': '漫画作品_う',
 '228': '漫画作品_あ',
 '472': '漫画作品_こ',
 '479': '漫画作品_あ',
 '580': '漫画作品_ひ',
 '657': '漫画作品_よ',
 '665': '漫画作品_め',
 '934': '漫画作品_い',
 '1071': '漫画作品_わ',
 '1073': '漫画作品_す',
 '1075': '漫画作品_し'
...

ちなみに page_id = 225 : うる星やつら でしたので,適切に抽出できていそうです.
確認時には 17758件の漫画カテゴリに属する記事が存在していました.

taguchitaguchi

リダイレクトデータの抽出

テーブルデータ確認

CREATE TABLE `redirect` (
  `rd_from` int(8) unsigned NOT NULL DEFAULT 0,
  `rd_namespace` int(11) NOT NULL DEFAULT 0,
  `rd_title` varbinary(255) NOT NULL DEFAULT '',
  `rd_interwiki` varbinary(32) DEFAULT NULL,
  `rd_fragment` varbinary(255) DEFAULT NULL,
  PRIMARY KEY (`rd_from`),
  KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
) ENGINE=InnoDB DEFAULT CHARSET=binary;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `redirect`
--

/*!40000 ALTER TABLE `redirect` DISABLE KEYS */;
INSERT INTO `redirect` VALUES 
(6,4,'サンドボックス','',''),
(26,0,'サンドボックス','',''),
(46,0,'ホームページ','',''),
(51,4,'ウィキペディアについて','',''),
(56,0,'地理学','',''),
(85,12,'ページの編集','',''),
(113,0,'ワールドミュージック','',''),
(127,0,'ネマティック液晶','',''),
(128,0,'液晶','',''),(143,0,'音楽家の一覧','',''),
(176,0,'病気の別名の一覧','',''),
(178,2,'Yoshitaka_Mieda','',''),
(216,4,'ウィキペディアへようこそ','',''),
(219,14,'楽曲_(五十音別)','',''),
(260,0,'霊歌','',''),
(278,4,'色の使用','',''),
(281,4,'記事を執筆する','',''),
(283,4,'素晴らしい記事を書くには','','他言語表記は控えめに'),
(291,4,'表記ガイド','',''),
(308,4,'リダイレクト','',''),
(318,0,'酒','',''),
(321,0,'地球科学','',''),
(323,4,'ノートページのガイドライン','',''),
(332,4,'記事どうしをつなぐ','',''),
...

これを見ると (56,0,'地理学','','') から,page_id=56 : 「地理」によるアクセスがpage_id=12 :「地理学」にリダイレクトされていることがわかります.

リダイレクト元のpage_id とリダイレクトリンク先の文字列 という少々扱いにくいペアとなっていますので,page_idとtitle名のmappingを使用してどっちかに揃えると使用しやすいかも.

抽出

def extract_redirects(path):
    with gzip.GzipFile(path) as fd:
        redirectid2text = dict(re_parentheses.findall(fd.read().decode('utf8')))
    return redirectid2text

redirect2text = extract_redirects("jawiki-latest-redirect.sql.gz")
taguchitaguchi

Abstractの抽出

  • ページ全体の情報は必要ない
  • 最初の段落だけ抽出したい

という場合

【非推奨】jawiki-latest-abstract.xml.gz からの抽出

いかにも今回の用途に合っているようなファイル名であるが,なぜか「このデータは使いものにならない」と評されていました

https://blog.i-o.io/?id=1555415792

ということでなぜ使えないのかを一応調べてみます

データ形式

dumpdata
<doc>
<title>Wikipedia: 広島県</title>
<url>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C</url>
<abstract>| 都道府県旗の説明 = 広島県旗</abstract>
<links>
<sublink linktype="nav"><anchor>概要</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#概要</link></sublink>
<sublink linktype="nav"><anchor>地理・地域</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#地理・地域</link></sublink>
<sublink linktype="nav"><anchor>地形</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#地形</link></sublink>
<sublink linktype="nav"><anchor>広袤(こうぼう)</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#広袤(こうぼう)</link></sublink>
<sublink linktype="nav"><anchor>気候</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#気候</link></sublink>
<sublink linktype="nav"><anchor>自然公園</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#自然公園</link></sublink>
<sublink linktype="nav"><anchor>自治体</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#自治体</link></sublink>
<sublink linktype="nav"><anchor>越県合併の模索</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#越県合併の模索</link></sublink>
<sublink linktype="nav"><anchor>岡山県笠岡市(旧茂平村)</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#岡山県笠岡市(旧茂平村)</link></sublink>
<sublink linktype="nav"><anchor>愛媛県(越智郡上島諸島)</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#愛媛県(越智郡上島諸島)</link></sublink>
<sublink linktype="nav"><anchor>土砂災害危険箇所</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#土砂災害危険箇所</link></sublink>
<sublink linktype="nav"><anchor>歴史</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#歴史</link></sublink>
<sublink linktype="nav"><anchor>県名の由来</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#県名の由来</link></sublink>
<sublink linktype="nav"><anchor>原始・古代</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#原始・古代</link></sublink>
<sublink linktype="nav"><anchor>中世</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#中世</link></sublink>
<sublink linktype="nav"><anchor>近世</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#近世</link></sublink>
<sublink linktype="nav"><anchor>近・現代</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#近・現代</link></sublink>
<sublink linktype="nav"><anchor>明治・大正</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#明治・大正</link></sublink>
<sublink linktype="nav"><anchor>昭和</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#昭和</link></sublink>
<sublink linktype="nav"><anchor>平成</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#平成</link></sublink>
<sublink linktype="nav"><anchor>令和</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#令和</link></sublink>
<sublink linktype="nav"><anchor>人口</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#人口</link></sublink>
<sublink linktype="nav"><anchor>政治</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#政治</link></sublink>
<sublink linktype="nav"><anchor>県政 </anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#県政</link></sublink>
<sublink linktype="nav"><anchor>県庁の変遷</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#県庁の変遷</link></sublink>
<sublink linktype="nav"><anchor>財政</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#財政</link></sublink>
<sublink linktype="nav"><anchor>平成19年度</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#平成19年度</link></sublink>
<sublink linktype="nav"><anchor>平成18年度</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#平成18年度</link></sublink>
<sublink linktype="nav"><anchor>平成17年度</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#平成17年度</link></sublink>
<sublink linktype="nav"><anchor>平成16年度</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#平成16年度</link></sublink>
<sublink linktype="nav"><anchor>国政</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#国政</link></sublink>
<sublink linktype="nav"><anchor>経済・産業</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#経済・産業</link></sublink>
<sublink linktype="nav"><anchor>県内に本社を置く主要企業</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#県内に本社を置く主要企業</link></sublink>
<sublink linktype="nav"><anchor>広島県発祥の主要企業</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#広島県発祥の主要企業</link></sublink>
<sublink linktype="nav"><anchor>現在消滅した広島県の主要企業</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#現在消滅した広島県の主要企業</link></sublink>
<sublink linktype="nav"><anchor>生活・交通</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#生活・交通</link></sublink>
<sublink linktype="nav"><anchor>警察</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#警察</link></sublink>
<sublink linktype="nav"><anchor>交通</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#交通</link></sublink>
<sublink linktype="nav"><anchor>空港</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#空港</link></sublink>
<sublink linktype="nav"><anchor>鉄道路線</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#鉄道路線</link></sublink>
<sublink linktype="nav"><anchor>廃止された鉄道路線</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#廃止された鉄道路線</link></sublink>
<sublink linktype="nav"><anchor>道路</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#道路</link></sublink>
<sublink linktype="nav"><anchor>医療・福祉</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#医療・福祉</link></sublink>
<sublink linktype="nav"><anchor>教育</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#教育</link></sublink>
<sublink linktype="nav"><anchor>マスメディア</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#マスメディア</link></sublink>
<sublink linktype="nav"><anchor>新聞</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#新聞</link></sublink>
<sublink linktype="nav"><anchor>放送</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#放送</link></sublink>
<sublink linktype="nav"><anchor>文化・スポーツ</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#文化・スポーツ</link></sublink>
<sublink linktype="nav"><anchor>方言</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#方言</link></sublink>
<sublink linktype="nav"><anchor>食文化</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#食文化</link></sublink>
<sublink linktype="nav"><anchor>伝統工芸</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#伝統工芸</link></sublink>
<sublink linktype="nav"><anchor>特産品</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#特産品</link></sublink>
<sublink linktype="nav"><anchor>音楽楽団</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#音楽楽団</link></sublink>
<sublink linktype="nav"><anchor>スポーツ</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#スポーツ</link></sublink>
<sublink linktype="nav"><anchor>観光</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#観光</link></sublink>
<sublink linktype="nav"><anchor>文化財建造物</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#文化財建造物</link></sublink>
<sublink linktype="nav"><anchor>史跡・旧跡</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#史跡・旧跡</link></sublink>
<sublink linktype="nav"><anchor>名所</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#名所</link></sublink>
<sublink linktype="nav"><anchor>祭事・イベント</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#祭事・イベント</link></sublink>
<sublink linktype="nav"><anchor>観光スポット・テーマパーク</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#観光スポット・テーマパーク</link></sublink>
<sublink linktype="nav"><anchor>博物館・美術館など</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#博物館・美術館など</link></sublink>
<sublink linktype="nav"><anchor>展示施設</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#展示施設</link></sublink>
<sublink linktype="nav"><anchor>多目的ホール</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#多目的ホール</link></sublink>
<sublink linktype="nav"><anchor>対外関係</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#対外関係</link></sublink>
<sublink linktype="nav"><anchor>広島県を舞台とした作品</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#広島県を舞台とした作品</link></sublink>
<sublink linktype="nav"><anchor>人物</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#人物</link></sublink>
<sublink linktype="nav"><anchor>広島県名誉県民</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#広島県名誉県民</link></sublink>
<sublink linktype="nav"><anchor>広島県県民栄誉賞受賞者</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#広島県県民栄誉賞受賞者</link></sublink>
<sublink linktype="nav"><anchor>脚注</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#脚注</link></sublink>
<sublink linktype="nav"><anchor>注釈</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#注釈</link></sublink>
<sublink linktype="nav"><anchor>出典</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#出典</link></sublink>
<sublink linktype="nav"><anchor>参考文献・ウェブサイト</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#参考文献・ウェブサイト</link></sublink>
<sublink linktype="nav"><anchor>関連項目</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#関連項目</link></sublink>
<sublink linktype="nav"><anchor>外部リンク</anchor><link>https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E7%9C%8C#外部リンク</link></sublink>
</links>
</doc>

抽出

<title>タグと<abstract>タグを目印にテキストを抽出します

page は展開する前から257MBほどある巨大なファイルであり,一度に読み込むとOMMになってしまうので分割して読み込みを行います.[1]

# download
URL_ABSTRACT = ('https://dumps.wikimedia.org/jawiki/latest/'
                 'jawiki-latest-abstract.xml.gz')
urllib.urlretrieve(URL_ABSTRACT, os.path.basename(URL_ABSTRACT))

def extract_title_abstract(path:str, pattern):
    with gzip.GzipFile(path) as fd:
        # 1度に50MBまで読み込む
        raw_read_size = 1024 * 1024 * 50
        title2abstract = {}
        while True:
            cont = fd.read(raw_read_size).decode('utf8', errors='ignore')
            if cont:
                # titleとabstの組をdictに保存
                title2abstract.update(dict(pattern.findall(cont)))
            else:
                # データを読み終えたら抜ける
                break
    return title2abstract

abst_pattern = re.compile("<title>Wikipedia: (.*?)</title>[\s\S]*?<abstract>([\s\S]*?)</abstract>")
title2abst = extract_title_abstract(path='jawiki-latest-abstract.xml.gz', pattern = abst_pattern)

結果を確認

{'アンパサンド': 'thumb|100px|[[Trebuchet MS フォント]]',
 '言語': 'thumb|[[メキシコ、テオティワカンの壁画(2世紀頃) は、口からスピーチを象徴するを発する人物を描いています。]]',
 '日本語': '}}}}}}',
 '地理学': '、、、 または }}は、地球表面の自然・人文事象の状態と、それらの相互関係を研究する学問「 報告 大学教育の分野別質保証のための教育課程編成上の参照基準 地理学分野」平成26年(2014年)9月30日 日本学術会議 地域研究委員会・地球惑星科学委員会合同 地理教育分科会 2023年1月15日閲覧。地域や空間、場所、自然環境という物理学的存在を対象の中に含むことから、人文科学、社会科学、自然科学のいずれの性格も有する。広範な領域を網羅する。また「地理学と哲学は諸科学の母」と称される。',
 'EU (曖昧さ回避)': 'EU',
 '国の一覧': '国の一覧(くにのいちらん)は、世界の独立国の一覧。',
 'パリ': '| other_name =',
 'ヨーロッパ': '|area                = 1018万 km \xa0(第6位)',
 '生物': '、、}}は、無生物と区別される属性、つまり「生命」を備えているものの総称。そしてその「生命」とは、生物の本質的属性として生命観によって抽象されるものであり、その定義はなかなか難しいものとなっている。',
 'コケ植物': '(蘚類)',
 '社会学': '社会学(しゃかいがく、、英:Sociology)は、社会現象の実態や、現象の起こる原因に関するメカニズム(因果関係)を体験・統計・データなどを用いて分析することで解明する学問である 太郎丸博Theoretical Sociology|accessdate=2018-10-08|website=Theoretical Sociology|publisher=|language=ja-JP}}人文・社会科学のためのカテゴリカル・データ解析入門p18 2005 太郎丸博。',
 '古代エジプト': 'thumb|250px|紀元前3150年から紀元前30年までの王朝時代における主要都市及び場所を示した古代エジプトの地図',
 'エジプト': '| 国旗画像 = Flag of Egypt.svg',
 '著作権の保護期間': 'thumb|upright=1.35|世界各国を著作権の保護期間の長さ別に分類した地図',
 '台東区': '| 画像の説明 =',
 '生物学': '生物学(せいぶつがく、、biologiaはビオロギアと読む。)とは、生命現象を研究する、自然科学の一分野である平凡社『世界大百科事典』第15巻、p.',
 '社会': '社会(しゃかい、、)は、ある共通項によってくくられ、他から区別される人々の集まり。また、仲間意識をもって、みずからを他と区別する人々の集まり。社会の範囲は非常に幅広く、単一の組織や結社などの部分社会から国民を包括する全体社会まで様々である。社会は広範かつ複雑な現象であるが、継続的な意思疎通と相互行為が行われ、かつそれらがある程度の度合いで秩序化(この現象を社会統制と呼ぶ)、組織化された、ある一定の人間の集合があれば、それは社会であると考えることができる富永健一『社会学講義\u3000人と社会の学』(中公新書、2003年)15頁。社会を構成する人口の規模に注目した場合には国際社会や国民国家を想定する全体社会や都市や組織などの部分社会に区分できる。さらに意思疎通や相互作用、秩序性や限定性という社�',
 'こどもの文化': 'こどもの文化(こどものぶんか)は、子供の遊びや行事を通じて形成される子供独自の文化である。',
 '特撮': '特撮(とくさつ)は、特殊撮影技術(Special Effects;SFX)を指す略称特撮 - Yahoo!辞書(大辞泉、ジャパンナレッジ)(2013年10月25日閲覧)、またはSFXが多用された映画やテレビ番組などの映像作品を指す総称。',
 '日常生活': '日常生活(にちじょうせいかつ、)は、毎日繰り返される普段の生活のこと。',
 '情報工学': '情報工学(じょうほうこうがく、}})とは、「計算機による情報処理に関連する科学技術の一分野」を指す言葉であり、「情報科学」や「計算機科学」ともいう。',
 '形式言語': '形式言語(けいしきげんご、)は、その文法(構文、統語論)が、場合によっては意味(意味論)も、形式的に与えられている(形式体系を参照)言語である。形式的でないために、しばしば曖昧さが残されたり、話者集団によって用法のうつろいゆくような自然言語に対して、プログラミング言語を含む一部の人工言語や、いわゆる機械可読な(機械可読目録を参照)ドキュメント類などの形式言語は、用法の変化に関しては厳格である。',
 '文脈自由言語': '文脈自由言語(ぶんみゃくじゆうげんご)とは、次のような再帰的な生成規則をもつ文脈自由文法によって、与えられた言語の長さ n に対して O(n3) の時間で認識される形式言語。プッシュダウン・オートマトンで受理可能な言語と等価である。',
 '正規言語': '正規言語(せいきげんご)または正則言語(せいそくげんご)は、以下に示す性質(いずれも等価)を満たす形式言語である。',
 '自然言語処理': '自然言語処理(しぜんげんごしょり、、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。「計算言語学」()との類似もあるが、自然言語処理は工学的な視点からの言語処理をさすのに対して、計算言語学は言語学的視点を重視する手法をさす事が多い。',
 '自然言語': '自然言語(しぜんげんご、)とは、言語学や論理学、計算機科学の専門用語で、「英語」・「中国語」・「日本語」といった「○○語」の総称。つまり普通の「言語」のこと。',
 'プログラミング言語': 'リンク=https://en.wikipedia.org/wiki/File:C_Hello_World_Program.png|右|サムネイル|357x357ピクセル|[[C言語で書かれた単純なコンピュータープログラムのソースコード。グレーの行は、人間のためにプログラムの説明をする自然言語で書かれたコメント。このプログラムをコンパイルして実行すると、「Hello, world!」という文字が出力される。]]',
 '人工知能': '人工知能(じんこうちのう、)、AI(エーアイ)とは、「『計算()』という概念と『コンピュータ()』という道具を用いて『知能』を研究する計算機科学()の一分野」を指す語。「言語の理解や推論、問題解決などの知的行動を人間に代わってコンピュータに行わせる技術」、または、「計算機(コンピュータ)による知的な情報処理システムの設計や実現に関する研究分野」ともされる。',
 'オーストリア': '|国旗画像 = Flag of Austria.svg',
 'GNU Free Documentation License': '| author = Vektor',
 '社会学者の一覧': '社会学者の一覧(しゃかいがくしゃのいちらん)では、社会学を研究する学者を一覧する。',
 'ゴーダチーズ': 'ゴーダチーズ( , 、 )は、オランダを代表するチーズ。穏やかでクセのないマイルドな味わいとまろやかな香りをもつ。',
 ...

期待通り抽出できているデータもあるが,wikiの記載方式に対応できていないデータが多めで使いにくいということらしいです

abstractを含むファイルは更新に時間がかかるらしいので,一応latestバージョンと20240501バージョンの2ファイルを確認してみたがどちらも大差はありませんでした

脚注
  1. gzipで圧縮された大きなログファイルを省メモリで処理できるようにした話 ↩︎

taguchitaguchi

Abstractの抽出 (2)

jawiki-latest-pages-articles.xml.bz2 からの抽出

仕方がないのですべてのページデータから,最初の段落の部分までを抽出します.

データ形式

dumpdata

全体構造としてはこんな感じ

<page>
    <title>社会学</title>
    <ns>0</ns>
    <id>47</id>
    <revision>
      <id>100767342</id>
      <parentid>100438977</parentid>
      <timestamp>2024-06-18T10:40:31Z</timestamp>
      <contributor>
        <username>Baudanbau20</username>
        <id>1657559</id>
      </contributor>
      <comment>本文中の自己リンク</comment>
      <origin>100767342</origin>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text bytes="33956" sha1="bf8xhtsie2nhy4pb3r9bls3k2l77e2l" xml:space="preserve">
          (本文のテキストデータ)
      <sha1>bf8xhtsie2nhy4pb3r9bls3k2l77e2l</sha1>
    </revision>
  </page>    
<page>
    <title>社会学</title>
    <ns>0</ns>
    <id>47</id>
    <revision>
      <id>100767342</id>
      <parentid>100438977</parentid>
      <timestamp>2024-06-18T10:40:31Z</timestamp>
      <contributor>
        <username>Baudanbau20</username>
        <id>1657559</id>
      </contributor>
      <comment>本文中の自己リンク</comment>
      <origin>100767342</origin>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text bytes="33956" sha1="bf8xhtsie2nhy4pb3r9bls3k2l77e2l" xml:space="preserve">{{混同|社会科学}}

'''社会学'''(しゃかいがく、{{lang-fr-short|sociologie}}、英:Sociology)は、[[社会現象]]の実態や、現象の起こる原因に関するメカニズム([[因果性|因果関係]])を体験・統計・データなどを用いて分析することで解明する学問である&lt;ref name=&quot;:0&quot;&gt;{{Cite web|和書|url=http://sociology.jugem.jp/?eid=277|title=阪大を去るにあたって: 社会学の危機と希望 {{!}} [[太郎丸博]]Theoretical Sociology|accessdate=2018-10-08|website=Theoretical Sociology|publisher=|language=ja-JP}}&lt;/ref&gt;&lt;ref&gt;人文・社会科学のためのカテゴリカル・データ解析入門p18 2005 太郎丸博&lt;/ref&gt;。
フランスの[[オーギュスト・コント]]が産み出した学問で、当時は[[歴史学]]・[[心理学]]・[[経済学]]を統合する[[実証主義]]的な科学的研究として「'''社会物理学'''」と定義した&lt;ref name=&quot;:1&quot; /&gt;。
初期の社会学に対する社会学者の方法論的アプローチは、社会学を[[自然科学]]と同じやり方で扱うもののみであった。しかし、[[19世紀]]に機能主義から離反した社会学が登場し、後にそれが主流となった&lt;ref&gt;shley D, Orenstein DM (2005). Sociological theory: Classical statements (6th ed.). Boston, MA, USA: Pearson Education. pp. 94–98, 100–104&lt;/ref&gt;。

あらゆる社会・営みの中に法則性を探るという[[自由度 (ゲーム)|自由度]]の高く、「社会学的な視点で研究できるもの」ならば全てを「○○社会学」といった研究対象とすることが可能である&lt;ref&gt;{{Cite web|和書|title=社会学とは|大学・専門学校のマイナビ進学 |url=https://shingaku.mynavi.jp/future/gakumon/18/ |website=マイナビ進学 |access-date=2023-09-03 |language=ja}}&lt;/ref&gt;。[[人文社会科学研究科|人文社会科学]]又は社会科学に分類される&lt;ref&gt;バウマン社会理論の射程 ポストモダニティと倫理 - p268 中島道男 ,2009&lt;/ref&gt;&lt;ref name=&quot;:3&quot;&gt;{{Cite web|和書|title=「社会科学」は崩壊した。米国の新たな指針は救いとなるか? |url=https://wired.jp/2017/02/20/nih-plan-social-science/ |website=WIRED.jp |date=2017-02-20 |access-date=2023-09-03 |language=ja-JP |first=Condé |last=Nast}}&lt;/ref&gt;。現代では、社会科学の中でも用語の定義が曖昧かつ[[研究の再現性]]も低い問題が指摘されている分野の一つである&lt;ref&gt;{{Cite web|和書|title=「社会科学」は崩壊した。米国の新たな指針は救いとなるか? |url=https://wired.jp/2017/02/20/nih-plan-social-science/ |website=WIRED.jp |date=2017-02-20 |access-date=2023-09-03 |language=ja-JP |first=Condé |last=Nast}}&lt;/ref&gt;。

「'''社会学'''」という言葉は[[尺振八]]が[[ハーバート・スペンサー]]の著書を翻訳した『斯氏教育論』([[1880年]])&lt;ref&gt;{{cite journal|和書|title= 斯氏敎育論 スペンサー著 尺振八 譯(明治十三年) |page= 415-455|journal= 明治文化全集 (教育篇)|id={{全国書誌番号|51000494}}|editor= 明治文化研究会|location= 東京|publisher= 日本評論社|volume= 18|year= 1967|doi= 10.11501/2940154}}&lt;/ref&gt;&lt;!-- &lt;ref&gt;{{cite journal|和書|=|=|=|=|=}}&lt;/ref&gt; --&gt;の中で「sociology」の訳語として初めて使用したとされる(同書 p.54、p.72)。

== 誕生・実証主義や機能主義 ==
{{main|社会学史}}

=== 誕生と定義付け・実証主義の最重視 ===
[[ファイル:Auguste Comte.jpg|thumb|150px|[[オーギュスト・コント]]]]
社会学(フランス語「{{lang|fr|sociologie}}」はラテン語「{{lang|en|socius}}」とギリシャ語「{{lang|el|λογοσ}}」に由来する造語)なる用語は、[[フランス革命]]後の混乱と動乱に満ちた初期近代フランスを生きた[[オーギュスト・コント]]によって作られた。コントは、当時の産業主義と[[合理主義哲学|合理主義]]を背景として、社会学とは「'''秩序と進歩」に寄与する「社会物理学」であって、'''歴史学、心理学、経済学を統合する'''[[実証主義]]的な科学的研究'''でなければならないとした&lt;ref name=&quot;:1&quot;&gt;清水 (1978) などを参照のこと。&lt;/ref&gt;。

このコントの思想は、その師である[[アンリ・ド・サン=シモン|サン・シモン]]に遡る。サン・シモンは、自然科学の方法を用いて社会的世界を全体的かつ統一的に説明する「社会生理学」の樹立を企てた。このなかで、サン・シモンは、フランス革命後の新社会の秩序を捉えるべく、その社会変動の流れを「産業主義」として提示した&lt;ref&gt;富永(2008: 31-68)&lt;/ref&gt;。ここからコントはさらに、近代社会の構成原理として実証主義を提示し、産業ではなく[[科学]]をその中心に据えることになった。そしてその中心に社会学を位置づけたのである&lt;ref&gt;富永 (2008: 73-107)&lt;/ref&gt;。

コントらの発想は、[[ジョン・スチュアート・ミル]]、[[ハーバート・スペンサー]]などに受け継がれ、実証主義の体系化が図られていった。例えば、スペンサーは、イギリス功利主義の考えと、彼独自の[[進化論]]に基づいて、[[有機体]]システムとのアナロジーによって社会を超有機的「システム」と捉え、後の[[社会システム理論]]の先駆となる研究を行なった&lt;ref&gt;富永 (2008: 185-216)&lt;/ref&gt;。

(中略)

== 関連書籍 ==
{{参照方法|date=2015年5月3日 (日) 04:23 (UTC)|section=1}}
===古典・教科書・啓蒙書===
* マックス・ウェーバー『社会学の根本概念』(岩波文庫, 1972年)
* エミール・デュルケム『社会学的方法の規準』(岩波文庫, 1978年)
* アンソニー・ギデンズ『社会学の新しい方法的規準 第二版』(而立書房, 2000年)
* アンソニー・ギデンズ『社会学 第五版』(而立書房, 2009年)
===講座・シリーズ===
* 『リーディングス 日本の社会学』全20巻(東京大学出版会, 1985-7年)
* 『岩波講座 現代社会学』全26巻+別巻1、[[井上俊]]、[[上野千鶴子]]、[[大澤真幸]]、[[見田宗介]]、[[吉見俊哉]]編(岩波書店, 1995-7年)
* 『講座社会学』全16巻、[[北川隆吉]]、塩原勉、[[蓮見音彦]]編(東京大学出版会, 1998年-)
* 『講座 社会変動』全10巻(ミネルヴァ書房, 2001年-)
* 『社会学のアクチュアリティ』全12巻+別巻2、[[武川正吾]]、友枝敏雄、[[西原和久]]、[[山田昌弘]]、[[吉原直樹]]編(東信堂, 2004年)
===翻訳シリーズ===
* 『現代社会学大系』全15巻、[[日高六郎]]、岩井弘融、中野卓、浜島朗、田中清助、[[北川隆吉]]編(青木書店, 1970年- ※復刻版有)
* 『社会学の思想』全15巻、[[長谷川公一]]、藤田弘夫、吉原直樹編(青木書店, 1999年-)
===辞書===
* [[新明正道]]編『社会学辞典』(河出書房, 1944年)〔復刻・増補版〕(時潮社, 2009年)
* 森岡清美、塩原勉、本間康平編『新社会学辞典』(有斐閣, 1993年)
* 見田宗介他編『社会学事典』(弘文堂, 1994年)
* 浜島朗他編『社会学小辞典』(有斐閣, 1997年)
* 見田宗介他編『社会学文献事典』(弘文堂, 1998年)
* [[宮島喬]]編『岩波小辞典社会学』(岩波書店, 2003年)
* ブードン他『ラルース社会学事典』(弘文堂, 1997年)
* [[レイモンド・ウィリアムズ]]『キーワード辞典』(平凡社, 2004年)
===総合雑誌===
* 『社会学評論』([[日本社会学会]], 1950年刊)
* 『[[社会学研究]]』(東北社会学研究会, 1950年刊)
* 『ソシオロジ』(社会学研究会, 1952年刊)
* 『ソシオロゴス』(ソシオロゴス編集委員会、1977年刊)
* ''American Journal of Sociology'' (1895年刊)
* ''American Sociological Review'' (1936年刊)
* ''British Journal of Sociology'' (1950年刊)
* ''Sociological Inquiry'' (1961年刊)

== 脚注 ==
{{脚注ヘルプ}}
{{reflist|2}}

== 参考文献 ==
* [[清水幾太郎]] (1978) 『オーギュスト・コント――社会学とは何か』(岩波書店[岩波新書], 1978年)
* [[富永健一]] (2008) 『思想としての社会学』(新曜社, 2008年)

== 関連項目 ==
{{Wikibooks}}
{{Wikiversity|School:社会学|社会学}}
* [[実体験]]
* [[実証主義]]
* [[社会学部]]
* [[社会学科]]
* [[社会学史]]
* [[日本社会学会]]
* [[社会調査士]]
* [[反社会学講座]]
* [[社会哲学]]
* [[社会思想]]
* [[社会史]]
* [[学術出版]]
* [[社会学者の一覧]]
== 外部リンク ==
; 学会組織
* [http://www.gakkai.ne.jp/jss/ 日本社会学会]
* [http://www.ucm.es/info/isa/ International Sociological Association] (ISA)
; 研究者個人運営サイト
* [http://socius.jp/ ソキウス] - 社会学者・野村一夫による。
; データベース
* [http://wwwsoc.nii.ac.jp/jss/db/ 社会学文献情報データベース]
* [https://ssjda.iss.u-tokyo.ac.jp/ SSJデータアーカイブ](データファイルの入手)
; その他
* [{{NDLDC|798508}} 社会学講話(1907年)] - 国立国会図書館
* {{PDFlink|[http://risya.hus.osaka-u.ac.jp/taroh/td/TheoryDevelopment.pdf 社会学理論の発展はいかにして可能か]}}

{{社会学}}
{{社会科学のフッター}}
{{科学技術研究}}
{{Normdaten}}

{{DEFAULTSORT:しやかいかく}}
[[Category:社会学|*]]
[[Category:オーギュスト・コント]]
[[Category:実証主義]]</text>
      <sha1>bf8xhtsie2nhy4pb3r9bls3k2l77e2l</sha1>
    </revision>
  </page>

</details>

抽出

上のコードと同様に jawiki-latest-pages-articles.xml.bz2 をダウンロードしてから実行します

import bz2

def extract_id_abstract_bz2(path:str, pattern, filter_keys = None):
    # チャンク単位に分割して読み込み
    # yieldを使ってメモリを節約する
    def read_in_chunks(file_object, chunk_size=1024*1024*5):
        while True:
            data = file_object.read(chunk_size)
            if not data:
                break
            yield data

    with bz2.BZ2File(path) as fd:
        id2abst = {}
        buffer = ''
        for chunk in read_in_chunks(fd):
            buffer += chunk.decode('utf8', errors='ignore')
            matches = dict(pattern.findall(buffer))

            # 対象カテゴリをフィルタ
            if filter_keys:
                matches = filter_dict_by_keys(dict_to_filter=matches, keys_to_filter_by=filter_keys)

            # マッチしたデータをdictに保存
            id2abst.update(matches)
            # return id2abst # debug

            # 途中でbufferを処理した部分を切り捨てて次のchunkに備える
            last_match_end = buffer.rfind('</id>')  # 直近の終了タグ位置を見つける
            if last_match_end != -1:
                buffer = buffer[last_match_end + len('</id>'):]
    return id2abst

# ページの始まりから初めの見出しまでのテキストを抜き取り,紹介文(abstract)とする
abst_pattern = re.compile(r"</ns>\s*<id>(\d+)</id>[\s\S]*?<text\b[^>]*>([\s\S]*?)(?=\n=+|</text>)")
id2abst = extract_id_abstract_bz2(
    path='jawiki-latest-pages-articles.xml.bz2',
    pattern = abst_pattern,
    filter_keys=id2cat
)

この時点では内部リンク,注釈などのwikipedia記法がそのまま抽出されているためクリーニングをかけることにします.

{{古代エジプトの王朝}}
[[File:Ancient Egypt map-en.svg|thumb|250px|紀元前3150年から紀元前30年までの王朝時代における主要都市及び場所を示した古代エジプトの地図]]
[[File:1867 Edward Poynter - Israel in Egypt.jpg|thumb|320px|『エジプトのイスラエル人』([[エドワード・ポインター]]・1867年画)]]
{{読み仮名|'''古代エジプト'''|こだいエジプト|{{lang-ar|links=no|مصر القديمة}}、{{lang-en|links=no|Ancient Egypt}}}}は、[[古代]]の[[エジプト]]に対する呼称。具体的に、どの時期を指すかについては様々な説が存在するが、この項においては[[紀元前3000年]]頃に始まった[[エジプト第1王朝|第1王朝]]から[[紀元前30年]]に[[プトレマイオス朝]]が[[共和政ローマ]]によって滅ぼされるまでの時代を扱う。

エジプトは不毛の[[砂漠]]地帯であるが、毎年夏の[[ナイル川]]の増水で水に覆われる地域には河土が運ばれて堆積し、農耕や灌漑が可能になる。この[[氾濫原]]だけが居住に適しており、主な活動はナイル河で行われた。[[ナイル川]]の恩恵を受ける地域はケメト(黒い大地)と呼ばれ、ケメトはエジプトそのものを指す言葉として周囲に広がるデシェレト(赤い大地、ナイル川の恩恵を受けない荒地)と対比される概念だった。このケメトの範囲の幅は非常に狭く、ナイル川の本流・支流から数kmの範囲にとどまっていた。しかしながら川の周囲にのみ人が集住しているということは交通においては非常に便利であり、川船を使って国内のどの地域にも素早い移動が可能であった。この利便性は、ナイル河畔に住む人々の交流を盛んにし、[[統一国家]]を建国し維持する基盤となった。

ナイル川本流からナイル川の上流は谷合でありナイル川1本だけが流れ、下流はデルタ地帯([[ナイル川デルタ]])が広がっている。最初に上流地域([[上エジプト]])と下流地域([[下エジプト]])&lt;ref group=&quot;注釈&quot;&gt;上下というのはナイル川の上流・下流という意味であり、ナイル川は北に向かって流れているため、北にあたる地域が下エジプトである(逆もまた然り)。&lt;/ref&gt;でそれぞれ違った文化が発展した後に統一されたため、[[ファラオ]]([[王]])の称号の中に「上下エジプト王」という部分が残り、古代エジプト人も自国のことを「二つの国」と呼んでいた。

毎年のナイル川の氾濫を正確に予測する必要から天文観測が行われ、[[太陽暦]]が作られた。太陽と[[シリウス]]星が同時に昇る頃、ナイル川は氾濫したという。また、氾濫が収まった後に農地を元通り配分するため、[[測量術]]、[[幾何学]]、[[天文学]]が発達した。[[ヒエログリフ]]から派生した[[ワディ・エル・ホル文字と原シナイ文字]]([[原カナン文字]])は世界の殆どの[[アルファベット]]の起源となったとされる。

エジプト文明と並ぶ最初期における農耕文明の一つである[[メソポタミア文明]]が、民族移動の交差点にあたり終始異民族の侵入を被り支配民族が代わったのと比べ、地理的に孤立した位置にあったエジプトは比較的安定しており、部族社会が城壁を廻らせて成立する[[都市国家]]の痕跡は今の所発見されていない。

wiki記法のクリーニング

wikiextractorのクリーニングをかけるメソッドを拝借することにします[1]

masterのメソッドでは最新の状態に追従できていない[2] ので,自分で更新したものを使用することにします

from wikiextractor.extract import Extractor, ignoreTag, resetIgnoredTags

def clean_markup(markup, keep_links=False):
    """
    Clean Wikimarkup to produce plaintext.

    :param keep_links: Set to True to keep internal and external links
    :param ignore_headers: if set to True, the output list will not contain
    headers, only 

    Returns a list of paragraphs (unicode strings).
    """

    if not keep_links:
        ignoreTag('a')

    extractor = Extractor(0, '', [], '', '')

    # returns a list of strings
    paragraphs = extractor.clean_text(markup,
                                      mark_headers=True,
                                      expand_templates=False
                                      )
    resetIgnoredTags()

    return "".join(paragraphs)
clean_text = clean_markup(abst[0][1])
は、古代のエジプトに対する呼称。具体的に、どの時期を指すかについては様々な説が存在するが、この項においては紀元前3000年頃に始まった第1王朝から紀元前30年にプトレマイオス朝が共和政ローマによって滅ぼされるまでの時代を扱う。エジプトは不毛の砂漠地帯であるが、毎年夏のナイル川の増水で水に覆われる地域には河土が運ばれて堆積し、農耕や灌漑が可能になる。この氾濫原だけが居住に適しており、主な活動はナイル河で行われた。ナイル川の恩恵を受ける地域はケメト(黒い大地)と呼ばれ、ケメトはエジプトそのものを指す言葉として周囲に広がるデシェレト(赤い大地、ナイル川の恩恵を受けない荒地)と対比される概念だった。このケメトの範囲の幅は非常に狭く、ナイル川の本流・支流から数kmの範囲にとどまっていた。しかしながら川の周囲にのみ人が集住しているということは交通においては非常に便利であり、川船を使って国内のどの地域にも素早い移動が可能であった。この利便性は、ナイル河畔に住む人々の交流を盛んにし、統一国家を建国し維持する基盤となった。ナイル川本流からナイル川の上流は谷合でありナイル川1本だけが流れ、下流はデルタ地帯(ナイル川デルタ)が広がっている。最初に上流地域(上エジプト)と下流地域(下エジプト)でそれぞれ違った文化が発展した後に統一されたため、ファラオ(王)の称号の中に「上下エジプト王」という部分が残り、古代エジプト人も自国のことを「二つの国」と呼んでいた。毎年のナイル川の氾濫を正確に予測する必要から天文観測が行われ、太陽暦が作られた。太陽とシリウス星が同時に昇る頃、ナイル川は氾濫したという。また、氾濫が収まった後に農地を元通り配分するため、測量術、幾何学、天文学が発達した。ヒエログリフから派生したワディ・エル・ホル文字と原シナイ文字(原カナン文字)は世界の殆どのアルファベットの起源となったとされる。エジプト文明と並ぶ最初期における農耕文明の一つであるメソポタミア文明が、民族移動の交差点にあたり終始異民族の侵入を被り支配民族が代わったのと比べ、地理的に孤立した位置にあったエジプトは比較的安定しており、部族社会が城壁を廻らせて成立する都市国家の痕跡は今の所発見されていない。

文字列だけを綺麗に抽出することが出来ました

参考文献

脚注
  1. https://github.com/attardi/wikiextractor/blob/8f1b434a80608e1e313d38d263ed7c79c9ee75a9/wikiextractor/clean.py#L22 ↩︎

  2. https://github.com/attardi/wikiextractor/pull/318 ↩︎

taguchitaguchi

Abstract (3)

dbpedia

参考にさせていただいた記事[1]

dbpediaの特徴としては以下のような感じです

  • メリット
    • カテゴリなどで絞り込みが可能
    • wikiのdumpデータでは解消されていない再帰的な参照が削除されている
    • SPARQL というSQLライクな言語での検索が可能
  • デメリット
    • データ更新が不定期
    • defaultで10000件までの上限がかけられているので大規模データの使用には不向き

ワンオフ,10000件以下のデータが対象であればこちらを使用するのがおすすめ

脚注
  1. https://qiita.com/pika_shi/items/eb56fc205e2d670062ae ↩︎

このスクラップは4ヶ月前にクローズされました