ドメイン固有辞書をつかってドメイン固有コーパスを雑につくる方法
古巣のABEJAからABEJA-CC-JAコーパスが発表され、中身を見てみたところ商用利用可ですしとても使いやすそうだったので、ABEJA-CC-JAコーパスを使ってドメイン固有のコーパスを作ろうとしてみました。
やったこと
ドメイン固有の辞書(キーワード一覧)を入手する
aho-corasickでドキュメントごとのキーワードマッチを求める
非固有語の除外などをしてデータ・辞書のクリーニング
一定の基準に合致したドキュメントを抽出する
abeja-cc-jaコーパス
abeja-cc-jaの本家ブログ記事に書いてあるとおりですが、下記コマンドで取得できます。
aws s3 sync s3://abeja-cc-ja/ ./ --exclude "*" --include "common_crawl_*.jsonl"
現状19個のJSONファイルからなるコーパスのようです。1つ目のファイル(common_crawl_0.jsonl)の先頭を取得して中身を見てみると下記のような感じになっています。
cat ~/abeja-cc-ja/common_crawl_0.jsonl | jq . | head -n 10
{
"url": "https://cutout-persons.jp/item/",
"content": "## ウェブでの作品製作で切っても切り離せない「解像度」\n## 同じ画像でも高いものと低いもの二種類のご用意で柔軟に対応\n画像を切り抜いて看板への使用やwebデザイン利用を試みる場合、素材の「解像度」を適切\
に使い分ける必要性がございます。看板への利用時には、画像が大変大きく引き伸ばされるため高解像度である必要がある一方、webデザインへの利用時には、読み込みの速さを優先し表示する画面も小さいため低解像度であること\
が求められます。\nこのような用途はもちろん、予算があまりない方にも低解像度版の人物画像集はリーズナブルにご購入いただけるためおすすめです。\n収録内容のご確認は上部の「商品購入・無料体験版」→各商品の「詳細を見\
る」→「収録カタログをダウンロード」でご確認いただけます。\n### 個別販売&無料ダウンロード\n当社別サイトにて販売 Sサイズは無料\nCUT OUT PERSONS (カットアウトパーソンズ)ではこの度個別販売を始めました。\n多彩\
なポース、シチュエーションで、きっとお好みのポーズが見つかります。お試し用の\nSサイズ(JPEG)は無料。切り抜き済みMサイズ、Lサイズも非常にリーズナブルでデザイナー、パース作成事務所、設計事務所だけでなく、看板\
、広告、WEBのイメージ画像作成に使いやすい商品です。\n## 人物素材の検索方法\nカテゴリーで探す カジュアル、スーツ、子供、歩く、座る等、 カテゴリー別検索を販売サイトトップページの下部に設置しております。お好み\\
の人物素材を探しやすくなっておりますので是非ご利用ください。 商品名検索 ページトップとページ下部(ヘッダーとフッター)にある商品名検索を使用することでお求めのポースが見つかりやすくなります。(例 女性 歩く)\\
下記に単語例を記載しておりますのでペーストして使用できます。\n男性 女性 子供 乳児 母親 カジュアル スーツ 制服 春服 夏服 組み合わせ 歩く 走る 立ち止まる 横 見る 手を伸ばす 座る グラス コーヒー ビール ジョッキ\
ローソファ 床 遊ぶ その他\n今後も新しい人物素材を随時販売していきます。皆様の期待に応えられるよう精一杯努力していきますのでどうぞよろしくお願いいたします。\n### ストックフォトサイトでも人物写真素材の一部を\\
販売\n2021/3/1より随時更新中\nストックフォトサイトでも人物写真素材の一部を開発、販売しております。単品購入が可能ですので気軽に購入、使用ができます。CUT OUT PERSONS に収録している一部の人物添景素材もアップし\\
ております。もちろんロイヤリティーフリーで半永久的に使用できます。\n喜怒哀楽、白背景、使用しやすい服装、余白もあり文字も入れやすい等、汎用性の高い写真素材を心がけております。広告、web制作、建築CGパース作成な\
ど幅広い分野でお役に立てれば幸いです。\n当社では3つのストックフォトサイトで販売しております。\n・\namanaimeges plus(アマナイメージズプラス)当社がメインで掲載しているサイトです。 作品例の画像をクリックして\\
いただくか、下記HPアドレスをコピーペーストで直接お入りください。\nPIXTA(ピクスタ)有名なストックフォトサイトです。アップロード枚数制限や審査基準が厳しいため、アップしている枚数が少し少なくなっております。下\
記HPアドレスをコピーペーストで直接お入りください。\n・photolibrary(フォトライブラリー)定額制販売がなく、写真素材の値段を自由に設定できるサイトです。当社の写真素材は比較的安価にしておりますので1枚だけの購入\
をご検討の方は、このサイトからの購入がお勧めです。下記HPアドレスをコピーペーストで直接お入りください。\nデザイナー様であれば使用する画像の解像度に気を配っていらっしゃる方が大半であり、そのご要望にも柔軟にお\\
応えできるようにと、「高解像度版」と「低解像度版」の二種類を製作いたしました。高解像度の場合は主にグラフィックの綺麗さが求められるオフライン向けの商材製作に向いており、パンフレットやチラシ、学習教材に大型の広告\\
・看板など、幅広い用途がございます。\n一方で画面が小さくパソコン毎に処理速度が異なってくるようなオンライン向けのwebサイトや動画製作の場合、可能な限り容量が少ないことが求められるため、低解像度が適しています。\
高解像度版を購入してPhotoshopで低解像度に下げての使用もできますが、もし予算的に余裕がなくパソコンの画面内での製作で完結するといった場合には、リーズナブルな低解像度版がおすすめです。"
}
{
"url": "https://www.uekikosho.com/news/%E5%8F%AF%E6%84%9B%E3%82%89%E3%81%97%E3%81%8F%E3%82%92%E5%BF%83%E6%8E%9B%E3%81%91%E3%81%9F%E3%80%80%E5%8B%95%E7%94%BB%E3%80%8C%E3%83%AB%E3%83%BC%E3%82%A2%E3%83%B3%E3%\
81%AE%E8%8A%B1%E5%B8%82%E3%80%8D/",
"content": "### 可愛らしくを心掛けた 動画「ルーアンの花市」\n植木良枝 花の刺繍画集「花の旅Ⅱ」に収められている作品で\n古都 ルーアンで開催されていた花市のスケッチから生まれました\nルーアンと聞いて何を一番最\\
初に思い浮かべるでしょうか?\nジャンヌ・ダルクの処刑地であること、数多く木組みの建物があることなどが有名ですね!\n私の場合は ルーアン大聖堂とモネの連作です。\n「作品 ルーアンの花市」動画はこちらから☆\nP-75 「\
ルーアンの花市」 作品内径18×26cm\nご自分でお創りになりたい方は布に図案が印刷されているキットを\n制作はしないけれど飾りたいわというお客さまは作品をお求め頂けます\n一覧に戻る\nP-75 「ルーアンの花市」キット \\
又は 作品とお申し付け下さいませ"
}
{
"url": "https://lovestrategy0011.com/line-id-440",
urlとcontentのみからなる非常にシンプルなファイルですが、非圧縮で1ファイル50GB超あるので、19ファイルあると1TBほどになります。今回はひとまず1つ目のcommon_crawl_0.jsonのみを使ってみましょう。common_crawl_0.jsonには12913592ドキュメント含まれていました。
ドメイン固有辞書の入手
ご自分で収集されているものでも、どこかの用語集にまとまっているものを使うのでもなんでも良いのですが、自分の興味のあるドメインに固有のフレーズの一覧を入手します。本記事の方法の範囲では品詞情報は不要です。
医療ドメインの日本語コーパスが少ないなぁという課題感のもと、NAISTが公開している万病辞書をつかって、医療ドメインコーパスの構築に挑戦してみます。
万病辞書は下記のような内容になっています。
出現形,出現形よみ,ICDコード,標準病名,信頼度レベル,頻度レベル
疼痛,とうつう,R529,疼痛,S,95-100%
発熱,はつねつ,R509,発熱,S,95-100%
嘔気,おうき,R11,嘔気,S,95-100%
出血,しゅっけつ,R58,出血,S,95-100%
糖尿病,とうにょうびょう,E14,糖尿病,S,95-100%
発赤,ほっせき,R21,発赤,S,95-100%
浮腫,ふしゅ,R609,浮腫,S,95-100%
頭痛,ずつう,R51,頭痛,S,95-100%
貧血,ひんけつ,D649,貧血,S,95-100%
ここに定義された病名が一定の頻度以上で現れるドキュメントを医療関連ドキュメントとみなすことにします。出現形で380300語、標準病名で38814語程あるようです。出現形まで含めてもいいのですが、サボるために標準病名のみを使います。その他以下の処理をして、25819語が残りました。
頻度レベル != 出現なし
ICDコード != -1 (ICDコードは国際的に定義された病名等の標準コード)
この25819語を一定頻度以上で含むドキュメントを医療関係ドキュメントとみなして抽出したいです。
用語の出現頻度のカウント
53GB、12913592ドキュメントあるcommon_crawl_0.jsonのそれぞれのドキュメントに対して、辞書に含まれる用語(25819語)の出現をもとめ、標準病名単位でカウントしてみましょう。
結構膨大な量のテキストなので、形態素解析するのも面倒なので、今回は形態素解析をサボって文字列マッチさせてしまいます。
形態素解析なしでも25819語からなる辞書にマッチさせるのは愚直な実装をすると結構大変なのですが、幸いaho-corasickなどの高速なアルゴリズムを使えばこれはサクッに実現できます。
Pythonにはpyahocorasicという便利な3rdパーティパッケージがあるのでこれを使います。下記はマッチングを行うPhraseMatcherの実装です。
from collections import Counter
import ahocorasick
class PhraseMatcher:
def __init__(self, phrases: list[str]) -> None:
automaton = ahocorasick.Automaton()
for phrase in phrases:
automaton.add_word(phrase, phrase)
automaton.make_automaton()
self.automaton = automaton
def find_matches(self, text: str) -> list[Counter]:
counts = Counter()
for end, phrase in self.automaton.iter(text):
counts[phrase] += 1
return counts
phrasesが辞書内の語彙です。下記のように使います。
text = "### コロナ禍での救命処置 感染対策 人工呼吸避ける\n心臓マッサージとAED / オンライン講習も\n*突然の心停止の原因として目立つのが「心室細動」と呼ばれる不整脈。..."
matcher = PhraseMatcher(phrases)
matches = matcher.find_matches(text) # {""心停止": 1, "心室細動": 1, "労作性狭心症": 1, ...}
ためしにこれを実行して、common_crawl_0.jsonの先頭10000ドキュメントほどで辞書内の語の出現頻度を一覧化してみたところ、下記のようなノイジーな語彙、一般的な文脈にも現れそうな語彙が見つかりました。
ブラ
心配
妊娠
アレルギー
ショック
頭痛
インフルエンザ
近視
認知症
肩こり
糖尿
糖尿病
口臭
...
とりあえず出現頻度上位300語あたりを辞書から除外しました。
抽出条件
下記の条件を満たすドキュメントのみ抽出しました。かなり適当な条件なので工夫の余地は大いにあります。高速なドメイン識別器があればそれを使うのでもいいでしょう。
辞書内の用語が合わせて5回以上出現
かつ、辞書内の用語が3種以上出現
抽出結果
実際に抽出を実行します。特にマルチプロセス化はしていませんが、4000ドキュメント/secくらいの速度が出ていました。
common_crawl_0.jsonの処理は1時間弱で完了し、41065文書が抽出されました。もとの12913592ドキュメントと0比べると0.3%程度でだいぶ減りましたが、全部で19ファイルあるので、合わせると800000文書ほど得られそうです。これくらいあれば色々遊べるのではないでしょうか。
以下は抽出された文書です。
まだまだだいぶノイジーですが、ファインチューニングなどには使えるのではないでしょうか。
おわりに
辞書があれば特定ドメインのそれっぽいドキュメントがそこそこ集められそうなことがわかりました。それにしても、aho-corasickは速いですね!速いは正義です。