目次

spaCy

since 2021-11-24

概要

https://spacy.io/

「spaCyは産業応用向きの自然言語処理用Pythonライブラリです。」

解説(v2)

バージョン3

ビジュアライザー

PyPI

資料

spaCy/GiNZA を用いた自然言語処理

spaCy 3.0 で Transformer を利用する

spacy_streamlit

GiNZA

環境構築

Windows 11 + WSL2 + Linux Python 3.10 でやってみる

$ /usr/local/bin/python3.10 -m venv .env310
$ . .env310/bin/activate
$ pip install -U pip setuptools wheel
$ pip install spacy

英語

$ python -m spacy download en_core_web_sm

$ python
Python 3.10.0 (default, Oct  6 2021, 09:20:06) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from spacy.lang.en import English

>>> nlp = English()

>>> doc = nlp("Hello world!")

>>> for token in doc:
...   print(token.text)
...
Hello
world
!

>>> doc = nlp("It costs $5.")

>>> [token.text for token in doc]
['It', 'costs', '$', '5', '.']

>>> [token.is_alpha for token in doc]
[True, True, False, False, False]

統計モデル

>>> import spacy

>>> nlp = spacy.load("en_core_web_sm")

>>> doc = nlp("She ate the pizza")

>>> [(token.text, token.pos_) for token in doc]
[('She', 'PRON'), ('ate', 'VERB'), ('the', 'DET'), ('pizza', 'NOUN')]

Token

>>> type(doc[0])
<class 'spacy.tokens.token.Token'>

>>> [(token.text, token.lemma_) for token in doc]
[('She', 'she'), ('ate', 'eat'), ('the', 'the'), ('pizza', 'pizza')]

Named Entity / Span

>>> doc = nlp("Apple is looking at buying U.K. startup for $1 billion")

>>> [(ent.text, ent.label_) for ent in doc.ents]
[('Apple', 'ORG'), ('U.K.', 'GPE'), ('$1 billion', 'MONEY')]

>>> type(doc.ents[0])
<class 'spacy.tokens.span.Span'>

explain

>>> spacy.explain("NNP")
'noun, proper singular'

日本語

モデル一覧

$ python -m spacy download ja_core_news_sm

下記で止まる

Collecting sudachidict-core>=20200330
  Using cached SudachiDict-core-20210802.post1.tar.gz (9.1 kB)
  Preparing metadata (setup.py) ... -

GiNZA

乗り換えてみるか

$ /usr/local/bin/python3.9 -m venv .env39
$ . .env39/bin/activate
$ pip install -U ginza ja-ginza-electra

日本語(再)

since 2021-11-30

Python 3.9 でやり直したら動いた

$ /usr/local/bin/python3.9 -m venv .env39
$ . .env39/bin/activate
$ pip install -U pip setuptools wheel spacy
$ python -m spacy download ja_core_news_sm
You can now load the package via spacy.load('ja_core_news_sm')
$ python
Python 3.9.9 (main, Nov 16 2021, 10:06:29)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import spacy
>>> nlp = spacy.load("ja_core_news_sm")
>>> text = "この無料のオンラインコースでは、ルールベースと機械学習を用いた先進的な自然言語処理システム をspaCyで作る方法をインタラクティブに学ぶことができます。"
>>> doc = nlp(text)
>>> [(token.text, token.pos_) for token in doc]
[('この', 'DET'), ('無料', 'NOUN'), ('の', 'ADP'), ('オンライン', 'NOUN'), ('コース', 'NOUN'), ('で', 'ADP'), ('は', 'ADP'), ('、', 'PUNCT'), ('ルール', 'NOUN'), ('ベース', 'NOUN'), ('と', 'ADP'), ('機械', 'NOUN'), ('学習', 'NOUN'), ('を', 'ADP'), ('用い', 'VERB'), ('た', 'AUX'), ('先進', 'NOUN'), ('的', 'PART'), ('な', 'AUX'), ('自然', 'NOUN'), ('言語', 'NOUN'), ('処理', 'NOUN'), ('システム', 'NOUN'), ('を', 'ADP'), ('spaCy', 'NOUN'), ('で', 'ADP'), ('作る', 'VERB'), ('方法', 'NOUN'), ('を', 'ADP'), ('インタ ラクティブ', 'ADJ'), ('に', 'AUX'), ('学ぶ', 'VERB'), ('こと', 'NOUN'), ('が', 'ADP'), ('でき', 'AUX'), ('ます', 'AUX'), ('。', 'PUNCT')]
>>> doc = nlp("アップルはイギリスのスタートアップを10億円で買いそうだ")
>>> doc.ents
(アップル, イギリス, 10億円)

ちょっと大きいモデルを試すが、違いがあるかどうかはテキストによるようだ。

$ python -m spacy download ja_core_news_md

>>> import spacy
>>> nlp = spacy.load("ja_core_news_md")