ASA Scala
述語シソーラス(動詞,形容詞,形容動詞)に基づく意味役割と述語の概念フレームを自動で付与するシステムを作成したので公開します.プログラムはScalaで作成していますが,実行はjava vm上で動きます.前処理として,係り受け解析システムCabochaを必要とします.Linux上で開発していますが,cabochaが動けば windows上でも動作します.Perl版との大きな違いは「形容詞」「形容動詞」も解析することです.形容詞,形容動詞のときも,意味役割と概念フレームを出力します.
ASA Scala デモサイト
こちらで意味役割付与の解析を行うことができます.
ASAのscalaのsource
ソース(scalaと最新の述語項構造シソーラス(yml形式))はこちらです.ただ,ソースからのコンパイルは敷居が高いので下記のjarでの利用をお勧めします.
jarファイルによる ASA_Scalaの実行方法
ここから ASAの jarファイルを downloadします.環境に合わせてdownloadして下さい(2015/6)
$ java -jar ASA.jar
とすれば,標準入力から文を入力することが出来ます(utf-8の文字で入力して下さい)
オプション
(1) ファイル名を入れると標準入力ではなく,ファイルのテキストを解析します
java -jar ASA.jar test.txt
(2) XMLモード
-x と引数を付けると xmlで形式で表示されます.
java -jar ASA.jar -x
出力例は下記のような感じです.
$ java -jar ASA.jar -x input 今日,太郎は東京に行った <sent> <sentence>今日,太郎は東京に行った</sentence> <chunk id="0"> <surface>今日,</surface> <link>3</link> <type>elem</type> <noun_surface>今日</noun_surface> <category>時間</category> <part_surface> </part_surface> <semrole>場所(時)(点)</semrole> <morph id="0"> <surface>今日</surface> <read>キョウ</read> <base>今日</base> <pos>名詞,副詞可能</pos> <ctype></ctype> <cform></cform> <ne>B-DATE</ne> </morph> <morph id="1"> <surface>,</surface> <read>,</read> <base>,</base> <pos>記号,読点</pos> <ctype></ctype> <cform></cform> <ne>O</ne> </morph> </chunk> <chunk id="1"> <surface>太郎は</surface> <link>3</link> <type>elem</type> <noun_surface>太郎</noun_surface> <category>人</category> <part_surface> は </part_surface> <semrole>動作主</semrole> <similar>1.0</similar> <morph id="0"> <surface>太郎</surface> <read>タロウ</read> <base>太郎</base> <pos>名詞,固有名詞,人名,名</pos> <ctype></ctype> <cform></cform> <ne>B-PERSON</ne> </morph> <morph id="1"> <surface>は</surface> <read>ハ</read> <base>は</base> <pos>助詞,係助詞</pos> <ctype></ctype> <cform></cform> <ne>O</ne> </morph> </chunk> <chunk id="2"> <surface>東京に</surface> <link>3</link> <type>elem</type> <noun_surface>東京</noun_surface> <category>場所</category> <part_surface> に </part_surface> <semrole>着点</semrole> <similar>9.33985</similar> <sentelem>ADVERBIAL</sentelem> <morph id="0"> <surface>東京</surface> <read>トウキョウ</read> <base>東京</base> <pos>名詞,固有名詞,地域,一般</pos> <ctype></ctype> <cform></cform> <ne>B-LOCATION</ne> </morph> <morph id="1"> <surface>に</surface> <read>ニ</read> <base>に</base> <pos>助詞,格助詞,一般</pos> <ctype></ctype> <cform></cform> <ne>O</ne> </morph> </chunk> <chunk id="3"> <surface>行った</surface> <link>-1</link> <type>verb</type> <noun_surface>行く</noun_surface> <category>その他</category> <part_surface> </part_surface> <semantic>状態変化あり-位置変化-位置変化(物理)-着点への移動-</semantic> <similar>10.33985</similar> <voice>ACTIVE</voice> <mood>INDICATIVE</mood> <polarity>AFFIRMATIVE</polarity> <sentelem>PREDICATE</sentelem> <mod>0</mod> <mod>1</mod> <mod>2</mod> <morph id="0"> <surface>行っ</surface> <read>イッ</read> <base>行く</base> <pos>動詞,自立</pos> <ctype>連用タ接続</ctype> <cform>五段・カ行促音便</cform> <ne>O</ne> <cchart> <type>連用タ接続</type> <form>基本形,く,ク</form> <form>未然形,か,カ</form> <form>未然ウ接続,こ,コ</form> <form>連用形,き,キ</form> <form>連用タ接続,っ,ッ</form> <form>仮定形,け,ケ</form> <form>命令e,け,ケ</form> <form>仮定縮約1,きゃ,キャ</form> </cchart> </morph> <morph id="1"> <surface>た</surface> <read>タ</read> <base>た</base> <pos>助動詞</pos> <ctype>基本形</ctype> <cform>特殊・タ</cform> <ne>O</ne> <cchart> <type>基本形</type> <form>基本形,*,*</form> <form>未然形,ろ,ロ</form> <form>仮定形,ら,ラ</form> </cchart> </morph> </chunk> </sent>
このあとに,ファイル名をつければ,ファイルのテキストを解析します.
java -jar ASA.jar -x [ファイル名]
意味役割の体系などは新体系の述語シソーラスのページ(準備中)をご参照下さい.基本分類23種類,細分類73種類です
形容動詞の出力例
$ java -jar ASA.jar input 景色がとても綺麗だ sentence: 景色がとても綺麗だ ID: 0 景色が link: 2 type: elem main: 景色 part: が category: その他 semrole: 対象 score: 1.0 0 景色 ケシキ 景色 名詞,一般 O 1 が ガ が 助詞,格助詞,一般 O ID: 1 とても link: 2 type: elem main: とても sentelem: ADVERBIAL 0 とても トテモ とても 副詞,助詞類接続 O ID: 2 綺麗だ link: -1 type: adjective main: 綺麗だ score: 1.0 semantic: 状態変化なし(状態)-対象の性質-物理的状態-清/汚-清 frame: 0-対象 voice: ACTIVE tense: PAST sentelem: PREDICATE polarity: AFFIRMATIVE mood: INDICATIVE 0 綺麗 キレイ 綺麗 名詞,形容動詞語幹 O 1 だ ダ だ 助動詞 特殊・ダ 基本形 O
Scalaなどで内部のオブジェクトを使う(ASA20150617の方)
例えばScalaの場合,ASA.jarを読み込んでおいて,下記のようにすると,ASAを実行して,その内部情報を取り出すことが出来ます.内部情報に関するクラスの構造がわからないと取り出せないですが,ソースを見ればいろいろな型があることがわかります.
object MainA { def main(args: Array[String]): Unit = { val files = new cl.asa.init.YamlFile val dicts = new cl.asa.yaml.LoadYaml(files) val parser = new cl.asa.parse.Parse(dicts) val result = parser.parse("今日は扇風機を買いました") println(result.surface) //chunkごとの意味役割、または述語の概念フレームを取り出す例 for (chunk <- result.chunks){ chunk.ctype match{ case "elem" => println(chunk.surface+"\t role="+chunk.semrole) case _ => println(chunk.surface+"\t role="+chunk.semantic) } } //各形態素の情報を取り出す例 result.chunks.foreach(x => x.morphs.foreach(mr => println(" "+mr.surface+"\t pos="+mr.pos+"\t yomi="+mr.read) )) } }
この出力は
Scalaなどで内部のオブジェクトを使う
ASAの出力は上記のように多岐に渡ります.取り出すのが面倒ですね.Scalaの内部では Result型にChunk型として再帰的に構成されていて,Scalaからだと直接利用できます.
例えばScalaの場合,ASA.jarを読み込んでおいて,下記のようにすると,ASAを実行して,その内部情報を取り出すことが出来ます.内部情報に関するクラスの構造がわからないと取り出せないですが,ソースを見ればいろいろな型があることがわかります.
object MainA { def main(args: Array[String]): Unit = { val files = new cl.asa.init.YamlFile val dicts = new cl.asa.yaml.LoadYaml(files) val parser = new cl.asa.parse.Parse(dicts) val result = parser.parse("今日は扇風機を買いました") println(result.surface) //chunkごとの意味役割、または述語の概念フレームを取り出す例 for (chunk <- result.chunks){ chunk.ctype match{ case "elem" => println(chunk.surface+"\t role="+chunk.semrole) case _ => println(chunk.surface+"\t role="+chunk.semantic) } } //各形態素の情報を取り出す例 result.chunks.foreach(x => x.morphs.foreach(mr => println(" "+mr.surface+"\t pos="+mr.pos+"\t yomi="+mr.read) )) } }
この出力は
今日は扇風機を買いました 今日は role=場所(時)(点) 扇風機を role=対象 買いました role=状態変化あり-位置変化-位置変化(物理)(人物間)-他者からの所有物 の移動-購入 今日 pos=名詞,副詞可能 yomi=キョウ は pos=助詞,係助詞 yomi=ハ 扇風機 pos=名詞,一般 yomi=センプウキ を pos=助詞,格助詞,一般 yomi=ヲ 買い pos=動詞,自立 yomi=カイ まし pos=助動詞 yomi=マシ た pos=助動詞 yomi=タ
となります.chunkの意味役割や chunk内のheadの形態素,内容語,などASAで解析したモノがいろいろ取り出せます.
その他
Change log
2015-6-17
- Cabochaクラスを追加して,ASAを通して Cabochaの出力を単にResult型に変換するクラスを追加した
2015-6-10
- ソースをScala 2.11に対応.scala.reflect.BeanProperty をscala.beans.BeanPropertyに変更
- XMLが切り離されたのでそれに対応
2014-12-26
- Time-Pointなど付加詞でローマ字表記だったのを「場所(時)(点)」などに統一
- XML出力するようにした