wiki40b-jaの加工

# 概要
Hugging Faceの**range3/wiki40b-ja** で公開されている**wiki40b-ja**を利用して，記事タイトルとセクションタイトルを除いたテキスト抽出の加工を紹介します[^1]．

# 1. データのダウンロード
最初に次の３種類のファイルを[ここから直接ダウンロード](https://huggingface.co/datasets/range3/wiki40b-ja)するか，Hugging Faceのdatasetsライブラリを利用してデータセットをダウンロードします．

* train.parquet: 1.2 GB
* test.parquet: 66.2 MB
* validation.parquet: 66.1 MB

datasetsライブラリを利用してダウンロードするコードは，次のようになります．

~~~python
from datasets import load_dataset
data = load_dataset("range3/wiki40b-ja")
print(data)
# DatasetDict({
#     train: Dataset({
#         features: ['wikidata_id', 'text', 'version_id'],
#         num_rows: 745392
#     })
#     validation: Dataset({
#         features: ['wikidata_id', 'text', 'version_id'],
#         num_rows: 41576
#     })
#     test: Dataset({
#         features: ['wikidata_id', 'text', 'version_id'],
#         num_rows: 41268
#     })
# })
~~~
今回は直接ダウンロードしたparquet形式のファイルを読み込んで利用していきます．いずれの方法でも同じようにできます。



# 2. 前処理
wiki40bはGoogle Researchが作成し2020年から公開している高品質のwikipediaのテキストデータです．Rangeさんが日本語部分を抽出して，HuggingFaceのdatasetsからダウンロードできるように公開してくださったデータセットがwiki40b-jaです．wiki40b-jaはすでに加工されてあり，４つのタグが埋め込まれています．

|　　　　タグ|意味|
|:---|:---|
|\_START_ARTICLE_ |記事開始の記号
|\_START_SECTION_ |  ページタイトルの記号
|\_START_PARAGRAPH_ | セクションタイトルの終了と，段落の開始を示す記号<br>この記号の後に本文が続く．
|\_NEWLINE_ |段落テキスト記号


**【実例】**
> \_START_ARTICLE_ イドラ級フリゲート \_START_SECTION_ 来歴 \_START_PARAGRAPH_ ギリシャ海軍は、1980年代初頭にエリ級フリゲートを導入することでその艦隊の近代化に着手したが、これらはいずれもオランダで建造されたものであった。また艦隊には依然として、第二次世界大戦後に供与された各国の中古艦が相当数残っており、その更新は急務であった。このことから、1980年代中盤より、海外の設計に基き、海外からの援助を受けて、ギリシャ国内でフリゲートを建造することが計画されるようになった。\_NEWLINE_当初はイギリスのリアンダー級フリゲートの改良型やイタリアのルポ級フリゲートが候補とされていたが、1988年4月18日、ドイツのブローム・ウント・フォス（B+V）社によるMEKO 200型フリゲートの選定が発表された。これによって建造されたのが本級であり、1989年2月10日に正式な発注がなされた。 \_START_SECTION_ 設計 \_START_PARAGRAPH_ 本級は、MEKO 200型のアップデート型であるMEKO 200 Mk.3型の設計を採用している。これは各種配管や配線の設計を見直すことで、シースキマーなどに対する耐堪性を強化したもので、1年ほど先行して整備されていたポルトガル海軍のヴァスコ・ダ・ガマ級フリゲートと同様であるが、同級がヘリコプターを2機搭載していたのに対して、本級は1機のみの搭載となっている。\_NEWLINE_なお、本級の搭載するVLSについては、2007年の改修によりMk.48 Mod.2 からMk.48 Mod.5に換装されており、ESSM運用能力が付与されている。

**【処理内容】**
タグだけを取り除くと，
> イドラ級フリゲート 来歴 ギリシャ海軍は、......

という文章になります．この記事ではタイトル，セクションタイトルを削除して文章を再構成する方法を紹介します．具体的には次のような処理をします．

* タイトルとセクションのタイトルを削除して，本文のみを抽出する．
* \_NEWLINE_ の削除
* \_START_ARTICLE_ 直後のタイトルを削除
* \_START_SECTION_ 直後のページタイトルを削除

最終的に，ゴシック体になっている部分を削除して，本文を抽出していきます．

> **\_START_ARTICLE_ イドラ級フリゲート \_START_SECTION_ 来歴** **\_START_PARAGRAPH_** ギリシャ海軍は、1980年代初頭にエリ級フリゲートを導入することでその艦隊の近代化に着手したが、これらはいずれもオランダで建造されたものであった。また艦隊には依然として、第二次世界大戦後に供与された各国の中古艦が相当数残っており、その更新は急務であった。このことから、1980年代中盤より、海外の設計に基き、海外からの援助を受けて、ギリシャ国内でフリゲートを建造することが計画されるようになった。**\_NEWLINE_** 当初はイギリスのリアンダー級フリゲートの改良型やイタリアのルポ級フリゲートが候補とされていたが、1988年4月18日、ドイツのブローム・ウント・フォス（B+V）社によるMEKO 200型フリゲートの選定が発表された。これによって建造されたのが本級であり、1989年2月10日に正式な発注がなされた。 **\_START_SECTION_ 設計 \_START_PARAGRAPH_** 本級は、MEKO 200型のアップデート型であるMEKO 200 Mk.3型の設計を採用している。これは各種配管や配線の設計を見直すことで、シースキマーなどに対する耐堪性を強化したもので、1年ほど先行して整備されていたポルトガル海軍のヴァスコ・ダ・ガマ級フリゲートと同様であるが、同級がヘリコプターを2機搭載していたのに対して、本級は1機のみの搭載となっている。**\_NEWLINE_** なお、本級の搭載するVLSについては、2007年の改修によりMk.48 Mod.2 からMk.48 Mod.5に換装されており、ESSM運用能力が付与されている。

# 3. 方法
前処理で記載した内容をPythonで表現していきます．

* **手順１**: pandasでparquetファイルを読み込む
* **手順２**: 正規表現を利用して対象の文字列を抽出
* **手順３**: 抽出した文字列をつなげる

大まかに３種類の手順を実行することになります．sample01.pyではファイルのサイズが小さいtest.parquetを利用いています．jupyter labでも秒で処理が終了，すぐに内容を確認可能です．ファイルのサイズが1.2GBほどあるtrain.parquetでは数分ほど待たされることになります．test.parquetはsample01.pyと同一ディレクトリーにあります．

~~~ sample01.py
import pandas as pd
import re

def extract_text(text):
    text = text.replace("_NEWLINE_", "")          # textから _NEWLINE_を削除
    # textから次の２パターンを探して文章をつなげる　２番目と３番目の手順
    # 1. _START_PARAGRAPH_\n 〜文章〜 \n_START_
    # 2. _START_PARAGRAPH_\n 〜文章〜 $
    paragraph_pattern = re.compile(r"_START_PARAGRAPH_\n(.*?)(?=\n_START_|$)", re.DOTALL)
    gen_text = "".join(match.group(1) for match in paragraph_pattern.finditer(text))
    return gen_text

data = pd.read_parquet("./test.parquet")   # ここが１番目の手順
data["content"] = data["text"].apply(extract_text)
~~~


正規表現の練習を兼ねて使ってみました．次の部分が最大のポイントとなります．

~~~ python3
re.compile(r"_START_PARAGRAPH_\n(.*?)(?=\n_START_|$)", re.DOTALL)
~~~
* 基本パターン：**\_START_PARAGRAPH_\n**で始まり，**\n_START_** もしくは，文末 **$** までを探す．
* **(?=\n_START_|$)** : \n_START_ もしくは， 文末の手前までの文字列を探す．
* **re.DOTALL** : 「　.　」が改行(\n)を含む全ての文字とマッチするようになる．
* **(.*?)**：(　)で囲むことで **.*?** に対応する文字列を一時的に記憶しておく．

**【結果】**
~~~ 続き sample01.py
print(data.head())
# 	wikidata_id 	text 	version_id 	content
# 0 	Q17212339 	\n_START_ARTICLE_\nしのぶ・まさみshow'05 恋してラララ\n_STA... 	9123982918445201413 	『上海ルーキーSHOW』の打ち切り後に放送された年末特番で、同番組MCの大# 竹しのぶと久本雅美...
# 1 	Q1260197 	\n_START_ARTICLE_\nアカパプアクイナ\n_START_SECTION_\n... 	13599958688069919425 	ニューギニア島（インドネシア、パプアニューギニア）固有種。体長約18-22cm。雄は体の上面...
# 2 	Q860166 	\n_START_ARTICLE_\nアラブ世界研究所\n_START_PARAGRAPH_... 	15541764813830217733 	アラブ世界研究所（アラブせかいけんきゅうしょ、Institut du monde arabe...
# 3 	Q305398 	\n_START_ARTICLE_\nイドラ級フリゲート\n_START_SECTION_\... 	12990514328797323787 	ギリシャ海軍は、1980年代初頭にエリ級フリゲートを導入することでその艦隊の近代化に着手した...
# 4 	Q5923961 	\n_START_ARTICLE_\nイフォガスの戦い\n_START_SECTION_\n... 	10254254153743376830 	2013年2月19日、マリ＝フランス連合軍はパンテル4号作戦（Panthère IV）を発動...
~~~
表示がわかりにくいので，１行目のtextとcontentを比べてみます．

**data["text"][1]の内容**
> '\n_START_ARTICLE_\nアカパプアクイナ\n_START_SECTION_\n分布\n_START_PARAGRAPH_\nニューギニア島（インドネシア、パプアニューギニア）固有種。\n_START_SECTION_\n形態\n_START_PARAGRAPH_\n体長約18-22cm。雄は体の上面と胸と尾が赤褐色で、腹はにぶい赤褐色である。虹彩は褐色、嘴は黒色で先端と下嘴の基部は灰色、脚は黒色である。雌は翼の部分に白っぽい斑が散らばっている。また尾は雄よりも明るい茶褐色である。\n_START_SECTION_\n生態\n_START_PARAGRAPH_\n熱帯や亜熱帯の山地の森林の地上に生息する。'

**data["content"][1]の内容**
> 'ニューギニア島（インドネシア、パプアニューギニア）固有種。体長約18-22cm。雄は体の上面と胸と尾が赤褐色で、腹はにぶい赤褐色である。虹彩は褐色、嘴は黒色で先端と下嘴の基部は灰色、脚は黒色である。雌は翼の部分に白っぽい斑が散らばっている。また尾は雄よりも明るい茶褐色である。熱帯や亜熱帯の山地の森林の地上に生息する。'

記事のタイトルやセクションのタイトルを除いた本文だけが，きれいに抽出されています．
sample01.pyのtest.parquetの部分をtrain.parquetやvalidation.parquetに変更することで，
残りのファイルからも該当箇所を抽出することができます．

:::note
* 類似のデータセットはHugging Faceに**fujiki/wiki40b_ja**として公開されています[^2]．
:::

# 4. 応用編
「加工したwiki40bはどのように利用できるのか？」ですが，おそらく，Transformer型のニューラルネットワークの事前学習やファインチューニングに利用できそうです．日本語のwikipediaテキストだけではデータ量が少ないのが難点:sweat_smile:

https://qiita.com/tohkawa03/items/62ff4978204dc234dcb3

https://qiita.com/Taiyou2000/items/3229d320c252d6de33c7

# 参考記事
TensorFlow・TensorFlowDatasetsを利用する方法

https://qiita.com/nymwa/items/a23c3347625f01e12a12

# 注

[^1]: wiki40bのデータセットを利用するために，「TensorFlow」と「TensorFlow Datasets」のライブラリをインストールする方法も存在します．

[^2]: fujiki/wiki40b_jaは，記事のタイトルやセクションのタイトル，本文と合わせて抽出したテキストデータとなっています．