今回改善した点について
全体を通し、CaboChaを用いて判別する場合はチャンク毎に繋げて出力するように改善しました。
How要素
How要素は文末から探索し、係り受け先がない要素から助詞までの要素をHow要素とします。
What要素を少し改良し、シンプルにしました。
コードを以下に示します。
python elif toId[num] == -1: w.insert(0, words[num]) howId.append(chunkId[num]) num -= 1 while num > -1: if poss[num][0] =='助詞': break w.insert(0,words[num]) howId.append(chunkId[num]) num -=1 How.insert(0, ''.join(w)) w=[]
What要素
What要素の抽出にはCaboChaを用いることにより、文節よりも大きなくくりであるチャンクごとの係り受けの関係と、形態素解析による助詞の種類によって判別します。
あらかじめHow要素を抽出しておき、How要素に係り受ける要素を抽出し、格助詞や係助詞といった助詞で、かつ「は」、「が」などのWhat要素となる助詞のときに、その助詞を含むチャンクをWhat要素として抽出します。
コードは以下に示します。
python elif toId[num] in howId and (poss[num][1] == '係助詞' or poss[num][1] == '格助詞') and (words[num] in nani): w.insert(0,words[num]) whatId = chunkId[num] num -= 1 while chunkId[num] == chunkId[num-1]: w.insert(0, words[num]) num -= 1 w.insert(0, words[num]) What.insert(0,''.join(w)) w = []
実行例
実行例1: 入力: 下鴨神社の参道は暗かった。 出力: Who:[] Where:['下鴨', '神社', '参道'] When:[] Why:[] What:['参道は'] How:['暗かった。']
実行例2 入力:上りのピークは1月3日で東名高速や東北道関越道でそれぞれ35キロの渋滞が予想されています 出力: Who:[] Where:['ピーク', '東名', '東北', '道', '関越', '道'] When:['1月', '3日で'] Why:[] What:['ピークは', '渋滞が'] How:['予想されて', 'います']
実行例3: 入力:ここまで解説は石川さんでした 出力: Who:['石川'] Where:[] When:[] Why:[] What:['解説は'] How:['石川さんでした']
実行例4: 入力:会見があるから見ると聞かれるなっていうのがやっぱり想像できるじゃないですか 出力: Who:[] Where:[] When:[] Why:['会見があるから'] What:['聞かれるなっていうのが'] How:['やっぱり想像できるじゃ', 'ないですか']
実行例5: 入力: 太郎はこの本を二郎を見た女性に渡した。 出力: Who:['太郎', '二郎', '女性'] Where:[] When:[] Why:[] What:['太郎は'] How:['渡した。']
実行例5のように係り受け関係が複雑な文から抽出するのは難しいですが、一般的な文ならば高い精度で抽出できています。
今後について
今後は、議事録を自動作成する機能の作成のため、自然言語処理の基礎調査を行いたいと思います。