本チュートリアルは、 データベース・デジタルライブラリーChinese Text Project(中国哲学書電子化計画)における「テキスト・ツールズ」プラグインの主な機能について、参考となるタスクやケースを提示し、紹介します。
[本チュートリアルのオンライン版はこちら: https://dsturgeon.net/texttools-ja(日本語)、https://dsturgeon.net/texttools(英語)]
初期セットアップ
- 過去にChinese Text Projectを使用した経験のない場合、チュートリアルの「ctext.orgへの実践的な説明」を参照し、ctext.orgにおけるアカウントの設定、プラグインのインストールを行ってください。
- あなたのアカウントを使用し、ログインしてください。
- APIキーを取得している場合、ctext.orgアカウントの設定画面にて、APIキーを保存してください。もしくは、あなたの機関がctext.orgを購読している場合、大学の説明に従って、使用してください。その際、大学のローカルネットワークを使用するか、大学が提供しているVPNを経由してアクセスしてください。
- 「テキスト・ツールズ」のプラグインをインストールしてください(インストールリンク)。この作業は1回のみです。
- これらのステップを完了した後、ctext.orgにおけるテキストもしくはテキストの章を開くことで、テキスト・ツールズのプラグインにアクセスするリンクが現れます。
始めましょう
テキスト・ツールズプログラムは、数多くのページ(N-gramやRegexと呼ばれます)を含んでいます。これらのページは、各頁の上部にあるリンクを使うことで、切り替えることができます。各頁は、以下に記載するツールのどれかに該当しています。ただし、基本的な使用方法と各ツールのオプションを説明しているHelp pageは除きます。これらのツールは、テキスト分析及びデータの単純な可視化を可能とします。
テキスト分析のツールは、ctext.orgからAPI経由でテキストを直接読み取るか、他の場所からテキストをツールにコピーすることもできます。ctext.orgプラグインを使用してツールを開く場合、テキストは自動に読み込まれ、表示されます。追加のテキストをctextから読み込む場合、テキスト(もしくは章)のURNをテキスト・ツールズのウィンドウボックスにある「Fetch text by URN」という名のボックスにコピーし、Fetch(フェッチ)をクリックしてください。テキストが読み込まれた後、内容は、タイトルとともに表示されます。より多くのテキストを追加する場合、「Save/add another text」をクリックし、先ほどの手順を繰り返してください。現在選択されたテキストの一覧は、ウィンドウの上部に表示されます。
N-grams
N-gramは、一連の連続したnのテキスト項目(文字や単語)であり、nは固定小数点整数です(例えば、n=1, n=3など)。「テキスト項目」は、通常、用語(単語)や文字であり、特に、中国語において、文字は単語と比べ、より頻繁に使用されます。その背景には、中国のテキストを正確かつ自動的に、一連の独立した単語に分割することが難しいからです。例えば、「學而時習之不亦說乎」という一文には、以下3つの文字によるgramsが含まれています(すなわち、全く同じの3つの文字が特殊な順序で配置されています):「學而時」、「而時習」、「時習之」、「習之不」、「之不亦」、「不亦說」、「亦說乎」。
テキスト・ツールズのN-gramに関する機能は、n-gramsの文字という形式に基づいて、様々な中国テキストにおける単語の使用を概観することができます。
- ctext から2〜3のテキストを選び、1 gramsの計算を試みてください。「Value of n」は、1で設定してください。よりよく傾向を可視化するため、Chartのリンクを使用し、生データの棒グラフを描いてください。この作業を正規化した場合と、しない場合、両方で試してください。
- この作業を2及び3 gramsで繰り返してください。
- 上記で選んだテキストの長さがおおよそ同じである場合、もう2つ、長さ、もしくはスタイルにおいて大いに異なるテキスト(『道德經』や『紅樓夢』)を選び、正規化する場合と、しない場合に分け、どのように結果が変化するのか、実演してみてください。
ワードクラウドは、もう一つの可視化の手段であり、その基になるデータは、ラベルの大きさがそれらの発生頻度に比例して異なるテキストによって描かれています(もしくは、より多い場合、それらの対数の頻度に比例します)。通常、ワードクラウドは、文字や単語を使用した単一のテキストや結合したコーパスによって構築されていますが、一般的に同じ原理は、自然とn-grams(および通常の表現)、複数のテキストにも広がるとされています。テキスト・ツールズでは、複数のテキストを可視化することで、データ内の一つ一つの確かなテキストを異なる色で表示します。これは、正規化においても同じ事がいえます:異なるテキストが長さによって正規化されていない場合、テキストが長くなることでラベルは自然と大きくなります。
- 単一のテキストおよび2つもしくはより多くのテキストの為のワードクラウドを作成してください。ワードクラウドタブの設定の中にある「Use log scale」に基づいて実験してみてください。その作業によって、なぜ対数スケールがより頻繁にワードクラウドに使用されるか理解して頂けると思います。
テキストの相似性
本相似性ツール(Similarity tool)は、 n-gram shinglingを使用することで、テキストの再利用関係を認識し、可視化する事ができます。使用するには、まずは一つもしくは多くのテキストを読み込み、好みのオプションを選び、Runをクリックしてください。
本ツールによって、特定の部分的なテキスト間において共有されているn-gramsを認識することができます。全てのn-gramsを報告するのではなく(例えばN-gramツールの機能のような)、本ツールは、一つ以上の場所で繰り返されたn-gramsのみを報告し、一対の章において共有された全てのn-gramsを計算します。そのため、N-gramツールとは異なり(「最小カウントが1」の場合)、より大きいnの値が比較的少ない結果に現れるという現象が起きます。なぜなら、短いn-gramsは、比較的長いn-gramsに比べ、より複数の場所に出現することが多く、比較対象となっているアイテムの間において、再利用されたテキストの関係を表す傾向が大きいからです。
相似性ツールのアウトプット内には、2つのタブが有ります。一つは、「Matched text」と呼ばれるタブで、マッチしたn-gramsを表し、より大きい数の重複したn-gramsは、より明るい赤い色で表示されます。もう一つは、「Chapter summary」というタブで、全ての一対の章においてマッチするaggregateを集約しています。
- 『論語』において、n=5という設定のうえで、相似性ツールを実行してください。
- Constraintという機能で実験してみてください。まず、章のタイトルをクリックし、特定の章もしくは一対の章と平行している節のみを表示してください。
- マッチするn-gramsを選択し、クリックしてください。この作業によって、異なる種類の制約を行い、マッチしたn-gramの場所を特定することができます。
- テキストの再利用状況は、重み付きネットワークグラフとして可視化されます。あなた自身のn-gramに関する相似性の結果を表示するには、「Chapter summary」タブ内にある「Create graph」のリンクをクリックし、Drawをクリックしてください。
- 本測定方法に基づいた場合、『論語』では、どの章において最もテキストの再利用関係が強いでしょうか?グラフから直接読み取ることが可能だと思いますが、Chapter summaryのタブに戻ることで、数値的を確認し、相似性に基づいて、図をソートすることができます。その作業をするには、まず、テキスト・ツールズ内の如何なる図においても、コラムのタイトルをクリックすることで、コラム内で図がソートされます(2回クリックすることで、ソートの順序を切り替えることができます)。
- グラフに戻り(ページの上部にあるNetworkのリンクをクリックして切り替えてください)、グラフの辺には、認識した相似性に関する具体的な意味が定義されています。辺をダブルクリックすることで、相似性ツールを再度開くことができ、その中には、選択された辺の具体的な相似性がハイライトされています。本機能に基づいて、一番厚い、そして薄い辺を含むいくつかの辺を実証してください。
- nの値を増加、現象して実験してみてください。どのように結果に影響しますか?
- デフォルトでは、グラフには、全ての認識された相似性が辺に表されます。とりわけ比較的小さいnの値において、いくつかの関係はあまり重要ではなく、全ての一対したグラフのノードに辺が表示されることで、現象が複雑化され、有意義なパターンを覆い隠してしまいます。次に、グラフの単純化を試してみてください。「Skip edges with weight less than」にて、基準値(例えば、0.001)を設定することによって、再利用の数が比較的少ない辺を削除することができ、グラフを単純化することができます。この結果と、相似性ツールにおいて、nの値を増加した場合とで比較してみてください。この作業によって、辺の数を減らし、より自明な相似性を省くことができます。
- 本相似性ツールは、複数のテキストにおいても使用することができます。仮に、複数のテキストが読み込まれ、グラフが作成された場合、異なる色によって章における相違したテキストを区別することができます。『荀子』および『莊子』においても試してみてください。これら2つのテキストは非常に異なりますが、互いに再利用の関係があります(この作業を実行するには数秒の時間がかかります。相似性ツールは、長いテキストほど、時間がかかります)。
正規表現(Regular expressions)
正規表現(通常regexと呼ばれます)とは、テキスト本文の中で検索されるパターンです。最も分かりやすいケースとしては、一つの正規表現は、検索する為の立て続けの文字です。しかし、このようなシンプルな考えを特別にデザインされた構文で補うことによって、より複雑な方法でデータ検索を行うことができます。
Regexツールは、一つもしくはより多くのテキストにおいて、一つもしくはそれ以上の正規表現を検索することができます。また、マッチしたテキストをリストアップし、テキスト、章もしくは段落ごとに結果を集約することができます。
- もっともシンプルな正規表現は、文字列検索は一種の全文検索で、すなわち、特定の順序に基づいた文字にマッチする(唯一の)文字が整理されたリストです。『論語』で現れるようなテキストを検索してみてください(例えば、「君子」)。
- 「Matched text」と「Summary」タブにおける内容を検証してください。
- 2つ目の検索単語(例えば、「小人」)を検索し、もう一度regexを実行してください。
- 今度は、同じ2つの正規表現に基づいた同様の検索を再度実行してください。ただし、「Group rows by」の部分をデフォルトのNoneからParagraphに変更してください。この作業を行う際、Summaryのタブは、『論語』の各段落に対応する1つの行を表示します。数字で表記された段落をクリック(してくださいこれらの数字は、自動的にテキストの最初から選択されています)。この作業により、行と対応する節がハイライトされます。
このような結果は、段落や章といったユニットによってグループ化された場合、相関的です。仮に、2つの用語が共に同じ段落(もしくは章)で現れた場合、両者には何らかの関係があります。仮に、繰り返し複数の段落で共に現れた場合、そのテキストにおいて、両者は比較的強い関係があるといえます。そのため、本情報はネットワークグラフを使用して可視化することができます。この作業は、テキスト・ツールズ内において、正規表現を実行し、「Group rows by」の設定をParagraphにすることで可能となります。
- 『論語』において、「父母」、「君子」、「小人」、「禮」および「樂」を検索し、同じ段落におけるそれらの共起性に基づいたネットワークグラフを作成してください。
- グラフの辺をダブルクリックすることで、Regexツールが再度開き、選択した辺と関連する項目がハイライトされます。この機能を使って、最も厚い辺から薄いものまで、いくつか選び、実際どのようなデータが表示されるのか分析してみてください。
- 同じ方法を使って、「寶玉」、「黛玉」、「寶釵」など(参考:中国語ウィキペディア)といった人物名に特化し、如何に同じ登場人物の名前が『紅樓夢』の段落において、同時に表れているのか、明確にしてください。注:実際に、テキストで頻繁に出現している名前を選んでください(例えば、「寶玉」は、「賈寶玉」よりも頻繁に使われており、「賈寶玉」にもマッチします)。これは、社会ネットワーク分析の一例です。
- 「Group rows by」をNoneと設定している場合、一時的に「Matched text view」に制約を加え、特定の文字列を検索した段落のみを表示することができます。制約の設定や解除は、「Matched text view」において対応した文字列をクリックすることで実行することができます。もしくは、「Summary」の画面において、アイテムのテキストラベルをクリックすることでそのアイテムに制約を加え、どの段落が特定の文字列を含んでいるか見ることができます。再度同じ単語で検索してください。ただし、この場合、「None」モードに設定してください。その結果、迅速にあなたの登場人物リストの中で最も使用頻度が低い段落を判別することができます。
[備注:このような検索をする場合、重要なことは、「非常に頻繁に」一致したテキストが出るのか、もしくは、他の要素を見逃していないか、検査することです。上記の『紅樓夢』では、例えば、賈寶玉を表す「寶玉」にマッチす文字列は非常に多くあるが、後程小説で登場する「甄寶玉」の場合も、「寶玉」にマッチする。このような現象を防ぐためには、正規表現の使用が必要です。例えば、regex「(?!甄)寶玉」と表記することで、「甄」を含まない「寶玉」の検索が可能となります。]
上記では、最も簡素な正規表現についてご紹介しました。正規表現は、より複雑なパターンを具体化することで、上記で説明した簡素な文字列検索と同じく、検索することができます。例えば、「以和為量」、「以生為本」もしくは「以我為隱」といった「以(何々)為(何々)」という文字列の具体化を事例としましょう。このような検索を可能とする為、決まった文字に検索するパターンを記述した「特殊な」文字を加えることで、正規表現を作ることが必要です。
正規表現を使用するにあたり、最も活用しやすい特定な構文は、以下の表にまとめています:
. | 如何なる文字を対象に、一度のみマッチする |
[abcdef] | 如何なる文字a,b,c,d,e,fを対象に、一度のみマッチする |
[^abcdef] | a,b,c,d,e,f以外の如何なる文字にマッチする |
(xyz) | xyzにマッチし、結果はグループによって番号付けされる |
? | 文字やグループの後で、その文字やグループは任意とすること(すなわち、0もしくは1回マッチする) |
? | +, * もしくは {…}の後で、最短のマッチをする(つまり、最も長いのではなく、短いマッチを選択する) |
* | 文字やグループの後で、その文字やグループを0回もしくはそれ以上の回数マッチさせる |
+ | 文字やグループの後で、その文字やグループを1回もしくはそれ以上の回数マッチさせる |
{2,5} | 文字やグループの後で、その文字やグループを2、3、4もしくは5回マッチさせる |
{2,} | 文字やグループの後で、その文字やグループを2回もしくはそれ以上の回数マッチさせる |
{2} | 文字やグループの後で、その文字やグループを丁度2回マッチさせる |
\3 | 3番目のグループの如何なる文字にもマッチする(一番左を1番とする) |
構文は複雑に見えますが、比較的容易に始めることができます。例えば、上記表にある最初の特別な構文では、「ピリオド “.”」は、如何なる一つの文字にもマッチします。その為、上記で述べた事例の「以(何々)為(何々)」を正規表現にすると、「以.為.」となります。つまり、検索する文字列は、「 “以”、如何なる一つの文字、“為”、如何なる一つの文字」ということになります。
- 「Group by None」に設定し、Regexの「以.為.」を『莊子』で調べてみてください。
- このregexの検索結果の中には、検索対象として考えていなかった文字列もヒットすることが有ります。例えば、上記のregexでは、「以汝為?」もヒットします。なぜなら、正規表現マッチングの場合、句読点も「文字」として認識されるからです。この現象を避けるには、regexにおいて、如何なる文字にもマッチする「.」ではなく、「ネガティブ文字クラス(特定の文字を除外する)」を使用することです。この事例にあるregexの場合、「以[^。?]為[^。?]」となります。これを試し、上記の現象を回避してください。
- 中国語の文章には、多くの異なる句読点があります。テキスト・ツールズでは、「\W(大文字)」をインプットすることによって、中国語における共通の句読点を表すことができ、「\w(小文字)」ではその他の句読点を表すことができます。仮に、「以\w為\w」と表記した場合、先程実験したregexと同じ結果が出るでしょう(しかし、これは英語のregexにとって一般的な慣習であり、「\w」と「\W」の結果は、異なるregexのインプットによって違い、中国語においては適応しないことが多々有ります)。
- 『道德經(ctp:dao-de-jing)』における以下の文字列を正規表現を使ってテストしてください:
- 如何なる4つの文字であり、中間に「之不」を含んでいる文字列。例えば、「視之不見」、「聽之不聞」など。
反復
反復は、上記図に表示している様々な反復オペレーターと修飾子を使うことで実行することができます。
- {a,b}というオペレーターを使用することで、正規表現を数回反復することができます。この作業は、regexにおける直前のアイテムを修正し(文字やグループの明記)、少なくとも、a回からb回(もしくはbを空欄にすることで如何なる回数を表記)反復させることができます。仮に、コンマを無くし、{a}とすることで、直前のアイテムは、必ずa回反復させることができます。
- 例えば、「仁.{0,10}義」は、文字としての「仁」にマッチし、その後には、0から10個のその他文字を含み、更に、その後には文字としての「義」が続きます。その為、「仁義」や「仁為之而無以為;上義」、「仁,託宿於義」といった検索がヒットします。
- これは、グループにおいても同様の事が当てはまります。この場合、グループによって特定化されているパターンが(内容ではなく)特定回数反復するということになります。例えば、「(人.){2,}」は、「人來人往」、「人前人後」、及び「人做人配人疼」がマッチします。
- 「+」、「*」及び「?」といったオペレーターが文字やグループの後に続いた場合、このような意味を持ちます:「+」は「{1,}」に値し、「*」は「{0,}」そして、「?」は「{0,1}」となります。
- 上記に記した2つの具体例(例えば、「仁.{0,10}義」、「(人.){2,}」)を実験してください。
- 『道德經(ctp:dao-de-jing)』における以下の項目について、正規表現を使ってテストしてください。
- テキストにおける各「言い回し(句読点によって分けられた節)」。例えば、最初のマッチは、「道可道」であり、2つめは、「非常道」である、など。
- 「之」を含む言い回しをマッチしてください。
- 「之」を含む言い回しを選び、「之」が最初でもなく、最後でもない場合をマッチしてください。
- 以下、『墨子』(ctp:mozi)における項目を正規表現とし、テストしてください:
- 「君」の次に「父」が続く場合をマッチしてください(例えば、「君父」、「…君臣父…」、「君臣上下長幼之節,父…」、など)
グループ
反復意外に、正規表現の作用は、「グループ」と呼ばれる部分に区別し、これらのグループにマッチしたコンテンツに基づいて、更なる状況を表現することができます。それによって、より洗練されたパターンを表現することができます。
- 仮に、「君不君」、「臣不臣」、「父不父」といった、とある文字の後に「不」が続き、更に同じ文字が続くという場合を事例としましょう(つまり、「人不知」といった検索は目的としていません)。
- まず、最初の文字(如何なる文字でも)を「グループ」として「キャプチャー」し、その後、他の場所でそのグループのコンテンツにマッチングするか実験します。
- 何かをグループでキャプチャーするということは、その対象を丸括弧で囲むことで実行できます(例えば、“(.)”は、如何なる文字にもマッチし、グループでキャプチャーされています)。
- グループは、自動的に1から番号付され、左角括弧から始まり、regexは、左から右に動いていく。
- 構文の「\1」を使用して、グループ1とマッチし、「\2」ではグループ2とマッチすることで、マッチングしたグループの内容を参照することができます。
- 事例「(.).\1」では、如何なる文字とその文字との連続(どのような文字でも)をマッチすることができます。これを『論語』において試し、regexを句読点ではない文字にマッチするよう修正してください(「本,本」といった形でマッチングしない為に)。
もう一つの事例は、「禮云禮云」や「已乎已乎」といった一般的な反復のパターンです。このような例では、同じアプローチを使用することができます。一つの手段としては、「(..)\1」があります。これは、如何なる2つの文字にもマッチし、続けて2つの同じ文字にマッチします。もう一つの(相似した)例は、2つの異なるグループを使い、「(.)(.)\1\2」とすることです。これは、如何なる連続した文字X、Yにマッチし、更にXとYにマッチするという意味です。
- 『詩経(ctp:book-of-poetry)』における「委委佗佗」や「戰戰兢兢」といった文字列にマッチするよう、正規表現を書き、テストしてください。
- 『莊子』において、「XYZ,ZYX」といった複雑な反復スタイルにマッチする正規表現を作成し、テストしてください。X、YおよびZは、1〜5の文字を含むことができます。Regexは、「知者不言,言者不知」、「道無以興乎世,世無以興乎道」及び「安其所不安,不安其所安」といった項目にマッチングすべきです。
Regexの置き換え
置き換えの機能は、regexの検索機能と似たような方法です。この機能は、一つの具体的なテキストにおいて特定の正規表現を検索し、特定の値によって全ての場所において置き換えられます。置き換えは、シンプルな文字列でも可能ですし、正規表現の内容によって多様な形に設計することも可能です。特に、検索したregexにおいて、グープとしてマッチした項目については、構文の「$1」を使用することで、グループ1のテキストマッチングを含み、「$2」ではグループ2のマッチングをするという事が参照できます。一般的なregexの置き換え方法としては、外部から得たデータを「きれいに片付ける」、もしくは、他の特定の手段に使用するために準備をする、ということがあげられます。
例えば:
- 「\W」を“”(文字列はなし)に置き換えることで、テキストにおける全ての句読点と改行を削除することができます。
- 「^(\w{1,20})$」を「*$1」に置き換えることによって、1〜20の文字を含む如何なる行においてタイトルマーカーを加えることができます。検索結果に句読点は含まれず、ctext以外のテキストをインポートする際に有効的です。
バージョン間の違いを認識する
「Diff」ツールは、一字一字の2つの相似したテキストの「Diff」を実行するシンプルな方法です。相似性ツールと異なり、本ツールは、相似性の高い2つのテキスト(全く同じということでもない)をインプットする際に最も適しています。
Diffツールを使い、『正統道藏』における「太上靈寶天尊說禳災度厄經 (ctp:wb882781)」と『重刊道藏輯要』における同一のテキスト(ctp:wb524325)を比べてください。
ネットワークグラフ
正規表現やSimilarityツールを使用してグラフを作成する際、データは、ネットワークのタブにエクスポートとされています。ナビゲーションの説明に関しては、「Help」のタブを参照してください。ネットワークのタブにおけるグラフは、「GraphViz」フォーマットのサブセットに入力されます。一方、他のタブによって作成されたグラフの全ては、この同じフォーマットでダウンロードすることができます。より柔軟な方法で出版品質のグラフを作成したい場合、Gephiをダウンロード、インストールすることで、これらのファイルを開くことができます(https://gephi.org/)。
他のテキストを使用する場合
ctext.org以外のリソースから得た中国語のテキストは、テキスト・ツールズを経由して使用することができます。具体的な説明は、「Help」の「Loading texts」をご参照ください。