ユーニックス総合研究所

  • home
  • archives
  • spacy-is-punct

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

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について見てみました。
パースで句読点を扱いたい場合は使えそうな属性です。