この記事では、高性能自然言語処理 (NLP) ライブラリである spaCy について、spaCy の主な機能、用途、実践方法を中心に紹介します。実際のコード例を通じて、単語の分割、品詞のタグ付け、固有表現の認識、依存関係の解決などのタスクに spaCy を使用する方法を示します。この記事では、spaCy を使用してテキスト分類と情報抽出を行う方法、およびカスタム モデルをトレーニングする方法についても説明します。また、spaCy の強みを強調するために、他の NLP ライブラリと比較します。
記事ディレクトリ
1. spaCyの紹介
spaCy は、高度な自然言語処理のための Python ライブラリです。2015 年にマシュー ホンニバルとイネス モンターニによって設立されました。spaCy は、高性能、使いやすさ、拡張性を念頭に置いて設計されています。spaCy にはさまざまな事前トレーニング済みモデルが組み込まれており、英語、フランス語、ドイツ語、中国語などを含む複数の言語の処理に使用できます。また、ユーザーがカスタム NLP アプリケーションを簡単に開発できるように、多くのツールとインターフェイスも提供します。
2.spaCyをインストールする
pip install spacy
3. spaCyの基本機能
以下は、自然言語テキストを処理するための spaCy の基本的な機能の一部です。
3.1 単語の分割
トークン化は、テキストを単語や句読点などの基本単位に分割するプロセスです。spaCy は単語の分割タスクをすばやく完了できます。まず、コマンド ラインで次のコマンドを実行してモデルをインストールします。
# 英文模型
python -m spacy download en_core_web_sm
# 中文模型
python -m spacy download zh_core_web_sm
import spacy
nlp = spacy.load("en_core_web_sm")
# 如果是中文文本,则需要加载中文模型
# nlp = spacy.load("zh_core_web_sm")
text = "This is a sentence."
doc = nlp(text)
for token in doc:
print(token.text)
spaCy の単語分割機能については、次の記事も参照してください:単語分割ツールと方法: jieba、spaCy など。
3.2 品詞のタグ付け
品詞タグ付けは、テキスト内の各単語に品詞 (名詞、動詞など) を割り当てるプロセスです。spaCy は、事前トレーニングされたモデルを使用して、品詞のタグ付けを自動的に完了します。
for token in doc:
print(token.text, token.pos_)
3.3 固有表現の認識
固有表現認識 (NER) は、テキスト内の固有表現 (人名、場所、会社名など) を識別および分類するプロセスです。spaCy の事前トレーニング済みモデルは、多くの種類の名前付きエンティティを自動的に認識できます。
for ent in doc.ents:
print(ent.text, ent.label_)
3.4 依存関係の分析
依存関係の解析は、テキスト内の単語間の構文関係 (主語、目的語など) を判断するプロセスです。spaCy は単語間の依存関係を自動的に分析できるため、テキスト構造をより深く理解するのに役立ちます。
for token in doc:
print(token.text, token.dep_, token.head.text)
上記はspaCyの基本的な機能の一部です。実際、spaCy には、テキスト類似度計算、単語ベクトル生成、文境界検出など、他にも多くの機能が含まれています。spaCy の詳細については、 spaCy の公式ドキュメントを参照してください。
4. テキストの分類
spaCy のテキスト分類は主にその組み込みTextCategorizer
コンポーネントに依存しています。まず、トレーニング データセットを作成し、トレーニングに spaCy を使用する必要があります。
中国語のテキスト分類を処理する場合、spaCy は中国語の単語分割ライブラリ (pkuseg) をロードしようとするため、pkuseg ライブラリとその関連する事前トレーニング済みモデルをインストールする必要があります。
- まず、pkuseg ライブラリがインストールされていることを確認してください。そうでない場合は、次のコマンドを実行してインストールします。
pip install pkuseg
-
次に、事前トレーニングされた pkuseg モデルをダウンロードする必要があります。GitHub の pkuseg-python プロジェクトのリリースページからダウンロードできます。
-
ダウンロードが完了したら、事前トレーニングされたモデル ファイルをディレクトリに抽出します。事前トレーニングされたモデルを
pkuseg_model
という名前のディレクトリに解凍したとします。 -
次に、トークナイザーを作成して構成する必要があります。
import spacy
from spacy.lang.zh import Chinese, try_pkuseg_import
class CustomChineseTokenizer(Chinese):
def initialize(self, get_examples, **kwargs):
self.pkuseg_seg = try_pkuseg_import(pkuseg_model="pkuseg_model", pkuseg_user_dict=None)
return super().initialize(get_examples, **kwargs)
nlp = CustomChineseTokenizer()
以下は、テキスト分類に spaCy を使用する方法を示す完全な例です。
import spacy
from spacy.util import minibatch, compounding
from spacy.pipeline.textcat import Config, single_label_cnn_config
import random
from spacy.lang.zh import Chinese, try_pkuseg_import
from spacy.training import Example
# 创建训练数据
train_data = [
("这是一个好消息。", {
"cats": {
"POSITIVE": 1.0, "NEGATIVE": 0.0}}),
("我很高兴。", {
"cats": {
"POSITIVE": 1.0, "NEGATIVE": 0.0}}),
("这是一个糟糕的经历。", {
"cats": {
"POSITIVE": 0.0, "NEGATIVE": 1.0}}),
("我很沮丧。", {
"cats": {
"POSITIVE": 0.0, "NEGATIVE": 1.0}})
]
# 加载中文模型
class CustomChineseTokenizer(Chinese):
def initialize(self, get_examples, **kwargs):
self.pkuseg_seg = try_pkuseg_import(pkuseg_model="pkuseg_model", pkuseg_user_dict=None)
return super().initialize(get_examples, **kwargs)
nlp = CustomChineseTokenizer()
# 添加TextCategorizer组件
config = Config().from_str(single_label_cnn_config)
if "textcat" not in nlp.pipe_names:
textcat = nlp.add_pipe("textcat", config=config , last=True)
else:
textcat = nlp.get_pipe("textcat")
# 添加标签
textcat.add_label("POSITIVE")
textcat.add_label("NEGATIVE")
# 训练模型
n_iter = 20
random.seed(1)
spacy.util.fix_random_seed(1)
optimizer = nlp.begin_training()
batch_sizes = compounding(4.0, 32.0, 1.001)
# 更新训练循环
for i in range(n_iter):
losses = {
}
batches = minibatch(train_data, size=batch_sizes)
for batch in batches:
examples = []
for text, annotations in batch:
doc = nlp.make_doc(text)
example = Example.from_dict(doc, annotations)
examples.append(example)
nlp.update(examples, sgd=optimizer, drop=0.2, losses=losses)
print(f"迭代次数:{
i+1},损失:{
losses['textcat']}")
# 测试分类器
test_text = "这个消息让人高兴。"
doc = nlp(test_text)
print(f"文本:{
test_text}")
for label, score in doc.cats.items():
print(f"{
label}: {
score}")
この例では、肯定的な感情と否定的な感情を含む文を含む単純なトレーニング データセットを作成することから始めます。次に、中国モデルをロードし、TextCategorizer
コンポーネントを追加しました。次に、肯定的な感情と否定的な感情のラベルを追加し、20 回の反復でトレーニングしました。
トレーニング後、テスト テキストを使用して分類器の予測を確認します。
迭代次数:1,损失:0.25
迭代次数:2,损失:0.24783627688884735
迭代次数:3,损失:0.243463397026062
迭代次数:4,损失:0.23672938346862793
迭代次数:5,损失:0.23108384013175964
迭代次数:6,损失:0.22520506381988525
迭代次数:7,损失:0.20326930284500122
迭代次数:8,损失:0.16069942712783813
迭代次数:9,损失:0.15615935623645782
迭代次数:10,损失:0.12908345460891724
迭代次数:11,损失:0.1116722971200943
迭代次数:12,损失:0.09159457683563232
迭代次数:13,损失:0.07003745436668396
迭代次数:14,损失:0.05477789789438248
迭代次数:15,损失:0.03252990543842316
迭代次数:16,损失:0.02523144707083702
迭代次数:17,损失:0.00921378843486309
迭代次数:18,损失:0.004524371586740017
迭代次数:19,损失:0.003985351417213678
迭代次数:20,损失:0.0013836633879691362
文本:这个消息让人高兴。
POSITIVE: 0.9919237494468689
NEGATIVE: 0.008076261729001999
この例では、非常に単純なトレーニング データと反復回数を使用しているため、分類器のパフォーマンスはそれほど高くない可能性があることに注意してください。実際には、パフォーマンスを向上させるには、より大きなトレーニング データセットとより多くの反復が必要です。
5. 情報抽出
import spacy
nlp = spacy.load("en_core_web_sm")
text = "Apple Inc. is an American multinational technology company headquartered in Cupertino, California."
doc = nlp(text)
# 提取公司名和总部所在地
for ent in doc.ents:
if ent.label_ == "ORG":
org = ent.text
elif ent.label_ == "GPE":
location = ent.text
print(f"{
org} is located in {
location}.")
6. カスタムモデルをトレーニングする
公式 spaCy ドキュメントのトレーニング カスタム モデル ガイドを参照してください。
7. spaCy と他の NLP ライブラリとの比較
- spaCy と NLTK の比較: NLTK は強力な NLP ライブラリですが、spaCy の方がパフォーマンスが高く、運用環境への統合が容易です。
- spaCy と TextBlob: TextBlob はいくつかの基本的な NLP 機能を提供しますが、spaCy はよりパフォーマンスの高い運用グレードのアプリケーションに重点を置いています。
- spaCy と Gensim: Gensim は主にトピック モデリングとドキュメント類似性分析に使用されますが、spaCy は幅広い NLP 機能を提供します。
8. まとめ
spaCy は、複数の言語を処理できる高性能で使いやすい自然言語処理ライブラリであり、多くの事前トレーニング済みモデルと拡張可能な機能を提供します。この記事では、spaCy の基本的な機能と応用例を紹介し、実際のコード例を通じてさまざまな NLP タスクで spaCy を使用する方法を示します。