144 Views
April 03, 24
スライド概要
[第6回大阪sas勉強会]森岡裕
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
Proc Spell スペルミスは何故か発生し, 何故か全員が見落とし, そして何故か致命傷になってしまう 第6回 大阪SAS勉強会 森岡 裕
くだらないミスほど,真に恐ろしい 難しい主解析のコードや,複雑なデータハンドリングは,一見危ない 箇所のように思われるが,実は最終的に問題になることは少ない. そこじゃない 悲劇はだいたい,脱力してしまうような,くだらないところで起きる
If XXCAT=‘HOSPITALZATION’ then XXXXXXX Where EPOCH=‘TREATMEMT’; × ‘HOSPITALZATION’ → 〇 ‘HOSPITALIZATION’ × ‘TREATMEMT’ 〇 ‘TREATMENT’ → プログラマが手打ちでミスったのか,仕様書コピペしたけど仕様書がミスってんのか, もっと,仕様書のもとになる前資料から間違ってたのか,そんなことは知らない どんなスペルも辿っていけば,結局誰かが手で打ち込んでるわけです そして,スペルミスするんです.だって,にんげんだもの
data test; treatment hospitalization accommodation committee finally forty forward immediately occurred hospitalization run; = = = = = = = = = = "treatmemt"; "hospitalzation"; "accomodation"; "comittee"; "finaly"; "fourty"; "foward"; "immediatly"; "ocurred"; "hospitalzation"; テキストファイル(SASプログラム)を食べ させると,辞書と照合して合致しない単語を アウトプットする filename target "xxxxxx\test.sas"; proc spell words=target; run; 度数(発生回数)と発生している行番号もでる
proc spell words=target suggest; run; suggestオプションをつけると,辞書 との一致度をみて,候補ワードを提 示してくれる.
辞書って? proc catalog catalog=sashelp.base ; contents; quit; マスター辞書 MASTER ……… ……… Proc catalogでその存在は確認できるが,特殊なタイプで保存されており,中身は多分みれない. MASTERだけ,特別な辞書で,NOMASTERオプションをつけない限り,絶対にこの辞書は照合に使用される ちなみに,既知の補助辞書という名前で NAMES=[一般的な英語のファーストネーム],CITIES=[アメリカ合衆国の都市型],CNTRIES=[国の名前], STATES=[州の名前,およびUnited States Post Office(FIPS)コードによって,識別されるものの名前] が入っているので利用可能.使ったことないけど
補助辞書の作成 filename target "xxxxxx\test2.sas"; proc spell words=target; run; 実務上,実際のSASプログラムを単純にproc spellにかけても,プログラマ名や一時変数,SAS関数, および臨床用語や統計用語など無害なものが大量にひっかかってしまい,見にくくてしょうがない.
補助辞書の作成 マスター辞書 MASTER ……… ……… 補助辞書1 (ユーザー作成辞書) XXX ……… ……… Spell Check!! 補助辞書2 (ユーザー作成辞書) XXX ……… ……… ユーザーが補助辞書を作成して,それをマスター辞書にたしてチェックできる
補助辞書の作成 filename learning " xxxxxx\追加.txt"; proc spell words = learning create dict = work.mycatalog.spell; run; work. mycatalog. spell すでに存在する辞書カタログに追加する場合は createの箇所をupdateに変える. createはすでに同名の辞書がある場合,リセットしてから作成してしまうので注意!! 作っていくことが多いので気を付けてね つぎ足しながら
補助辞書の使用 proc spell words=target dictionary = work.mycatalog.spell suggest verify ; run; work. mycatalog. spell マスター辞書 MASTER ←先ほど,でていた誤検知が全て消えている ・複数の補助辞書を使いたい場合はdictionary = (lib1.catalog.s1 lib1.catalog.s2 lib1.catalog.s3) のようにリスト形式で指定する ・補助辞書を利用する場合,verifyをつけないと余計なログがでる ・補助辞書だけでチェックを行いたい場合はNOMASTERといれればよい
実務で活用する上のヒント ・古いプロシジャのため,結果をデータセットにだしたり,html表示やEXCEL表示もできない. 結果を外部ファイル化するためにはproc printto を使う必要あり proc printto print=“xx\xxx.txt" new;run; proc spell …;run; proc printto;run; ・SASHELP.VFUNCなどにSAS関数の情報が全て入っているので,それを一度テキストに吐いて,補助辞 書に追加してやればよい.SDTM,ADaMで使用される変数名や, terminologyも食わしてやればよい ・補助辞書追加するときに,なぜか,全大文字,全小文字両方で登録してやった方がよいようです.片方 だけだと誤検知がおきます.一旦データセット化してupcaseとlowcaseで2obsずつ吐くように森岡はして ます ・補助辞書だけでチェックを行いたい場合はNOMASTERといれればよい
よりマニアックな話 ・まずproc spellは,読み込んだ文書を単語単位(ポテンシャルワード)に切り分けます ブランク,特殊記号,改行文字に先立つアルファベットを見つけ,ポテンシャルワード開始位置とします 特殊記号は,‘ , “ , ( , { ,[ ,< です 無効な文字列に到達した時点で,その直前の有効な文字までをポテンシャルワード終了位置とします ここでいう有効な文字とは ・すべてのアルファベット文字 ・のちにアルファベット文字が続いているハイフン ・のちにアルファベット文字が続いているアポストロフィ(または単引用符) つまりdosen’t copy-edit , xxyy’zz は3つのポテンシャルワードということになり “’embedded (nested) quotation ‘” は’embeddedとnestedとquotationという3つのポテンシャルワードとし て扱われます
よりマニアックなテクニック 複数形・ed・現在進行形 (ing) affair/s として,スラッシュsをつかって辞書登録すると ①affair ②affair の2ワードを登録したのと同義になる affect/* としてスラッシュ*をつかって辞書登録すると ①affect ②affects ③affected ④affecting の4ワードを登録したのと同義になる
最後に Proc spellは大昔,version6とかの時代にSASが買収したシステム会社が作っていたスペルチェックシステムをそのま ま,SASの基幹システムにぶち込んで誕生しました. しかし,SASとは毛色の違う独自の仕組みで動いていて,担当技術者も退職したため,その後のバージョンでSAS社 は,これ以上,改良することはないとし,リファレンスからも削除し,ノンサポート機能となりました. こういったプロシジャは多くあり,undocumented procedureと呼ばれています.改良・サポートはされないが,削 除もされず,もう何十年もたった9.4M6でも動きます.基本ライブラリに入っているので,SASシステムの根本的な バージョンアップ(ver10)になるまでは使えそうな気がします.10以降も,普通に動く可能性もあります しかしあくまで闇シージャなので,利用は自己責任で,あくまで補助チェック機能的に利用することをお勧めします けれでも,結構,これのおかげで個人的には救われているので,たかがスペルチェックと舐めずに使ってみると 色々と面白いものがみつかると思います