第3回:語彙素とパターンで本文を検索する
2026年10月20日(火)
第2回のstory.txt、ワークシート、宿題のメモを手元に置いてください。
| 使うもの | 第2回まで | 今回 |
|---|---|---|
| 本文 | story.txt |
同じ本文と、芥川龍之介103作品の準備済みコーパス |
| 検索 | grepの文字列検索 |
grepの正規表現と、lingの語彙素のパターン |
| 記録 | ワークシートの1–7行目と宿題のメモ | 授業のメモと、CSVの8–10行目(宿題) |
第2回を欠席した場合は、自分のアノテーションの代わりにワークシート7行のラベル例(CSV)を使ってください。
1. 準備済みコーパスを用意する
使うPCに、lingを使えるようにするの手順で検索ツールling(lingrep 0.5.0)を一度インストールしてください。
- 準備済みコーパス(ZIP、約18 MB)を第2回の作業フォルダー
dh-b-2026に保存し、展開してください。 - ターミナルを開き、次のコマンドを1行ずつ実行してください。
cd dh-b-2026/class3-prepared
ling --version
ling corpus inspect story-unidic-novel.lingcorpus準備済みコーパス(.lingcorpus)は、解析器と辞書で解析した結果を保存した本文です。lingは--corpusで辞書なしに読みます。
inspectが文書数1を表示し、最後にcomplete:を表示すれば、次の節に進めます。コマンドが見つからなければ、lingを使えるようにするの手順を行い、ling --versionをもう一度実行してください。
| ZIPの中身 | 内容 |
|---|---|
story.txt |
第2回と同じ「蜘蛛の糸」の本文 |
story-*.lingcorpus |
同じ本文を六つの解析器・辞書で解析した準備済みコーパス(4節の表) |
tokens-*.tsv |
各解析の表。表計算ソフトでも開ける |
story-ginza.conllu・story-spacy.conllu |
GiNZAとspaCyの元の出力(CoNLL-U形式) |
akutagawa-unidic-novel.lingcorpus・akutagawa-works.csv |
芥川龍之介の103作品の準備済みコーパスと作品一覧(8節) |
class3.lx・compare.lx |
今回のパターンファイル |
README.txt |
使ったツール・辞書の版 |
辞書を使って自分で解析するには?
先に小説用辞書の設定を行ってください。この手順で近現代口語小説UniDic 202512がLINGREP_DICTIONARY_PATHに設定されます。ling doctorがling readiness: readyを表示すれば、--corpus story-unidic-novel.lingcorpusの代わりにstory.txtを渡して、本文を解析しながら検索できます。
ling doctor
ling matches --pattern '[lemma=上る].' --context 2 --color never story.txt結果は準備済みコーパスと同じです。別の辞書や解析器で解析するときは、形式ごとに渡し方が違います。
| 辞書・解析器 | 渡し方 |
|---|---|
UniDic(Vibrato形式の.dicファイル) |
--dict-pathにファイルを指定する |
| UniDic(MeCab形式のフォルダー) | そのままでは読み込めない。lingrepのNixパッケージでVibrato形式の.dicに変換してから--dict-pathに指定する |
| Sudachi | --analyzer sudachi --sudachi-dict system_core.dic。GitHubのリリースにあるSudachiDict v20261015以降を使う。分割単位C・組み込みのリソースが既定値 |
| GiNZA・spaCy | 保存済みのCoNLL-Uを--input-format conlluで読む(ZIPのstory-ginza.conlluはこの出力)。--analyzer-configで設定済みのアダプターを指定すれば直接解析もできる。lingrepの設定手順を参照 |
2. 文字列の検索をパターンに広げる
第2回では、grep -Fで文字列そのものを検索しました。正規表現は、任意の1文字や文字の候補を記号で表す検索パターンです。-Eを付けると、grepは引数をパターンとして読みます。
grep -oE 'のぼ.' story.txt | sort | uniq -c
grep -oE 'のぼ[っりるれ]' story.txt | wc -l| 記号・コマンド | 意味 |
|---|---|
. |
任意の1文字 |
[っりるれ] |
角括弧の中のいずれか1文字 |
sort | uniq -c |
同じ行をまとめ、件数を先頭に表示 |
パイプ(|)は、左のコマンドの出力をそのまま右のコマンドの入力にします。次の図は、1行目のコマンドに第8節で使うsort -rn | headを足し、各段階の出力を示します。
|)でつないだ5つのコマンドの、各段階の出力
grep -oE 'のぼ.' story.txt
|
→|
|
sort
|
→|
|
uniq -c
|
→|
|
sort -rn
|
→|
|
head -3
|
|---|---|---|---|---|---|---|---|---|
| 一致した部分を1行ずつ取り出す | 同じ行が隣り合うように並べる | 隣り合う同じ行を1行にまとめ、件数を先頭に付ける | 先頭の数が大きい順に並べる | 先頭の3行だけ残す | ||||
|
|
|
|
|
||||
| 12行 | 12行 | 5行 | 5行 | 3行 |
色:のぼん(あのぼんやりの一部)が各段階で移る位置
本文:配布したstory.txt(Soranoha版「蜘蛛の糸」)。
のぼんはあのぼんやりの一部で、移動表現ではありません。2行目のコマンドはのぼんを除いた11件を数えます。よじのぼっはのぼっとして11件に含まれ、複合動詞を分けて数えるには次の節の解析が必要です。
3. UniDicの解析を読み、語彙素で検索する
UniDicは、国立国語研究所が公開している形態素解析用の辞書です。解析器は本文を短単位のトークンに分け、各トークンに語彙素・品詞・活用形を付けます。今回の主な辞書は、明治・大正期の小説に合わせて整備された近現代口語小説UniDicです。
語彙素は、活用形や表記の違いをまとめたUniDicの語の見出しで、出力ではlemma列です。のぼっ・のぼり・のぼる・のぼれは語彙素上るにまとまり、よじのぼっは複合動詞攀じ登るになります。
ling tokenize --corpus story-unidic-novel.lingcorpus --tsv | lessTSVはタブで列を区切った表で、同じ表はtokens-unidic-novel.tsvにもあります。
| 列 | 内容 |
|---|---|
| 6列目 | 表層形 |
| 7列目 | 語彙素 |
| 8列目 | 品詞 |
| 9列目 | 活用形 |
lessでは、/に続けて文字列を入力すると検索でき、qで閉じます。のぼっとよじのぼっを探し、語彙素と品詞を確認してください。
ling check --pattern '[lemma=上る].'
ling matches --corpus story-unidic-novel.lingcorpus --pattern '[lemma=上る].' --context 2 --color never| 書き方 | 意味 |
|---|---|
[lemma=上る] |
語彙素が上るの1トークン |
[upos=VERB] |
品詞が動詞の1トークン |
[unidic.cform ~ 命令] |
活用形に命令を含む1トークン |
[lemma=上る] [lemma=て] |
続けて書くと、連続するトークンの列 |
末尾の. |
定義の終わり。引用符の中に残す |
checkは構文を検査し、matchesは一致箇所と前後2トークンを表示します。配布したstory.txtと今回の辞書では、10トークンに一致します。
第2回のgrep -oF 'のぼ'は12件、2節のパターンは11件でした。三つの差をあのぼんやりとよじのぼっから説明し、メモに残してください。
4. 同じ本文を別の解析器と辞書で読む
語彙素は辞書が決めます。ZIPには、同じ本文を次の六通りで解析した準備済みコーパスが入っています。
| コーパス | 解析器 | 辞書 |
|---|---|---|
story-unidic-novel |
Vibrato | 近現代口語小説UniDic 202512 |
story-unidic-cwj |
Vibrato | 現代書き言葉UniDic 202512 |
story-unidic-kindai-bungo |
Vibrato | 近代文語UniDic 202512 |
story-sudachi-core-c |
Sudachi(分割C) | SudachiDict core |
story-ginza |
GiNZA 5.3(spaCy) | SudachiDict core |
story-spacy |
spaCy ja_core_news_sm 3.8 |
SudachiDict core |
本文の四つの表層形は、各コーパスで次のように解析されます。
| 表層形 | UniDic三種(Vibrato) | Sudachi・GiNZA | spaCy |
|---|---|---|---|
のぼっ |
上る |
のぼる |
のぼる |
よじのぼっ |
攀じ登る(1トークン) |
よじのぼる(1トークン) |
よじとのぼっに分割 |
のぼれ |
上る |
のぼれる |
のぼれる |
這い上っ |
這い上る |
這い上る |
這いと上っに分割 |
語彙素の値は辞書によって決まるため、一つの辞書に合わせて書いたパターンを、別の辞書による解析結果にそのまま適用することはできません。この本文では三つのUniDicが同じ語彙素を返しますが、別の本文では辞書の対象時代や文体によって結果が変わります。
- 3節の
[lemma=上る]でstory-ginzaとstory-spacyも検索し、件数を比べてください。配布したstory.txtでは10件・0件・2件です。 攀じ登ると這い上るを一つの動詞として数えるには、どの解析器と辞書を選びますか?理由をメモに書いてください。
表の語彙素はどう数えましたか?
compare.lxは、のぼ・落ち・下り・上っを含むトークンを、表層形・語彙素・品詞の組み合わせごとに数えるためのパターンファイルです。次のコマンドで、各コーパスを集計できます。
ling summarize --corpus story-unidic-novel.lingcorpus --patterns compare.lx --top all
ling summarize --corpus story-ginza.lingcorpus --patterns compare.lx --top all
ling summarize --corpus story-spacy.lingcorpus --patterns compare.lx --top all5. 文字列検索が見落とした移動を探す
第2回と宿題の検索は、のぼと落ちを含む箇所だけを見つけました。語彙素と品詞を使うと、本文のすべての動詞を数えられます。class3.lxでは、名前 := パターン.が一つの定義、key: [lemma]は集計の単位を語彙素にする指定、#で始まる行は注記です。
less class3.lx
ling check --patterns class3.lx
ling summarize --corpus story-unidic-novel.lingcorpus --patterns class3.lx --top all > summary.txt
less summary.txtverbsの表には、動詞の語彙素が件数順に並びます。配布したstory.txtでは上ると言うが各10、落ちると光るが各5です。verticalは、教員が選んだ12の語彙素の集合です。垂れるとぶら下がるは、糸と犍陀多の状態を表します。
verbsから上下の移動を表す語彙素をすべてメモに書き出し、のぼ・落ちの検索では見つからなかったものに印を付けてください。- 書き出した語彙素と
verticalを比べ、加えたい語彙素か除きたい語彙素を一つ選んでください。垂れるとぶら下がるを移動表現に含めるかは、第2回で修正した基準で判断してください。 class3.lxの集合を変更し、checkとsummarizeを再実行して、変更の理由をメモに残してください。
6. 判断の手がかりになる語形を探す
第2回の「移動は起きる?」は、段落を読んで判断しました。命令・条件・否定の語形は、その判断の手がかりになります。
ling matches --corpus story-unidic-novel.lingcorpus --pattern '[unidic.cform ~ 命令].' --context 3 --color never
ling matches --corpus story-unidic-novel.lingcorpus --pattern '[unidic.cform ~ 仮定].' --context 3 --color never
ling matches --corpus story-unidic-novel.lingcorpus --pattern '[upos=VERB] [lemma in {ない, ぬ}].' --context 3 --color never| パターン | 配布したstory.txtでの一致 |
対応する第2回の判断 |
|---|---|---|
| 命令形 | 下りろが2件 |
起きるか示されていない(Uu) |
| 仮定形 | のぼって行けば2件を含む10件 |
起きるか示されていない(Uu) |
| 動詞と否定 | のぼれなく1件と云えない2件 |
起きない・起きなかった(CT-) |
語形は手がかりで、判断そのものではありません。落ちてしまわなければなりませんは仮定形に一致しますが、語り手は落下を避けられないものとして述べています。unidic.cformはUniDicの出力にだけある属性で、4節の他のコーパスでは使えません。
- 一致のうち移動表現だけを選び、ワークシートの判断と比べてください。
- 命令・仮定・否定の語形を含まない箇所(「起きる・起きた」(
CT+)の多く)を一つ選び、何を根拠に判断したかを書いてください。
7. 来る・行くで語り手の視点を読む
移動の動詞に続く来る・行くは、語り手がどこから移動を見ているかを示します。
ling matches --corpus story-unidic-novel.lingcorpus --pattern '[upos=VERB] [lemma=て] [lemma in {来る, 行く}].' --context 3 --color never配布したstory.txtでは7件に一致します。summary.txtのdeixisには、動詞と来る・行くの組み合わせごとの件数があります。
- 各一致について、誰が移動し、
来ると行くのどちらで述べられているかを記録してください。 - 犍陀多の登りと罪人たちの登りでは、どちらの語が使われていますか?第二部の視点はどこにありますか?ワークシートの主体の欄と、語り手の立場の判断に照らしてください。
8. 芥川の103作品に広げる
akutagawa-unidic-novel.lingcorpusは、Soranohaの芥川龍之介103作品を同じ辞書で解析した準備済みコーパスです。akutagawa-works.csvには、Soranohaの作品名・初出情報と、作品情報のsource、本文のreaderへのリンクがあります。同じパターンファイルで検索・集計し、一作品で得た観察結果が、ほかの作品にも当てはまるかを確かめてください。
ling summarize --corpus akutagawa-unidic-novel.lingcorpus --patterns class3.lx --top all > akutagawa-summary.txt
grep vertical akutagawa-summary.txt
grep deixis akutagawa-summary.txt | grep -E '上る|落ちる|下りる'grepは保存した集計から、表の名前や語彙素を含む行だけを取り出します。
| 表 | 件数 |
|---|---|
vertical |
上る183、落ちる178、下りる103、垂れる62、沈む54 |
deixis |
上るは行く19・来る18、落ちるは来る14・行く4 |
作品ごとの件数は、matchesの表形式の出力から数えます。
ling matches --corpus akutagawa-unidic-novel.lingcorpus --tsv --patterns class3.lx | grep -w vertical | cut -f3 | sort | uniq -c | sort -rn | head
ling matches --corpus akutagawa-unidic-novel.lingcorpus --where '@document.title = 杜子春' --pattern '[lemma in {上る, 落ちる, 下りる}].' --context 4 --color never| コマンド・オプション | 意味 |
|---|---|
grep -w vertical |
verticalという語を含む行だけを残す |
cut -f3 |
タブ区切りの3列目(作品のファイル名)だけを取り出す |
sort | uniq -c | sort -rn | head |
同じ作品をまとめて数え、多い順に並べ、先頭の10行を表示(第2節の図) |
--where '@document.title = 杜子春' |
作品名(@document.title)などの情報で範囲を絞る |
次の図は、1行目のコマンドの各段階の出力を示します。
--tsvの出力から作品ごとの件数になるまでの、各段階の出力
ling matches --corpus akutagawa-unidic-novel.lingcorpus --tsv --patterns class3.lx
一致を1行ずつ、タブ区切りの10列で出力する
- 12345678910
- 138verbsAkutagawa_R_Aguninokami.md01111113637落ち
- 139verticalAkutagawa_R_Aguninokami.md01111113637落ち
- 140verbsAkutagawa_R_Aguninokami.md011211234勇み立っ
- 53244verbsAkutagawa_R_Toshishun.md9298308111011落ち
- 53245verticalAkutagawa_R_Toshishun.md9298308111011落ち
- 53256verbsAkutagawa_R_Toshishun.md92103308161112見下し
- 53257verticalAkutagawa_R_Toshishun.md92103308161112見下し
7行
↓| grep -w vertical
verticalという語を含む行だけ残す
- 12345678910
- 138verbsAkutagawa_R_Aguninokami.md01111113637落ち
- 139verticalAkutagawa_R_Aguninokami.md01111113637落ち
- 140verbsAkutagawa_R_Aguninokami.md011211234勇み立っ
- 53244verbsAkutagawa_R_Toshishun.md9298308111011落ち
- 53245verticalAkutagawa_R_Toshishun.md9298308111011落ち
- 53256verbsAkutagawa_R_Toshishun.md92103308161112見下し
- 53257verticalAkutagawa_R_Toshishun.md92103308161112見下し
3行
↓| cut -f3
3列目だけ取り出す
- 12345678910
- 139verticalAkutagawa_R_Aguninokami.md01111113637落ち
- 53245verticalAkutagawa_R_Toshishun.md9298308111011落ち
- 53257verticalAkutagawa_R_Toshishun.md92103308161112見下し
3行
↓| sort | uniq -c | sort -rn | head
第2節の図と同じ手順で数える
- 2Akutagawa_R_Toshishun.md
- 1Akutagawa_R_Aguninokami.md
2行
色:cut -f3が残す3列目(作品のファイル名)。9列目は空
本文:akutagawa-unidic-novel.lingcorpus。1段階目は59,817行の出力から7行を抜粋。
「杜子春」では、登って来たが語彙素上るに一致します。語彙素は漢字表記の違いもまとめるため、のぼの文字列検索では見つからない箇所です。103作品の件数は、作品の長さ、発表年、辞書の判断に依存します。
- 件数の多い作品を一つ選び、
--whereでその作品の一致箇所を表示してください。二箇所を選び、それぞれを含む段落全体を読んでください。 - 「蜘蛛の糸」と同じ三つの判断で分類し、
来る・行くが誰の視点を示すかを記録してください。 - 件数から言えることと言えないことを一つずつ書いてください。
103作品の結果は何を示す?
授業で8節まで進めなかった場合は、103作品の集計、作品ごとの件数、「杜子春」の一致の保存済み出力で次の結果を確かめてください。「蜘蛛の糸」は103作品に含まれていません。
- 集合の件数:
verticalの12語彙素のうち11が現れ、合計は660件です。上る183、落ちる178、下りる103の三つで全体の約7割を占めます。這い上るは3件、追い上げるは0件です。 - 集合の外の語彙素:
deixisの表には下るが来る18・行く9で現れますが、下るはverticalの集合の外にあります。5節で集合に加える候補になります。 来る・行くの偏り:「蜘蛛の糸」では、登りはのぼって行けとのぼって来たのように両方の語で、落下は落ちて来るの1件だけで述べられています。103作品でも、上るは行く19・来る18と割れ、落ちるは来る14・行く4と来るに偏ります。下りるは行く19・来る9です。- 作品ごとの件数:一致がある作品は98で、最も多い「素戔嗚尊」の45件から1件の作品まであります。61作品は5件以下です。件数は作品の長さに依存するため、作品どうしの比較には第4回の動詞1万語あたりの割合を使います。
- 件数と移動の違い:「杜子春」の三つの語彙素の一致6件のうち、
竹杖が一本落ちていると畜生道に落ちているは状態を表し、移動ではありません。下りるは同じ作品の中で下りて来ると下りて行きましたの両方で現れるため、視点は作品ごとではなく箇所ごとに判断します。
終了時のメモ
次の五つを記録してください。第4回では同じclass3.lxを他の作家の準備済みコーパスにも使うため、class3-preparedフォルダーとsummary.txtは作業フォルダーに残してください。
| 記録する項目 | 内容 |
|---|---|
| 修正したパターン | class3.lxで変えた集合と、その理由(5節) |
| 見落とした語彙素 | 文字列検索が見落とした移動の語彙素を一つ(5節) |
| 判断の手がかり | 判断の手がかりになった語形を一つ(6節) |
| 辞書による違い | 別の解析器で変わった語彙素を一つ(4節) |
| 出力の限界 | 出力だけでは言えないことを一つ(8節) |
宿題:見つけた三つの箇所をCSVの8–10行目として記録する
所要時間は20–30分です。第2回のワークシートは7行から増やせないため、三つの箇所はワークシートではなくCSVに書きます。この3行を含む記録に、第4回では11–12行目を追加します。第5回の根拠の課題でも、この記録を使います。
- ワークシート7行のラベル例(CSV)を作業フォルダーに保存し、プレーンテキストのエディターで開いてください。
- 5節で見つけた移動の語彙素から一つ、6節の一致から一つ、7節または8節の一致から一つ選び、それぞれの箇所を含む段落全体を読んでください。8節の箇所は、
partに作品名を書いてください。 - 三つの箇所を8–10行目として、同じ列で追加し、下の表の値を入れてください。
- 各行に使ったコーパス、パターン、件数をメモに残してください。CSV、保存したワークシートのファイル
dh-b-movement.json(第2回を欠席した場合は不要)、メモを第4回の前までに、提出の表の提出先に提出してください。第4回では、提出ページで2–7行目の分類を比較します。
| 列 | 値 |
|---|---|
id・part・expression |
行番号、部または作品名、本文の表現 |
actor |
移動する主体。決められなければ空欄 |
direction |
up・down・other。保留はunresolved |
perspective |
narrator |
factuality |
CT+・CT-・Uu。保留は空欄 |
annotation_status |
labelled。保留はdeferred |
分類の早見表:列の意味と判断の基準。