Pythonの自然言語処理
Pythonは自然言語処理の分野で広く使われているプログラミング言語です。以下は、Pythonを使った自然言語処理の概要と主要なライブラリについてまとめました。
一般的な自然言語処理の流れは以下の通りです。
- 前処理
テキストデータの正規化、ノイズ除去、トークン化(単語に分割)など - 形態素解析
単語の品詞(名詞、動詞など)を付与 - 構文解析
文の構造を解析 - 意味解析
単語の意味や文脈を解析 - 課題に応じた処理
分類、要約、質問応答、機械翻訳など
自然言語処理に使える主要なPythonライブラリは以下の通りです。
- NLTK
自然言語処理の基本的な処理が可能。トークン化、品詞タグ付け、構文解析などが利用できる。 - spaCy
高速で高精度な自然言語処理ライブラリ。英語、日本語、中国語などに対応。 - Hugging Face Transformers
BERT、GPT-2などの最新の言語モデルを利用できる。 - Gensim
トピックモデリングやWord2Vecなどの単語ベクトル化ツールが利用できる。 - GiNZA
spaCyをベースとした日本語の自然言語処理ライブラリ。
Pythonでの自然言語処理の例
以下は、Pythonで自然言語処理を行う基本的な例です。
#NLTKを使った形態素解析と品詞タグ付け import nltk text = "I am learning natural language processing with Python." tokens = nltk.word_tokenize(text) tagged = nltk.pos_tag(tokens) print(tagged)
このPythonスクリプトは、NLTKライブラリを使って英文の形態素解析と品詞タグ付けを行っています。以下、コードの処理内容を解説します。
import nltk
NLTKライブラリをインポートしています。
関連 NLTK :: Natural Language Toolkit
text = "I am learning natural language processing with Python."
解析対象の英文を `text` 変数に代入しています。
tokens = nltk.word_tokenize(text)
`nltk.word_tokenize()` 関数を使って、英文 `text` を単語(トークン)に分割しています。この処理を形態素解析と呼びます。
分割された単語のリストが `tokens` 変数に格納されます。
tagged = nltk.pos_tag(tokens)
`nltk.pos_tag()` 関数を使って、形態素解析された単語リスト `tokens` に対して品詞タグ付けを行っています。
品詞タグ付けとは、各単語の品詞(名詞、動詞、形容詞など)を識別することです。タグ付けされた結果が、`tagged` 変数に格納されます。
print(tagged)
`print()` 関数で、品詞タグ付けの結果 `tagged` を出力しています。
実行結果は以下のようになります。
[('I', 'PRP'), ('am', 'VBP'), ('learning', 'VBG'), ('natural', 'JJ'), ('language', 'NN'), ('processing', 'NN'), ('with', 'IN'), ('Python', 'NNP'), ('.', '.')]
出力は、各単語とその品詞タグのタプルのリストになっています。
例えば、`(‘I’, ‘PRP’)` は、”I” が人称代名詞(PRP)であることを示しています。他の品詞タグの例: VBP(動詞、現在形)、VBG(動詞、動名詞)、JJ(形容詞)、NN(名詞、単数形)、NNP(固有名詞、単数形)、IN(前置詞)など。
このように、NLTKを使うことで、英文を単語に分割し、各単語の品詞を識別することができます。これは自然言語処理の基本的なステップの一つです。
spaCyを使った名詞句チャンキングの例
#spaCyを使った名詞句チャンキング import spacy nlp = spacy.load("en_core_web_sm") doc = nlp("Apple released the new MacBook Pro models yesterday.") for chunk in doc.noun_chunks print(chunk.text, chunk.root.dep_, chunk.root.head.text)
このPythonスクリプトは、spaCyライブラリを使用して英語の文を解析し、名詞句(noun chunks)を抽出しています。
import spacy
spaCyライブラリをインポートしています。
関連 spaCy · Industrial-strength Natural Language Processing in Python
nlp = spacy.load("en_core_web_sm")
事前に学習済みの小サイズの英語モデル “en_core_web_sm” をロードしています。このモデルには、品詞タグ付け、依存関係解析、固有表現抽出などの機能が含まれています。
doc = nlp("Apple released the new MacBook Pro models yesterday.")
解析対象の文字列を nlp オブジェクトに渡し、Doc オブジェクトを作成しています。この時点で、文字列はトークン化され、各トークンに品詞タグと依存関係ラベルが付与されます。
for chunk in doc.noun_chunks: print(chunk.text, chunk.root.dep_, chunk.root.head.text)
doc.noun_chunks を使って文中の名詞句(noun chunks)を抽出し、各名詞句について以下の情報を表示しています。
- chunk.text: 名詞句のテキスト
- chunk.root.dep_: 名詞句のルートトークンの依存関係ラベル
- chunk.root.head.text: 名詞句のルートトークンの親トークンのテキスト
名詞句のルートとは、その名詞句の中心となる名詞のことです。
このスクリプトを実行すると、以下のような出力が得られます。
Apple nsubj released the new MacBook Pro models dobj released yesterday npadvmod released
これは、文中に3つの名詞句が存在し、それぞれの名詞句のルートトークンが “Apple”、”models”、”yesterday” であることを示しています。また、各名詞句のルートトークンの依存関係ラベルと親トークンのテキストも表示されています。
以上が、このPythonスクリプトの処理内容の解説です。spaCyを使うことで、英語の文を簡単に解析し、名詞句を抽出することができます。
Pythonは自然言語処理と相性が良く、単純な文法と豊富なライブラリを備えているため、自然言語処理の複雑なタスクも比較的簡単にコーディングできます。