日本語テキスト処理のためのPC基礎講座

〜言語処理やプログラミング以前の基礎知識


2018/07/10 関係データベースとSQL(2)

BCCWJデータ

use chunagon_bccwj

関数のいろいろ

組み込み関数

ユーザー定義関数

  • KWIC生成
    • fn前文脈(サンプルID,出現書字形開始位置,長さ)
    • fn後文脈(サンプルID,出現書字形開始位置,長さ)
select top 100 dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20) from 短単位
select top 100 サンプルID,dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20),語彙素,語彙素読み,品詞 from 短単位
where 語彙素 like '鰻'

コーパスデータを使った実習

補足

  • select * from でテーブルの全ての列をもってくる
  • select count(*) as 名前 from のように名前を付けられる

(復習)表の結合

 select 作品名, count(*) as 総語数
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
 where S.サブコーパス名 like '平安'
 group by 作品名

CASE式

  • CASE WHEN ● THEN ○○ WHEN ■ THEN □□ ELSE △ END
 select 作品名, count(*) as 総語数,sum(CASE WHEN 本文種別='歌' THEN 1 ELSE 0 END) as 歌語数
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
 where S.サブコーパス名 like '平安'
 group by 作品名

辞書の階層化された見出し表を扱う

use unidicSQL
  • 語彙素
    • 語形
      • 書字形
  • 語彙素を出力
    select * from 短単位語彙素 where 語彙素 like '夏%' and 語彙素読み like 'ナツ%'
  • 語彙素の全ての語形,入力活用型を出力
    SELECT 語形,入力活用型 from 短単位語形 as F inner join 短単位語彙素 as L on L.語彙素ID=F.語彙素ID 
    where 語彙素 like '見る' and 語彙素読み like 'ミル'
  • 語彙素の全ての書字形を出力
    SELECT 語形,書字形 from 短単位書字形 as O inner join 短単位語形 as F on F.語形ID=O.語形ID inner join 短単位語彙素 as L on L.語彙素ID=F.語彙素ID 
    where 語彙素 like '見る' and 語彙素読み like 'ミル'

コーパスと辞書を繋ぐ

  • 語彙素ID, 語形ID, 書字形ID
select L.語彙素,SUW.レジスター,count(SUW.キー) from 短単位語彙素 as L inner join chunagon_bccwj.dbo.短単位 as SUW on L.語彙素ID=SUW.語彙素ID
where L.語彙素 like '夏%' and L.語彙素読み like 'ナツ%'
group by L.語彙素, SUW.レジスター

表の結合(復習)

  • 内部結合 INNER JOIN
  • 外部結合 LEFT (OUTER) JOIN
  • 上と同じものを外部結合
    select L.語彙素,SUW.レジスター,count(SUW.キー) from 短単位語彙素 as L left join chunagon_bccwj.dbo.短単位 as SUW on L.語彙素ID=SUW.語彙素ID
    where L.語彙素 like '夏%' and L.語彙素読み like 'ナツ%'
    group by L.語彙素, SUW.レジスター

連続する語の取り出し

  • 同一の表を一語ずつずらしながら結合する(前方後方共起による検索条件指定ができる)
    select top 100 s1.語彙素,s1.語彙素読み,s1.品詞,dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,20)
    from 短単位 as s1 inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
    where s2.語彙素 like '鰻'
  • N-gram
    select top 100
    s1.キー+s2.キー+s3.キー+s4.キー+s5.キー+s6.キー,
    s1.語彙素+'/'+s2.語彙素+'/'+s3.語彙素+'/'+s4.語彙素+'/'+s5.語彙素+'/'+s6.語彙素
    from 短単位 as s1
     inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
     inner join 短単位 as s3 on s2.サンプルID=s3.サンプルID and s2.連番 + 10 = s3.連番
     inner join 短単位 as s4 on s3.サンプルID=s4.サンプルID and s3.連番 + 10 = s4.連番
     inner join 短単位 as s5 on s4.サンプルID=s5.サンプルID and s4.連番 + 10 = s5.連番
     inner join 短単位 as s6 on s5.サンプルID=s6.サンプルID and s5.連番 + 10 = s6.連番
    where s1.サブコーパス名='平安' 
    order by s1.サンプルID, s1.連番

サブクエリ

括弧でくくったSELECT文に名前を付けて、あたかもテーブルであるかのように扱える

  • 異なり語数
    select x.サブコーパス名, count(*) from
     (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '記号%'
      group by 語彙素ID,サブコーパス名) as x
    group by x.サブコーパス名
  • TTR(Type Token Ratio)
    use chunagon
    select x.サブコーパス名, count(*) as 異なり語数, sum(語数) as 延べ語数, 
    CONVERT(float,count(*))/sum(語数) as TTR from
     (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '記号%'
      group by 語彙素ID,サブコーパス名) as x
    group by x.サブコーパス名

一時テーブルの作成

#で始まるテーブル名は、DB切断後削除される一時テーブルとなる。現在の権限でも一時テーブルは作成できる。

  • SELECT カラム INTO 新しい書き込み先のテーブル FROM テーブル WHERE条件句
select * into 鰻テーブル from 短単位 where 語彙素='鰻'
  • CREATE TABLE テーブル名 ( 列名 データ型 , 列名2 データ型 )
create table #ogiso_tmp ( ID int ,調査語彙素 varchar(10) ,調査語彙素読み varchar(10) )

受講者アンケート

2018/07/03 関係データベースとSQL(1)

  • 当面、既存のデータベースを使うことだけを説明します

関係データベース(リレーショナルデータベース:RDB)

  • あらゆるデータを表の組み合わせで表現する
  • データを取り出すのが速い、データが壊れない、同時に処理できる

準備

  • データベースアカウント(配付資料)
    • 参照権限のみ

用語

  • 表(テーブル)
    • 列(カラム)
    • レコード(行)
テーブル
列名1列名2列名3
レコード1
レコード2
  • クエリ(問い合わせ):データベースに対するさまざまな処理コマンド
  • ビュー:(複数の)表の列を組み合わせて作る仮想的な表

SQL

データベース問い合わせ言語

SELECT文

とりあえずこれだけ!覚える

  • データベースからデータを選択して出力するコマンド
  • SELECT 列名,列名2... FROM テーブル
    • 短単位表から語彙素,語彙素読みの列を(全部)出力
      SELECT 語彙素,語彙素読み FROM 短単位
    • 短単位表から語彙素,語彙素読みの列を最初の100行出力
      SELECT TOP 100 語彙素,語彙素読み FROM 短単位
  • WHERE条件句
    • SELECT 列名,列名2... FROM テーブル WHERE 列名='hoge'
      • 短単位表から品詞が接続詞であるものの語彙素,語彙素読みの列を出力
        SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞'
  • LIKE 演算子とワイルドカード
    • "LIKE"は"="のようなものだが、ワイルドカードを含む完全一致でない場合に使う
      • %:任意の文字列(文字なしでも可)
      • _:任意の一文字
  • 短単位表から品詞が形容詞ではじまるものの語彙素,語彙素読みの列を出力
    SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞 LIKE '形容詞%'
  • 短単位表から品詞が接続詞で語彙素読みがカ行で始まるものの語彙素,語彙素読みの列を出力
    SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞 LIKE '形容詞%' AND 語彙素読み LIKE '[カ-コ]%'
  • ORDER BY 句(並べ替え)
    • ORDER BY 列名 (DESC)
      • 短単位表から品詞が接続詞であるものの語彙素,語彙素読みの列を語彙素読み順に出力
        SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' ORDER BY 語彙素読み

集計

  • グループ化 GROUP BY
    • SELECT 列名,列名2... FROM テーブル GROUP BY 列名
      • 短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列を出力
        SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み
  • count 集計関数
    • 集計した数を返す
      • 短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を出力
        SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み
      • 短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を語彙素読み(アイウエオ)順で出力
        SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY 語彙素読み
      • 短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を語数の多い順で出力
        SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY count(語彙素) DESC

SQLの書式など(SQL Server)

  • コマンドと記号は全て半角
  • コマンドは大文字小文字の区別は(原則として)ない
  • コマンドの切れ目のスペースやタブは余計に入っていて、改行を入れてもいい
  • 文字列を値として指定するときは'値'のようにシングルクオーテーションで囲む
    • 値として'を入れたいときは''としてエスケープ
  • --でコメントアウト(実行対象外になる)。行の途中からでも可
    • /* 〜 */ で複数行コメントアウト

表の結合

  • 内部結合 INNER JOIN
  • 外部結合 LEFT (OUTER) JOIN

2018/06/26 コマンドラインツール

GUIとCUI

  • コマンドプロンプト(cmd.exe) / Windowsの標準CLI
  • Bash / Linuxで広く使われているCLIシェル

Bash on Ubuntu on Windows

ディレクトリとファイル操作

  • ls (dir) ファイル一覧
  • cd ディレクトリ移動 (..で一つ上、Linuxは/、Windowsは\で階層を区切る)
  • cp (copy) ファイルコピー
  • rm (del) ファイル削除
  • mv (move) ファイル移動
  • rename (ren / rename) ファイル名変更
  • mkdir (同じ) ディレクトリ作成
  • rmdir (同じ) ディレクトリ削除
  • less (more) ファイル表示(ページャー) qで終了

※括弧内はwindowsの同等コマンド。オプションや挙動は異なる

覚えておくべきこと

  • 使い方は ls --help ( dir /?) などとすれば表示される
  • 過去に実行したコマンドは↑ででてくる
  • Windowsで扱うテキストはShiftJISに、Linuxで扱うときはUTF-8に統一しておくのが無難
  • Windowsは通常大文字小文字を区別しないが、Linuxでは区別される (case sensitive)

練習

  1. 上記のデータを使って国旗のファイル名を日本語名に変更したものを作成しなさい
  2. 「FIFA2018WC」ディレクトリを作成してワールドカップ出場国の国旗だけをコピーしなさい

主なテキスト処理ツール(Linux)

  • head ファイルの頭を表示
  • tail ファイルの尻尾を表示
  • grep あのgrep
  • wc 文字(行)カウント
  • cat ファイルを縦に結合
  • join ファイルを横に結合
  • sort 並べ替え
  • uniq 重複排除
  • diff 差分
  • iconv 文字コード変換
    • nkf

入出力とパイプ

  • < ファイルから入力
  • > ファイルに出力
  • >> ファイルに追記

バッチ処理

  • シェルスクリプト(バッチファイル)
    • .sh (.bat)

XMLツール

  • xmllint (libxml2)
    • XML文書の検証、XPath検索
  • xsltproc
    • XSLT

apt-get でインストールできる

sudo apt-get install libxml2

形態素解析(mecab)

  • mecabのインストール
    sudo apt-get install mecab
  • mecab-ipadic-utf8(UTF8版mecab用ipadic)のインストール
    sudo apt-get install mecab-ipadic-utf8
mecab file | less
mecab file > 保存先ファイル
  • unidicは別途ダウンロードしてしかるべき場所に置いて、解析時に辞書指定
mecab -d unidicディレクトリ file | less

※前回補足:サクラエディタでの複数行にまたがる置換

→できない

2018/05/29 XML

  • XML Extensible Markup Language(拡張可能なマーク付け言語)

マークアップ言語とXML

  • HTMLとXML
    • HTML 言わずと知れたWebページ記述言語
    • XHTML XML化したHTML
    • SGML HTMLのもと、XMLの先祖
  • HTMLとXMLの違い
    • HTMLは使えるタグやその意味(タグセット)があらかじめW3Cによって規定されているのに対し、XMLはタグの作り方・使い方などが定義されているだけで利用者が自分でタグセットを決めて使える
    • 業界団体などであらかじめタグセットを規定したものもあり、それに則ってつかう方法も MusicXML, MathML, 防災情報XML (東京都の天気)etc.
    • 人間にも機械にも可読なデータを目指す
  • (参考)HTMLの構造と見た目の分離
    • XHTMLは文書の構造(意味)記述に。見た目(スタイル)はCSSで。
    • CSSはXMLのスタイル記述にも使われる
  • (参考)軽量マークアップ言語 人間が直接記述するのがたいへんなので、簡単な入力形式を変換
  • 青空文庫形式

XMLの基本

  • タグ、要素、属性、属性値
    • 開始タグ <tag>、終了タグ </tag>
    • <タグ名 属性="属性値">テキスト<子要素/></タグ名> 例:
      <info date="2018/05/30">
      <weather>くもりのち雨</weather>
      <img>http://www.drk7.jp/MT/images/MTWeather/214.gif</img>
      <weather_detail>東の風 のち 北東の風 くもり 昼前 から 雨</weather_detail>
      <wave>波 1.5メートル のち 2メートル</wave>
      <temperature unit="摂氏">
      <range centigrade="max">23</range>
      <range centigrade="min">19</range>
      </temperature>
      <rainfallchance unit="%">
      <period hour="00-06">20</period>
      <period hour="06-12">50</period>
      <period hour="12-18">70</period>
      <period hour="18-24">70</period>
      </rainfallchance>
      </info>
  • 空要素
    • <br/>と<br></br>はXMLとして等価
      • テキストデータとしてももちろん別のものだが、XMLを解釈するXMLアプリケーションに於いては完全に同じものとして扱われる
  • ルート要素
    • XML宣言
      <?xml version="1.0" encoding="Shift_JIS" ?>
    • encoding宣言
    • XML宣言の省略
      • UTF-8, UTF-16で書かれている場合はXML宣言を省略できる
&lt;, &gt;, &amp;
  • XMLのタグ等の記述に必要となる記号(<>&)のエスケープシーケンス
&#x66fd;	&#127866;
  • 文字をunicodeの文字コード番号で参照できる(曽・🍺) &#xは16進数記述

(演習)テキストファイルをXML文書にしてみる

XPath

  • ノード(node)と軸(Axis)
    • 省略記法
  • 述語(predicate)

XSLT

XMLの文書型定義と検証

  • XML文書の検証(validation)
  • Well-formed(整形式)
  • Valid(妥当)
    • DTD
    • XMLスキーマ(xsd)
    • RELAX NG

Oxygen

  • XPathによる検索*2
  • スキーマの自動生成

2018/05/08 Excel

基本

  • テキストデータとExcel
    • TXT, CSV, TSV
    • xls, xlsx
  • 並べ替えとフィルタ
    • 並べ替え(sort)
    • テキストフィルタ(≒grep)
    • 重複の削除(uniq)

ピボットテーブル

  • BCCWJ中納言を例に
    • サンプルデータ

文字列関数

VLOOKUP

ネ申Excel問題

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

準備

サンプルデータ

下記のデータ(青空文庫の夏目漱石作品を整形したもの)をダウンロードし、デスクトップに展開(解凍)してください。「なつめそうせき(夏目漱石)」というフォルダができます。

エディタ

正規表現対応のテキストエディタがない人は下記からサクラエディタ(V2)をインストールしてください。

なぜテキストデータか

テキストエディタの基本

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

利用例

  1. 動詞「日本語」の用例をgrep
  2. grep結果を置換して表形式にする

正規表現

  • 特殊な記号文字(メタ文字)を使って文字列のパターンを表現する
    • 特殊な記号文字はすべて半角
  • エディタでは置換・検索・grepで利用できる(エディタ以外にもさまざまなアプリケ−ションやコンピュータ言語で利用されている)
    • 正規表現を使った置換により、プログラミングなしでもかなりの程度まで、テキストの整形・形式変換・データ抽出・チェックなどができる

基本的な正規表現

  • 授業資料/正規表現
    • 文字クラス [ ]
    • 文字クラスの否定(補集合)[^ ]
    • 繰り返し(最長一致) ? + * ※
    • 繰り返し最短一致 +? *? ※
    • n回以上m回以下のくり返し {n,m} ※
    • グループ化 ()
    • OR(論理和) |
    • 文頭 ^、文末 $
  • 改行\n・タブ文字\tとエスケープシーケンス\

タグ付き正規表現

走[らりるれろ] でgrepした結果を置換するにはどうしたらいいか

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

最長一致の原則(greedy matching)

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

課題

(検索・置換)

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

(正規表現)

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

(正規表現によるテキスト整形)

次のデータ(「こころ」Wordファイル)をダウンロードして下記の課題を行え。

ただし、データ中に現れる記号は下記のようになっている(青空文庫形式)。

《》:ルビ
(例)私《わたくし》は

|:ルビの付く文字列の始まりを特定する記号
(例)先生一人|麦藁帽《むぎわらぼう》を 

[#]:入力者注 主に外字の説明や、傍点の位置の指定
   (数字は、JIS X 0213の面区点番号、または底本のページと行数)
(例)※[#「てへん+劣」、第3水準1-84-77]
  1. 注と振り仮名を削除し1文1行となる形式のテキストファイルを作成せよ。
  2. 注を削除し、振り仮名を本文と入れ換えたテキストファイルを作成せよ。(例:「私《わたくし》は」→「わたくしは」)
  3. 1.で作成したデータから、次のような「それぎり」「それきり」のKWIC用例集のExcelデータを作成せよ。
    kokoro.txt225先生もそれぎり何ともいわなくなった。
    kokoro.txt244私もその話はそれぎりにして切り上げた。

見た目と論理構造の話

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

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

ちゃんとしたデータを作るために

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

関連キーワード・リンク集


*1 Wikipediaのことではない。Wikipediaがこの形式を採用している
*2 なぜかXPath2.0を選ばないと検索結果が返らなかった

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS