新しい手法
前回のCBSPを参考に、5W1Wを抽出する方法を考えました。
ステップ2
固有名詞を抜き出し、特徴的なパターン(oo病院、xx時など)と一部一致したら、WhoまたはWhenとしてスタックステップ3
動詞はHowとしてスタックステップ4
残っている名詞を、続く助詞からWhen、Where、Who、What、Whyにスタック
ステップ3までは下記のような単純なプログラムで実装できました。
python ステップ3まで import MeCab mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') #特徴的パターン d = ['病院', '大学'] i = ['日','時','今日','昨日'] text = '近藤がハーバード大学に今日12時に行く' mecab.parse('')#文字列がGCされるのを防ぐ node = mecab.parseToNode(text) while node: #単語を取得 word = node.surface #品詞を取得 pos = node.feature.split(",")[0] for c in d: if (c in word): print('{0} , Where'.format(word)) for c in i: if (c in word): print('{0} , When'.format(word)) if (pos == '動詞'): print('{0} , How'.format(word)) #次の単語に進める node = node.next
実行結果1
(入力: '近藤がハーバード大学に今日12時に行く')
なぜか"今日"が反復していますが、正しく分類できています。
また、ステップ4は、下記プログラムを実装して'続く助詞からWho Whatを分類する'過程を追加しました。
python import MeCab mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') ## 特徴的パターン d = ['病院', '大学'] #Whereのパターン i = ['日','時','今日','昨日'] #Whenのパターン dare = ['が','は'] #Whoの後に続く助詞 nani = ['を','に'] #Whatの後に続く助詞 words = [] poss = [] text = '近藤がハーバード大学に今日12時に留学に行く' mecab.parse('')#文字列がGCされるのを防ぐ node = mecab.parseToNode(text) while node: #単語を取得 word = node.surface words.append(word) #文字をスタック #品詞を取得 pos = node.feature.split(",")[0] poss.append(pos) #品詞をスタック for c in d: if (c in word): print('{0} , Where'.format(word)) words.pop() #検出した5W1Hは除外する poss.pop() for c in i: if (c in word): print('{0} , When'.format(word)) words.pop() poss.pop() if (pos == '動詞'): print('{0} , How'.format(word)) words.pop() poss.pop() #次の単語に進める node = node.next num = 0 for w in words: for c in dare: if poss[num] == '助詞' and w == c and poss[num-1] == '名詞': #続く助詞がWhoの後に続くものの場合 print('{0} , Who'.format(words[num-1])) for c in nani: if poss[num] == '助詞' and w == c and poss[num-1] == '名詞': #続く助詞がWhatの後に続くものの場合 print('{0} , What'.format(words[num-1])) num += 1
実行結果2
(入力:'近藤がハーバード大学に今日12時に留学に行く')
5W1Hを正しく抽出することができています。
実行結果3
(入力: '医者に診てもらいに北多摩病院に明日行く')
"北多摩"を正しく抽出できませんでした。 固有名詞まで分類できるようにすれば、"北多摩病院"で一語とみなして正しく抽出することができるはずです。
おわりに
今回は、きちんと助詞がある文章から5W1Hを検出するプログラムを実装しました。
ただし、認知症患者の話す文章は助詞があるとは限らないため、その場合に対処できるようなアルゴリズムを今後検討していきます。