LoginSignup
5
0

More than 3 years have passed since last update.

MATLABでMeCabの品詞細分類を活用する:その2

Last updated at Posted at 2020-04-14

はじめに

在宅勤務で通勤時間の分だけ時間があるせいか,MATLAB遊びに費やす時間が増大している今日この頃です.
さて,以前の記事,MATLABでMeCabの品詞細分類を活用するではmecabOptionsPOSExtractorオプションを使いましたが,もっと簡単で効果的な方法が見つかったのでご紹介します.それは,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'という列をつくるとかするとよさそうです.

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0