dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

CRF での名詞句の判定で特徴量を変更してみた

2022-02-17 23:53:55 | 自然言語処理
前回の「CRF で名詞句の判定をしてみた」の改良版として、
前後の単語情報を特徴量に追加してみました。

変更箇所は単語の特徴量を返却するメソッドのみです。
# 単語の特徴量
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 程度でしたので、前後の単語情報を追加することで精度が上がっていることがわかります。

この記事についてブログを書く
« CRF で名詞句の判定を試してみた | トップ | CRF の algorithm を変更して... »

自然言語処理」カテゴリの最新記事