前回の「CRF で名詞句の判定をしてみた」の改良版として、
前後の単語情報を特徴量に追加してみました。
変更箇所は単語の特徴量を返却するメソッドのみです。
■実行結果
前後の単語情報を含まない場合は 0.94 程度でしたので、前後の単語情報を追加することで精度が上がっていることがわかります。
前後の単語情報を特徴量に追加してみました。
変更箇所は単語の特徴量を返却するメソッドのみです。
# 単語の特徴量 def word_featureh(sent, i): word = sent[i] tkn = word[0] pos = word[1] if i > 0: word_p1 = sent[i-1] tkn_p1 = word_p1[0] pos_p1 = word_p1[1] else: tkn_p1 = '' pos_p1 = '' if i >= len(sent)-1: tkn_n1 = '<e>' pos_n1 = '<e>' else: word_n1 = sent[i+1] tkn_n1 = word_n1[0] pos_n1 = word_n1[1] feath = { 'bias': 1.0, 'token': tkn.lower(), 'token.isuppser()': tkn.isupper(), 'token.istitle()': tkn.istitle(), 'token.isdigit()': tkn.isdigit(), 'pos': pos, 'token_p1': tkn_p1.lower(), 'token_p1.isuppser()': tkn_p1.isupper(), 'token_p1.istitle()': tkn_p1.istitle(), 'token_p1.isdigit()': tkn_p1.isdigit(), 'pos_p1': pos_p1, 'token_n1': tkn_n1.lower(), 'token_n1.isuppser()': tkn_n1.isupper(), 'token_n1.istitle()': tkn_n1.istitle(), 'token_n1.isdigit()': tkn_n1.isdigit(), 'pos_n1': pos_n1, } return feath
■実行結果
0.9618864951695193
前後の単語情報を含まない場合は 0.94 程度でしたので、前後の単語情報を追加することで精度が上がっていることがわかります。