2014/12/01
[v5] Auto-Generated Example-Driven Parsing について
はじめに
この記事はPowerShell Advent Calendar 2014の1日目の記事です。
次期バージョンのPowerShell 5.0について、そろそろ情報が出回ってきました。現在のところWindows Management Framework 5.0 Preview November 2014、もしくはWindows 10 Technical PreviewやWindows Server Technical Previewに同梱のもので試すことができます。
v5での新機能、改善点は多岐に上ります。OneGet / PowerShellGet / クラス定義 / DSC機能増強 / ODataエンドポイントのコマンドレット化 / zipファイル / シンボリックリンク 等々。詳しくは、リリースノートが一番充実しているかと思います。日本語だとぎたぱそ氏の記事がまとまっているかと思ます。
さて、ここまで挙げた新機能や改善点は、とても順当でまっとうな進化点なのですが、v5にはちょっと異彩を放つ新機能がしれっと追加されています。それが、Auto-Generated Example-Driven Parsing です。
Auto-Generated Example-Driven Parsing とは
CSV、JSON、XMLのような既知のフォーマットではないが、何らかの法則性のあるテキストデータがあるとします。そんなテキストデータは(不幸なことに)割と世の中にあふれていますが、そのままでは(人が読む以外には)利用できないので、データとして扱うには、解析し、レコード(プロパティ:プロパティ値)として再構築する必要があります。
しかしながらフォーマットが既知のものではないため、既存のパーサーを使って解析することはできません。
従来のアプローチだと、このようなデータに対しては、まずユーザー(人間)がデータの法則性を読み取り、その法則をコンピュータに分かる表現(コードや正規表現など)に変換してやる必要がありました。
Auto-Generated Example-Driven Parsing とは、事前にユーザーがテキストデータの一部分のみを取り出し、各項目に対してプロパティ名を指示したデータ(テンプレート)を用意しておくと、元のテキストデータとユーザーが用意したテンプレートから法則性を解析し、元のテキストデータ全体を自動的にテキストデータからオブジェクトに変換してくれる機能です。
Auto-Generated Example-Driven Parsing とはもともとMicrosoft Research で研究されているFlashExtract というデータ解析手法の PowerShell コマンドレット(ConvertFrom-String)による実装になります。ConvertFrom-StringData じゃないですよ。全然別物です。これうっかりしてるとスルーしてしまいそうです。
具体例
たとえば、こんなデータがあったとします。
山内 佳乃 (やまうち よしの) 生年月日...1982/1/27 (32歳)、女性 田畑 真帆 (たばた まほ) 生年月日...1966/4/14 (48歳)、女性 三好 一樹 (みよし かずき) 生年月日...1972/7/10 (42歳)、男性 酒井 幸平 (さかい こうへい) 生年月日...1954/3/1 (60歳)、男性 藤島 恵子 (ふじしま けいこ) 生年月日...1969/5/4 (45歳)、女性 加藤 美優 (かとう みゅう) 生年月日...1986/12/8 (27歳)、女性 金谷 康文 (かなや やすふみ) 生年月日...1983/10/7 (31歳)、男性 岸本 紗季 (きしもと さき) 生年月日...1984/5/16 (30歳)、女性 永野 ケンイチ (ながの けんいち) 生年月日...1961/7/8 (53歳)、男性 小関 三郎 (こぜき さぶろう) 生年月日...1975/1/22 (39歳)、男性 山岸 光 (やまぎし ひかる) 生年月日...1939/2/13 (75歳)、女性 黒谷 恵麻 (くろたに えま) 生年月日...1949/2/13 (65歳)、女性
名前や生年月日が書かれたデータで、一応、法則性はあるようです。が、これをまともにパースしようと思うと、2行ごとに切り出して、正規表現を書いて…と、ちょっと面倒ですね。
ちなみにこのダミーデータ作成にはなんちゃって個人情報を使わせていただきました。CSVで出力した後、以下のようなスクリプトでわざわざ醜く変形しました。
Import-Csv -Encoding Default -Path dummy.cgi|%{"$($_.名前) ($($_.ふりがな))`n生年月日...$($_.誕生日) ($($_.年齢)歳)、$($_.性別)性"}|set-content -Encoding UTF8 -Path dummy.txt
さて、このテキストデータに対し、Auto-Generated Example-Driven Parsingで用いるテンプレートを書いてやりましょう。たとえば、以下のように適当に3件(ここでは3~5個目のレコード)抜き出して、プロパティ名をつけてやります。赤字が、手動で元データに付与した文字列です。
{Name*:三好 一樹} ({Furigana:みよし かずき}) 生年月日...{BirthDay:1972/7/10} ({Age:42}歳)、{Sexuality:男}性 {Name*:酒井 幸平} ({Furigana:さかい こうへい}) 生年月日...{BirthDay:1954/3/1} ({Age:60}歳)、{Sexuality:男}性 {Name*:藤島 恵子} ({Furigana:ふじしま けいこ}) 生年月日...{BirthDay:1969/5/4} ({Age:45}歳)、{Sexuality:女}性
みて頂ければ分かると思いますが、基本は、各データ項目に対して、{プロパティ名:データ}のように指定してやるだけです。主キーとなるデータ項目にはプロパティ名の後に「*」をつけてやります。こうやって作ったテンプレートをtemplate.txtと名前を付けて保存しましょう。
元データとテンプレートが揃ったので、あとは以下のようにしてConvertFrom-Stringコマンドレットを実行するだけです。
テンプレートを元に、元テキストに含まれるすべてのデータが、プロパティ値を持ったオブジェクトデータに変換されていることが分かるかと思います。これちょっとすごくないですか?
まとめ
Auto-Generated Example-Driven Parsingは個人的には、非常に面白い機能だと感じています。コンピュータに対して、「手本見せるよ、これはこう、これはこう。わかった? じゃ、あとは同じようにまとめといてね!」というのができるようになったわけで、ちょっと未来を感じました。
研究所レベルの研究成果を、製品として実装した初の例が、PowerShellだったというのも面白味を感じます。
ただ、CSVでもJSONでもXMLでもない、わけのわからない謎フォーマットで保存されたテキストデータを解析しなきゃならない事態というのは、そもそも不幸な状況であることも、また事実かと思います。
ConvertFrom-Stringは、そんな訳の分からないものを撲滅して、今度こそまともなフォーマットのデータに変換して保存するための、最終兵器のようなものかもしれません。
なお、Auto-Generated Example-Driven Parsingでは他にもプロパティに型を指定したり、部分的に正規表現を用いたり、階層構造を持つデータにも対応してたりと、かなり色々なことができるようになっています。ぜひ、v5環境を整えて、ConvertFrom-Stringを試してみてください。
さてさて、PowerShell Advent Calendar 2014、今年は参加者が少なく、完走はかなり危ぶまれますが、できるところまで行きたいですね! これをお読みのあなたの記事が読みたいです! ぜひ、ご参加いただけると幸いです。
プライバシーポリシー