*日本語テキスト処理のためのPC基礎講座
~言語処理やプログラミング以前の基礎知識

*2018/04/17 テキストエディタと正規表現

**準備
***サンプルデータ
下記のデータ(青空文庫の夏目漱石作品を整形したもの)をダウンロードし、デスクトップに展開(解凍)してください。「なつめそうせき(夏目漱石)」というフォルダができます。
-[[soseki2.zip>https://www.dropbox.com/s/gw1j25svf2s9tki/soseki2.zip?dl=1]]

***エディタ
正規表現対応のテキストエディタがない人は下記からサクラエディタ(V2)をインストールしてください。
-http://sakura-editor.sourceforge.net/download.html

**なぜテキストデータか
-[[授業資料/テキストデータとは]]
-[[授業資料/テキストエディタ]]

**[[テキストエディタ>https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF]]の基本

-検索・置換、grep・タグジャンプ
--検索で初出行を調べる
---論理行番号
---次を検索/前を検索
--置換で用例数を数える
---元に戻す・やり直し
--grepで用例リストを作る
--タグジャンプで文脈を確認する
--フォルダ内のgrep

-ショートカットキー
--[[ショートカットキー>授業資料/覚えておきたいショートカットキー]]

***利用例
+動詞「日本語」の用例をgrep
+grep結果を置換して表形式にする
--CSVファイル


**[[正規表現>https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE]]
-特殊な記号文字(メタ文字)を使って文字列のパターンを表現する
--特殊な記号文字はすべて半角
-エディタでは置換・検索・grepで利用できる(エディタ以外にもさまざまなアプリケ-ションやコンピュータ言語で利用されている)
--正規表現を使った置換により、プログラミングなしでもかなりの程度まで、テキストの整形・形式変換・データ抽出・チェックなどができる

***基本的な正規表現
-[[授業資料/正規表現]]
--文字クラス [ ]
--文字クラスの否定(補集合)[^ ]
--繰り返し(最長一致) ? + * ※
--繰り返し最短一致 +? *? ※
--n回以上m回以下のくり返し {n,m} ※
--グループ化  ()
--or(論理和)  |
--文頭 ^、文末 $

--改行\n・タブ文字\tとエスケープシーケンス\


***タグ付き正規表現
走[らりるれろ] でgrepした結果を置換するにはどうしたらいいか

-[[タグ付き正規表現>授業資料/タグつき正規表現]]
--カッコ(半角丸カッコ)と\1(\2,\3…)を使う
---タグ付けへの応用例 (「.+?」) ->  <quote>\1</quote> ※
--後方参照
---マッチした部分を検索語の中で再利用する 例: (..)\1

-参考:[[授業資料/grepと置換でKWICを作る]]

***最長一致の原則(greedy matching)
-正規表現は通常、パターンが一致する最も長い範囲にマッチする
--例:''あ+'' → ''【\1】''
---ああああああああ → 【ああああああああ】
そのせいで…
--例:''「(.+)」'' → ''【\1】''
---「こんにちは」「さようなら」 → 【こんにちは」「さようなら】
--括弧の組ごとに置換するためには''「([^」]+)」'' → ''【\1】'' のように書かなければならない
---「こんにちは」「さようなら」 → 【こんにちは】【さようなら】
-よりかんたんに指定するには(最短一致,ものぐさ指定)
--''「(.+?)」「(.*?)」''のように、繰り返し指定の+*の後に「?」をつける

**課題

**(検索・置換)
+夏目漱石『坊ちゃん』における「山嵐」の初出行は何行目か。
+夏目漱石『坊ちゃん』における「赤シャツ」の用例数は何例か。
+サンプルデータ(夏目漱石の青空文庫全作品)における「言葉」の用例数は何例か。

**(正規表現)
+次の語を検索する場合に用いる検索文字列をできるだけ簡潔な正規表現で記しなさい。
++形容詞「暗い」(ただし、漢字「暗」で表記されるもの)
++動詞「蹴る」(漢字「蹴」またはひらがなで表記されるもの)
++「言葉」が2回出てくる行
++「「」で始まり、「」」が現れない行
++「○る○る」(「ぐるぐる」など)
+次の問いに答えよ。
++サンプルデータ(夏目漱石の青空文庫全作品)における動詞「笑う」および名詞「笑い」の用例数は計何例か
++サンプルデータ(夏目漱石の青空文庫全作品)における形容詞「赤い」の用例数は何例か

**(正規表現によるテキスト整形)
次のデータ(「こころ」Wordファイル)をダウンロードして下記の課題を行え。
-https://www.dropbox.com/s/3y58lkhpgfy06ow/kokoro.docx?dl=1
ただし、データ中に現れる記号は下記のようになっている(青空文庫形式)。

 《》:ルビ
 (例)私《わたくし》は
 
 |:ルビの付く文字列の始まりを特定する記号
 (例)先生一人|麦藁帽《むぎわらぼう》を 
 
 [#]:入力者注 主に外字の説明や、傍点の位置の指定
    (数字は、JIS X 0213の面区点番号、または底本のページと行数)
 (例)※[#「てへん+劣」、第3水準1-84-77]

+注と振り仮名を削除し1文1行となる形式のテキストファイルを作成せよ。
+注を削除し、振り仮名を本文と入れ換えたテキストファイルを作成せよ。(例:「私《わたくし》は」→「わたくしは」)
+1.で作成したデータから、次のような「それぎり」「それきり」のKWIC用例集のExcelデータを作成せよ。
,kokoro.txt,225,先生も,それぎり,何ともいわなくなった。
,kokoro.txt,244,私もその話は,それぎり,にして切り上げた。


***見た目と論理構造の話

***どっちが「きれいなデータ」だろうか?

 太陽コーパス              近代語    書き言葉
 日本語話し言葉コーパス     現代語        話し言葉
 現代日本語書き言葉均衡コーパス  現代語    話し言葉
 日本語歴史コーパス       古代~近代語 書き言葉

 太陽コーパス	近代語	書き言葉
 日本語話し言葉コーパス	現代語	話し言葉
 現代日本語書き言葉均衡コーパス	現代語	話し言葉
 日本語歴史コーパス	古代~近代語	書き言葉

***ちゃんとしたデータを作るために
-ちゃんとしたデータ=機械処理に適したデータとして大事なのは構造。見た目は気にしないで後回しでよい。後でどうにでもなる。
-テキスト、スプレッドシート(Excel)、一般の文書(Word)、マークアップ(XML)などのデータ設計あらゆることに共通した課題


***関連キーワード・リンク集
-[[テキストファイル>https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB]]
-拡張子 txt,csv,tsv,htm,xml

-[[文字コード>https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89]]=符号化文字集合
--[[テレタイプ>https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%AC%E3%82%BF%E3%82%A4%E3%83%97%E7%AB%AF%E6%9C%AB]]の話から
---[[制御記号>https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97]]
---[[改行コード>https://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89]] CR, LF, CRLF
--[[文字集合(character set)>https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E9%9B%86%E5%90%88]]
--[[符号化方式(character encoding)>https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F]]
--やや古いがよく使われる文字コード:[[Shift_JIS>https://ja.wikipedia.org/wiki/Shift_JIS]], [[CP932>https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932]], [[EUC-JP>https://ja.wikipedia.org/wiki/EUC-JP]]
--[[Unicode>https://ja.wikipedia.org/wiki/Unicode]]の符号化方式[[UTF-8>https://ja.wikipedia.org/wiki/UTF-8]], [[UTF-16>https://ja.wikipedia.org/wiki/UTF-16]] 
---(LE(Little Endian), BE(Big Endian))
---[[BOM(Byte Order Mark)>https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF]]
---[[BMP(基本多言語面)>https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2]]とサロゲートペア

--(参考) http://www.kanzaki.com/docs/jcode.html
--(参考) https://codezine.jp/article/detail/1592 ※

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS