spaCyのis_punctで句読点かどうか調べる【自然言語処理, Python】

215, 2021-03-29

目次

spaCyのis_punctの使い方

自然言語処理ライブラリのspaCyのトークンにはis_punctという属性があります。
この属性を参照すると、そのトークンが句読点かどうか判別することができます。
is_punctのほかにもis_left_punctis_right_punctがありますが、これらの使い方も合わせて解説します。

具体的には↓を見ていきます。

  • punctとは?

  • 句読点とは?

  • 句読点の種類

  • spacyのインポート

  • spaCyへのGiNZAのロード

  • is_punctでトークンが句読点かどうか判別する

  • is_left_punctで'('かどうか判別する

  • is_right_punctで')'かどうか判別する

  • 早見表

punctとは?

is_punctpunctとはpunctuationの略です。
punctuationは日本語に訳すと「句読点、区切り、句切り」などになります。

句読点とは?

句読点とは句点()と読点()の総称です。
狭い意味では半角文字だと..がこれに当たります。
広い意味では!?, それから()などの括弧などもそうです。

句読点の種類

句読点には↓のような種類があります。

  • 。(句点)

  • 、(読点)

  • .(ピリオド)

  • ,(カンマ)

  • ((左丸カッコ)

  • )(右丸カッコ)

  • [(左角カッコ)

  • ](右角カッコ)

  • {(左ブレース)

  • }(右ブレース)

  • !(ビックリマーク)

  • !(ビックリマーク全角)

  • ?(ハテナマーク)

  • ?(ハテナマーク全角)

  • :(コロン)

  • ;(セミコロン)

  • '(シングルクオート)

  • "(ダブルクオート)

  • -(ハイフン)

  • (シャープ)

  • %(パーセント)

  • &(アンド)

↑の記号はspaCyではすべて句読点です。

spacyのインポート

今回の解説に使うコードでは最初にspacyをインポートしておきます。
こうするとspaCyのモジュールを使うことが出来るようになります。

import spacy

spaCyへのGiNZAのロード

また、冒頭でGiNZAもロードしておきます。
今回は日本語の解析にはGiNZAのモデルを使います。
↓のようにspacy.load()ja_ginzaを渡してロードすると、返り値としてginza.Japaneseが返ってきます。
この返り値には慣例的にnlpと命名します。

nlp = spacy.load('ja_ginza')

is_punctでトークンが句読点かどうか判別する

is_punctはトークン(spacy.tokens.token.Token)が句読点ならTrue, 句読点じゃなければFalseになるbool値の属性です。
トークンに対してis_punctでアクセスすると参照することができます。

import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('[ ] ( ) < > { } ! ? ! ? 。 、 . , : ; \' " - # % &')

for tok in doc:
    print(tok, tok.is_punct)

↑のコードを実行すると↓のような結果になります。

[ True
] True
( True
) True
< False
> False
{ True
} True
! True
? True
! True
? True
。 True
、 True
. True
, True
: True
; True
' True
" True
- True
# True
% True
& True

↑を見ると<>意外はis_punctTrueになっているのがわかります。
<>は句読点とはみなされないんですね。

is_left_punctで'('かどうか判別する

is_left_punct属性はトークンが左カッコの類であればTrueになり、そうでなければFalseになるbool値の属性です。
これを使うとトークンが左カッコの類かどうか確認することができます。

import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('[ ] ( ) < > { } ! ? ! ? 。 、 . , : ; \' " - # % &')

for tok in doc:
    print(tok, tok.is_left_punct)

↑のコードを実行すると↓のような結果になります。

[ True
] False
( True
) False
< True
> False
{ True
} False
! False
? False
! False
? False
。 False
、 False
. False
, False
: False
; False
' True
" True
- False
# False
% False
& False

↑の結果を見ると[(などはTrueになっているのがわかります。
注意したいのは<Trueになっている点です。<is_punctではFalseになりますが、is_left_punctではTrueになります。またクオーテーション系もTrueになっています。

is_right_punctで')'かどうか判別する

is_right_punct属性でトークンが右カッコの類かどうか判定できます。

import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('[ ] ( ) < > { } ! ? ! ? 。 、 . , : ; \' " - # % &')

for tok in doc:
    print(tok, tok.is_right_punct)

↑のコードを実行すると↓のような結果になります。

[ False
] True
( False
) True
< False
> True
{ False
} True
! False
? False
! False
? False
。 False
、 False
. False
, False
: False
; False
' True
" True
- False
# False
% False
& False

早見表

is_punctis_left_punct, それからis_right_punctの対応は↓のようになります。

記号 is_punct is_left_punct is_right_punct
[ True True False
] True False True
( True True False
) True False True
< False True False
> False False True
{ True True False
} True False True
! True False False
? True False False
True False False
True False False
True False False
True False False
. True False False
, True False False
: True False False
; True False False
' True True True
" True True True
- True False False
# True False False
% True False False
& True False False

おわりに

今回はspaCyのis_punctについて見てみました。
パースで句読点を扱いたい場合は使えそうな属性です。