はじめに
在宅勤務で通勤時間の分だけ時間があるせいか,MATLAB遊びに費やす時間が増大している今日この頃です.
さて,以前の記事,MATLABでMeCabの品詞細分類を活用するではmecabOptions
のPOSExtractor
オプションを使いましたが,もっと簡単で効果的な__方法が見つかったのでご紹介します.それは,mecabOptions
のオプションLemmaExtractor
を使う方法です.(前の記事を見て,試してみてくださった皆さん__ごめんなさい.こっちの方がはるかに簡単で便利です・・・)
#とにかくやってみよう
必要な呪文は1行だけ.
mecabOpt = mecabOptions("LemmaExtractor",@(~,info) info.Feature);
これだけです.では,これで何が起きるか見てみましょう.
>> str = "吾輩は猫である.名前はまだない";
>> tkns = tokenDetails(tokenizedDocument(str,'TokenizeMethod',mecabOpt));
>> tkns(:,{'Token','PartOfSpeech','Lemma'})
ans =
10×3 table
Token PartOfSpeech Lemma
______ ______________ ________________________________________________
"吾輩" pronoun "名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ"
"は" adposition "助詞,係助詞,*,*,*,*,は,ハ,ワ"
"猫" noun "名詞,一般,*,*,*,*,猫,ネコ,ネコ"
"で" auxiliary-verb "助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ"
"ある" auxiliary-verb "助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル"
"," symbol ""
"名前" noun "名詞,一般,*,*,*,*,名前,ナマエ,ナマエ"
"は" adposition "助詞,係助詞,*,*,*,*,は,ハ,ワ"
"まだ" adverb "副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ"
"ない" adjective "形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ"
tokenDetails
出力のLemma
(原形)の列が,MeCabの出力に置き換わっています.これでMeCabの品詞情報69種全てが活用できます.簡単ですね!自分としてはこのモードで使うのがデフォルトになりそうです.
からくり
何をしたかというと,MeCabの出力から「原形」を抜き出してLemma
に割り当てる関数(LemmaExtractor, デフォルトは textanalytics.ja.mecabToLemma
)を自前のものにして,MeCabの出力全体を返すようにしたのです.(↓↓↓自前の関数)
@(~,info) info.Feature
LemmaExtractorはMATLABのMeCabから2つの変数を受け取りますが,ここでは1つ目は使わずに,2つ目にわたされる構造体(info
)を受けとり,そのフィールドFeature
を返しています.フィールドFeature
にはMeCabの出力が文字配列として格納されているので,上に示したようにLemma
の列にMeCabの出力が現れるというわけです.
こうすると,元々Lemmaに割り当てられるべきだった情報がなくなってしまうように思えますが,実はそうではありません.デフォルトのLemmaExtractorは,フィールドFeature
の各文字列をカンマで分けて,前から7番目の文字列をLemmaとしているだけなので,必要な情報はしっかりと残っていることになります.
おわりに
この方法を使うと,tokenDetails
で得られるテーブルを少々加工するだけで,情報量が極めて豊富な形態素解析結果を出力することができますね.myTokenDetails
みないなWrapperを作って,'Lemma'の他にも'Rubi'とか'Phonetic'という列をつくるとかするとよさそうです.