iTAC_Technical_Documents

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

ブログ名

【第7回】5W1H抽出AI Whenの抽出

出力形式の変更

前回までの出力の形式を変更し、入力の文に直接要素名を出力する様にしました。
これにより、誤認識などがわかりやすくなりました。

Whenの抽出

Whenとなる要素を二種類に分類しています。

Whenとなる要素の分類

以下の二種類を、それぞれ異なったアルゴリズムで抽出しています。
* 今日、明日など一語で時を表すもの
→あらかじめ入力しておいた「今日」や「明日」などのパターンと一致したら出力します。 * 日、時など数字と組み合わせて使うもの
→こちらもあらかじめパターンを入力しますが、「日本」のようにパターンが含まれるもののWhenにならない単語もあるため、同時に数字も含まれている場合のみ出力します。

※「明日は」などの場合は、後につながる助詞を手掛かりに抽出するWho要素に抽出される可能性があるため、その点も考慮しています。

入出力の結果

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

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

入力2:
カ)俺のこと避けてた?山)嫌いだよカ)マジか山)好きではないよwwwwwwwwww今日はですねというのも、なんと本日ごめんなさいいきなりブレブレですけどもカジサックというキャラを今日はちょっとこう…行ってきますねカ)そんなに!?カ)まあ我々キングコングがスピード出世みたいなことになったんですけどもカ)西野と僕でやったらカ)今たぶんテロップで出てると思うんですけどもえげつないよな山)東京出たピースだってそうだしカ)ノブシコブシもそうやし山)大阪でいうときんに君とかね カ)NON STYLE 山)ダイアンたくさんいますけどもカ)なるほどねあ、そうか。こんなんかんでちょっとこう上がったカ)ちょっとやってよこの話するの初めてなんやけどだけだとだから俺はできるだけ、山ちゃんもそうだったんだけどもこうこうこうでこうやからというのをしたいと思ってやってんねんけど頼むわ、俺こうしたいねんっていう話だったらじゃあ例えばカ)ありがとう

出力2:
'カ)俺のこと, (避けてた, How)?山), (嫌いだ, How)よカ)マジか山)好きでは, (ない, How)よwwwwwwwwww, (今日はです, How)ねというのも、なんと, (本日, When)ごめんなさいいきなり, (ブレブレです, How)けどもカジサックというキャラを, (今日, When)はちょっとこう…, (行ってきます, How)ねカ)そんなに!?カ)まあ我々, (キングコング, Who)がスピード出世みたいなことに, (なった, How)んです, How)けどもカ)西野と僕でやったらカ)今たぶんテロップで出てると, (思う, How)んです, How)けども, (えげつない, How)よな山)東京, (出た, How)ピースだってそうだしカ)ノブシコブシもそうやし山)大阪で, (いう, How)ときんに君とかね\u3000カ)NON STYLE\u3000山)ダイアンたくさん, (います, How)けどもカ)なるほどねあ、そうか。こんなんかんでちょっとこう, (上がった, How)カ)ちょっとやってよこの, (話する, How)の初めてなん, (やけどだけだ, How)とだから俺は, (できる, How)だけ、, (山ちゃんもそうだった, How)んだ, How)けどもこうこうこうでこうやからというのを, (したい, How)と思ってやってんねんけど, (頼む, How)わ、俺こうしたいねんっていう話だったらじゃあ例えばカ)ありがとう'

ruby:python
##Mecabで形態素解析後##

d = ['病院', '大学'] #Whereのパターン

dare = ['が','は'] #Whoの後に続く助詞
nani = ['を'] #Whatの後に続く助詞
naze =['ので','から']#Whyの後に続く接続助詞
suji = ['0','1','2','3','4','5','6','7','8','9']
itu1 = ['今日','昨日','明日','午前','午後','明後日','本日','年末'] #Whenのパターン1
itu2 = ['年','月','日'] #Whenのパターン2
words2 = []
poss2 = []
itu3 = ''.join(itu1)

num = len(words)-1
while num > -1:

##When##
    for c in itu1:
        if c in words[num]:
            words.insert(num+1,', When)')
            words.insert(num,', (')
            num -= 1


    for c in itu2:
        if (c in words[num]) and poss[num][1]=='固有名詞':
                for s in suji:
                    if s in words[num] :
                        words.insert(num+1,', When)')
                        words.insert(num,', (')
                        sw = words[num]
                        words2.insert(0,sw)
                        poss2.insert(0,'When')   
                        num -= 1
                        break

####
    
    
##Who##    
    for c in dare:    
        if poss[num][0] == '助詞' and words[num] == c and poss[num-1][6] != '地域' and words[num-1]: #続く助詞がWhoの後に続くものの場合
                if words[num-1] in itu3:
                    break
                else:
                    words.insert(num,', Who)')
                    words.insert(num-1,', (')
                    sw = words[num-1]
                    words2.insert(0,sw)
                    poss2.insert(0,'Who')   
                    num -= 2
####



##How##    
    if poss[num][1] == '自立'  and poss[num][5] == '基本形':
        sw = []
        words.insert(num+1,', How)')
        sw.append(words[num])
        num -= 1
        if poss[num][0] != '助詞':
            while num > 0:
                sw2 = sw
                sw = []
                sw.append(words[num])
                sw.extend(sw2)
  
                if poss[num][0] == '名詞':
                    num -= 1
                    break
                num -= 1
        if  sw != ['']:
            words.insert(num+1,', (')
            sw = ''.join(sw)
            words2.insert(0,sw)
            poss2.insert(0,'How')
            #print('{0} , How'.format(sw))
        
    if poss[num][0] == '助動詞' and poss[num][5] == '基本形':
        sw =[]
        words.insert(num+1,', How)')
        sw.append(words[num])
        num -= 1
        while num > 0:
            sw2 = sw
            sw = []
            sw.append(words[num])
            sw.extend(sw2)
            if poss[num][0] =='名詞' or (poss[num][1] == '自立' and '連用' in poss[num][5]):
                break
            num -= 1
        
        if 'ん' not in sw and sw != ['']:
            sw = ''.join(sw)
            words2.insert(0,sw)
            poss2.insert(0,'How')
            words.insert(num,', (')
####
        
    else:
        num -= 1

次回の予定

今回でHow要素とWhen要素は、もし標準語の話を正確に音声認識できた場合には概ね正確に抽出できる様になりました。
次回はまた他の要素について検討していきます。


次の記事へ

前の記事へ 戻る