iTAC_Technical_Documents

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

ブログ名

【第2回】5W1H抽出AI 抽出器の検討1

新しい手法

前回のCBSPを参考に、5W1Wを抽出する方法を考えました。

  • ステップ1
    テキストをMeCabを用いて形態素解析

  • ステップ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時に行く')

f:id:iTD_GRP:20200612030015p:plain

なぜか"今日"が反復していますが、正しく分類できています。

また、ステップ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時に留学に行く')

f:id:iTD_GRP:20200612030346p:plain

5W1Hを正しく抽出することができています。

実行結果3

(入力: '医者に診てもらいに北多摩病院に明日行く')

f:id:iTD_GRP:20200612030522p:plain

"北多摩"を正しく抽出できませんでした。 固有名詞まで分類できるようにすれば、"北多摩病院"で一語とみなして正しく抽出することができるはずです。

おわりに

今回は、きちんと助詞がある文章から5W1Hを検出するプログラムを実装しました。
ただし、認知症患者の話す文章は助詞があるとは限らないため、その場合に対処できるようなアルゴリズムを今後検討していきます。


次の記事へ

前の記事へ 戻る