iTAC_Technical_Documents

アイタックソリューションズ株式会社

ブログ名

【第8回】5W1H抽出AI Whatの抽出・その他の要素の抽出精度向上に向けて

Whatの抽出

まず、Whatとなるパターンは以下の二つの場合があると考えます。

1.「を」、「に」が後に続く場合
2. 引用のを表す「と」が後に続く場合

それぞれのパターンでの処理は次のようにします。

  • 1の場合
    Whoの時と同じように後ろから探索し、該当する助詞の場合はその前の要素を出力。
  • 2の場合
    後ろから探索して形態素解析した結果「引用」と判断されたものの場合は、その前の要素を出力。

コードは以下のようにしています。

python

##What## 
    if poss[num][2] == '引用': #続く助詞がWhatの後に続くものの場合、パターン2
        words.insert(num+1,'What)')
       
        while num>0:
            
            num -=1
            if (poss[num][0] =='名詞' and poss[num][1] != '非自立') or (poss[num][1] == '自立' and '連用' in poss[num][5] and poss[num][6] != 'する' and poss[num][6] != 'なる'):
                break
        
        words.insert(num,'(')
        
    for c in nani:
        if poss[num][0] == '助詞' and words[num] == c: #続く助詞がWhatの後に続くものの場合、パターン1
            words.insert(num+1,'What)')
            while num>0:
            
                num -= 1
                if (poss[num][0] =='名詞' and poss[num][1] != '非自立') or (poss[num][1] == '自立' and '連用' in poss[num][5] and poss[num][6] != 'する' and poss[num][6] != 'なる'):
                    break
        
            words.insert(num,'(')    
            num += 1
            
####

その他要素の抽出精度の向上に向けて

WhereやWhenの抽出が簡単なものは先に抽出

このようにすることで、後からWhoやWhatを抽出する際に誤認し難くなります。

コードは以下のようにしています。

python
##Where#
    if poss[num-1][2] == '地域' : #一つ先を探索
            words.insert(num,'Where)')
            words.insert(num-1,', (') 
            num -=1
####

##When##
    for c in itu1:
        if c in words[num-1]: #一つ先を探索
            words.insert(num,'When)')
            words.insert(num-1,', (')
            num -= 1
####

抽出した時に意味が通る様に前の要素まで抽出

具体的には、下記の対応をします。 - 「なる」「する」で切らない
- 非自立の品詞(「ん」「の」など)で切らない

コードは以下のようにしています。

python
if (poss[num][0] =='名詞' and poss[num][1] != '非自立') or (poss[num][1] == '自立' and '連用' in poss[num][5] and poss[num][6] != 'する' and poss[num][6] != 'なる'):

How要素抽出要素の追加

接尾語で、かつ基本形の場合のパターンを追加しました。

コードは以下のようにしています。

python
##How##    
    if poss[num][1] == '自立' and poss[num][5] == '基本形':
   
        words.insert(num+1,'How)')
        if poss[num][6] == 'する' or poss[num][6] == 'なる':
            num -= 1
                
        words.insert(num,', (') 
        
    if poss[num][1] == '接尾' and poss[num][5] == '基本形':
        
        words.insert(num+1,'How)')
        num -= 2
        words.insert(num,', (')      
            #print('{0} , How'.format(sw))
        
    if poss[num][0] == '助動詞' and poss[num][5] == '基本形':
        sw =[]
        words.insert(num+1,'How)')
        num -= 1
        while num > 0:
            
            if (poss[num][0] =='名詞' and poss[num][1] != '非自立') or (poss[num][1] == '自立' and '連用' in poss[num][5] and poss[num][6] != 'する' and poss[num][6] != 'なる'):
                break
            num -= 1
        
        if  words[num] == 'ん':
            while num>0:
                num -=1
                if (poss[num][0] =='名詞' and poss[num][1] != '非自立') or (poss[num][1] == '自立' and '連用' in poss[num][5] and poss[num][6] != 'する' and poss[num][6] != 'なる'):
                    break
                    
        words.insert(num,', (')

####

コードの実行結果

実行例1:
', (年末年始When)をふるさとなどで, (過ごすHow)人たちで各交通機関の, (混雑Who)が, (始まりましたHow)jr(各社にWhat), (よりますHow)と東海道新幹線の, (下りWho)は, (31日When)の, (午前中When)まで, (指定席Who)はほぼ, (満席ですHow), (東北Where), (上越Where), (北陸Where)などの, (新幹線Who)は, (明日When)が, (ピークですHow)上りの, (ピークWho)は, (東海道新幹線Who)が, (1月4日When)他の各, (新幹線Who)が, (1月3日When)と, (予想されていますHow)また, (空の便Who)は(羽田をWhat), (発着するHow)(便をWhat)(中心にWhat)日本航空全日空とも, (31日When)までほぼ, (満席だということですHow), (高速道路Who)は東名高速の下りできょう, (午前8時When)頃秦野中井インターチェンジ付近で最大30キロの, (渋滞Who)が, (予想されるなどしていますHow)上りの, (ピークWho)は, (1月3日When)で東名高速東北道関越道でそれぞれ35キロの, (渋滞Who)が, (予想されていますていますHow)

実行例2:
'影響バー, (箱根Where)の, (駅伝Who)が, (あるHow)ということで, (神奈川県Where)を(中心にWhat)(お天気を伺えればとWhat), (思いますHow), (日本Where), (付近はですHow)ねまぁ冬型の気圧配置ということでへ, (太平洋Where)がまあ(基本的にWhat), (晴れるHow)という, (天気なりやすいんですけれどもこのようにですHow)ね, (関東Where)付近の腫れの(報告をWhat)たくさん, (いただいていますHow)はいえーということでまぁ, (今日の天気When)ですけれどもおおむね晴れということででが(ifずではないとWhat), (言っていいですHow)ねハイター, (ただですHow)ね少し, (気温Who)が, (役になるといったところですHow)ねはい, (阿蘇はですHow)ねかなり, (冷え込んでいたんですHow)けど, (日中Who)はええまあ日差しもあって, (気温Who)が上がってきまして柔道超えて, (超えるHow)というところ多くなり, (そうですHow)ねはいoe,

実行例3
'きょうの(会見にWhat), ((合わせHow)たかのようにWhat), (宮迫さんWho)がユーチューバーとしてま, (ーデビューされましたHow)けれども, (それWho)はもう当然ご存知, (いらっしゃいますHow)よねはい(それについてはどんなふうにWhat), (思いますHow)か, (枠Who)はああっね, (見てないんですHow)よなぁはいもう, (会見があるから見ると聞かれるなっていうのWho)がやっぱり, (想像できるじゃないですHow)かで, (みたら応えないといけないHow)し(嘘をWhat), (つきたくないHow)んで, (ええHow)答えなきゃいけなくなることを, ((回避How)するためにWhat), (皆さんには申し訳ないですけど見ないHow)という手段, (僕Who)は, (とりましたHow)できっと(量産もそうなんだろうなとWhat)思ったら, (量産Who)は, (見て出すみましたHow)ででも, (嘘つかないHow)から(成長したなとWhat), (思いましたHow), (動産Who)は, (みたんですHow), (見たんですHow)ねべたんで, (すみましたHow), (感想Who)は, (感想はですHow)ね各々やっぱり, ((スタートHow)するためにWhat)皆さんyoutube, (選んだHow)ということで小野(前にWhat)進んでいってるなという, (感じはしましたHow), (それぞれWho)がねそれぞれ進み, (方があるんだHow)なっていう, (僕Who)は見て, (ないんであの気Who)が武装と, (なんですHow)よね沿って, (ゲストなんですHow)ね, (終わりなんですかそうなんですHow)よすいませんそれであの宮迫さんもねやっぱり蛍原さんと一緒にえっあの隣でやっぱり, (一緒に並ぶことWho)がやっぱり目標じゃな, ((目標How)だというふうにWhat)おっしゃって, (なんですけれどもそうできないHow), (状況になってしまってるじゃないですHow)か'

今回分かった課題

実行例1のようなきちんとした文章であれば抽出精度は高いですが、話し言葉や音声が正しく認識されないと精度が下がってしまいます。
主に以下の場合の誤認識が目立ちました。

  • 終助詞「ない」の場合。
  • 「~する人」などの場合。連体形を区別する能力がMecabに無いため対応できていない。
  • 「いらっしゃいます」などの敬語の場合(実行例3参照)。
  • What要素の場合(実行例3参照)。
  • Why要素の場合。

この他にも改善するべき点がいくつかあるので、今後改善していきます。


次の記事へ

前の記事へ 戻る