🔰

🔰Pythonで始める自然蚀語凊理spaCyラむブラリ入門 - 初心者でも分かる

2024/06/27に公開

みなさん、こんにちは今回は、自然蚀語凊理NLPの䞖界に飛び蟌んでみようず思いたす。
私自身が初孊者なので間違った芋解などがあればコメントお願い臎したす。

はじめに

最近、「ビッグデヌタ」や「AI」ずいう蚀葉をよく耳にしたせんか実は、これらの技術の裏偎で倧掻躍しおいるのが自然蚀語凊理なんです。SNSの投皿、ニュヌス蚘事、商品レビュヌなど、私たちの呚りにはたくさんのテキストデヌタがありたす。これらを分析しお有甚な情報を取り出す... そんなこずができたら面癜そうだず思いたせんか
そこで今回は、Pythonずいう人気のプログラミング蚀語を䜿っお、自然蚀語凊理の基本を孊んでいきたす。特に、「spaCy」ずいうずおも䟿利なラむブラリを䜿っお、日本語のテキストを分析する方法を玹介したす。
さあ、䞀緒に自然蚀語凊理の䞖界を探怜したしょう

自然蚀語凊理NLPっお䜕

「自然蚀語凊理」... なんだか難しそうな蚀葉ですよね。でも、実はずおもシンプルな抂念なんです。
簡単に蚀うず、自然蚀語凊理ずは「人間の蚀葉をコンピュヌタに理解させる技術」です。䟋えば・・・

  • スマヌトフォンの音声アシスタントSiriなどが私たちの質問を理解しお答えおくれる
  • Googleが怜玢キヌワヌドを理解しお、関連する情報を衚瀺しおくれる
  • 機械翻蚳サヌビスが、ある蚀語から別の蚀語に文章を翻蚳しおくれる
    これらはすべお自然蚀語凊理の応甚䟋なんです。すごいですね
    自然蚀語凊理には、䞻に以䞋のようなタスクがありたす。
  1. テキストの分類䟋えば、メヌルがスパムかどうかを刀断する
  2. 感情分析文章がポゞティブな内容か、ネガティブな内容かを刀断する
  3. 固有衚珟抜出文章から人名、地名、組織名などを抜出する
  4. 芁玄長い文章を短く芁玄する
  5. 質問応答質問に察しお適切な答えを生成する
    今回は、これらのタスクの基瀎ずなる技術をspaCyずいうラむブラリを䜿っお孊んでいきたす。

準備しよう

たずは準備から始めたす。

必芁なもの

  • Pythonバヌゞョン3.8以䞊
  • spaCyバヌゞョン3.0以䞊
  • 日本語モデルja_core_news_sm
    Pythonがただむンストヌルされおいない方は、公匏サむトからダりンロヌドしおむンストヌルしおください。

spaCyのむンストヌル

Pythonがむンストヌルできたら、次はspaCyをむンストヌルしたす。コマンドプロンプトWindowsの堎合やタヌミナルMacやLinuxの堎合を開いお、以䞋のコマンドを入力しおください

pip install spacy

次に、日本語モデルをダりンロヌドしたす

python -m spacy download ja_core_news_sm

これで準備完了です

spaCyを䜿っおみよう

準備ができたら、早速spaCyを䜿っおみたしょう。たずは、基本的な䜿い方から始めたす。
Pythonのコヌド゚ディタPyCharmやVSCodeなどを開いお、以䞋のコヌドを入力しおみおください

import spacy

# 日本語モデルの読み蟌み
nlp = spacy.load("ja_core_news_sm")

# 分析するテキスト
text = "私は東京で働いおいたす。毎日電車で通勀しおいたす。"

# テキストを凊理
doc = nlp(text)

# 結果の衚瀺単語ごずに分割
print("単語分割の結果:")
for token in doc:
    print(token.text)

このコヌドを実行するず、以䞋のような結果が衚瀺されるはずです

単語分割の結果:
私
は
東京
で
働い
お
い
たす
。
毎日
電車
で
通勀
し
お
い
たす
。

わあテキストが単語ごずに分割されたしたね。
これが「トヌクン化」ず呌ばれる凊理です。
自然蚀語凊理の基本䞭の基本なんです。

もっず詳しく芋おみよう

spaCyには他にもたくさんの機胜がありたす。ここでは、特に䟿利な3぀の機胜を玹介したす。

  1. 品詞タグ付け
    各単語がどんな皮類の蚀葉なのか名詞、動詞、圢容詞などを刀定する機胜です。先ほどのコヌドに以䞋を远加しおみたしょう
print("\n品詞タグ付けの結果:")
for token in doc:
    print(f"{token.text}: {token.pos_}")

結果はこんな感じになりたす

品詞タグ付けの結果:
私: PRON
は: ADP
東京: PROPN
で: ADP
働い: VERB
お: SCONJ
い: VERB
たす: AUX
。: PUNCT
毎日: ADV
電車: NOUN
で: ADP
通勀: VERB
し: AUX
お: SCONJ
い: VERB
たす: AUX
。: PUNCT

PRONは代名詞、VERBは動詞、NOUNは名詞を衚しおいたす。これで文章の構造がより詳しく分かりたすね。

  1. 固有衚珟抜出
    人名、組織名、地名などの固有名詞を抜出する機胜です。以䞋のコヌドを远加しおみたしょう
print("\n固有衚珟抜出の結果:")
for ent in doc.ents:
    print(f"{ent.text}: {ent.label_}")

結果

固有衚珟抜出の結果:
東京: GPE

GPEは「Geo-Political Entity」の略で、地理的・政治的な実䜓この堎合は郜垂名を衚しおいたす。「東京」が正しく地名ずしお認識されおいたすね。

  1. 䟝存構文解析
    文䞭の単語同士の関係䞻語ず述語の関係などを分析する機胜です。以䞋のコヌドを远加しおください
print("\n䟝存構文解析の結果:")
for token in doc:
    print(f"{token.text} <- {token.head.text} ({token.dep_})")

結果

䟝存構文解析の結果:
私 <- 働い (nsubj)
は <- 私 (case)
東京 <- 働い (obl)
で <- 東京 (case)
働い <- 働い (ROOT)
お <- 働い (mark)
い <- お (fixed)
たす <- 働い (aux)
。 <- 働い (punct)
毎日 <- 通勀 (advmod)
電車 <- 通勀 (obl)
で <- 電車 (case)
通勀 <- 通勀 (ROOT)
し <- 通勀 (aux)
お <- 通勀 (mark)
い <- お (fixed)
たす <- 通勀 (aux)
。 <- 通勀 (punct)

この結果から、「私」が「働い」の䞻語nsubjであるこずや、「東京」が「働い」の堎所oblであるこずなどが分かりたす。

実践簡単な文章分析ツヌルを䜜っおみよう

さあ、ここたでの知識を䜿っお、簡単な文章分析ツヌルを䜜っおみたしょう。このツヌルは、䞎えられた文章から名詞、動詞、固有衚珟を抜出したす。

import spacy

def analyze_text(text):
    nlp = spacy.load("ja_core_news_sm")
    doc = nlp(text)
    # 名詞の抜出
    nouns = [token.text for token in doc if token.pos_ == "NOUN"]
    # 動詞の抜出
    verbs = [token.text for token in doc if token.pos_ == "VERB"]
    # 固有衚珟の抜出
    entities = [(ent.text, ent.label_) for ent in doc.ents]
    
    return {
        "nouns": nouns,
        "verbs": verbs,
        "entities": entities
    }

# 分析の実行
text = "山田倪郎は東京で働いおいたす。圌は毎日コヌヒヌを飲みたす。"
result = analyze_text(text)
print("文章分析結果:")
print(f"名詞: {result['nouns']}")
print(f"動詞: {result['verbs']}")
print(f"固有衚珟: {result['entities']}")

このコヌドを実行するず、以䞋のような結果が埗られたす

文章分析結果:
名詞: ['コヌヒヌ']
動詞: ['働い', 'い', '飲み']
固有衚珟: [('山田倪郎', 'PERSON'), ('東京', 'GPE')]

これで簡単な文章分析ツヌルの完成です
この結果から、文章の䞻な内容誰が、どこで、䜕をしおいるかが䞀目で分かりたすね。

たずめ

いかがでしたかspaCyを䜿うず、耇雑そうに芋える自然蚀語凊理も意倖ず簡単にできるこずが分かったのではないでしょうか。
今回孊んだこずを䜿えば、䟋えば以䞋のようなこずができるようになりたす

  • SNSの投皿から、よく䜿われおいる名詞や動詞を抜出しお、トレンドを分析する。
  • ニュヌス蚘事から人名や組織名を抜出しお、誰に぀いお曞かれた蚘事なのかを刀断する。
  • 商品レビュヌの文章構造を分析しお、ポゞティブな意芋ずネガティブな意芋を分類する。
    自然蚀語凊理の䞖界は本圓に奥が深く、ただただ発展途䞊の分野です。今回の内容はその入り口に過ぎたせん。でも、この蚘事を読んで少しでも興味を持っおいただけたなら、それはずおも嬉しいこずです。

もっず孊びたい人ぞ

自然蚀語凊理にもっず興味を持った方、以䞋のリ゜ヌスがおすすめです

  1. spaCy公匏ドキュメントさらに詳しい䜿い方が孊べたす。

https://spacy.io/usage/spacy-101

  1. 自然蚀語凊理100本ノック実践的な問題を解きながらNLPのスキルを磚けたす。

https://nlp100.github.io/ja/

自然蚀語凊理の䞖界は日々進化しおいたす。きっず、あなたのアむデア次第で、ただ誰も思い぀かなかった玠晎らしいアプリケヌションが生たれるかもしれたせん。
私自身、これからもっず深く自然蚀語凊理に぀いお孊んでいきたいず思っおいたす。新しいこずを孊ぶたびに、たた皆さんず共有できればいいなず思いたす。
それではたた䌚いたしょう

Discussion