Python で自然言語処理を始める

Python で自然言語処理を始める

このチュートリアルの目的は、自然言語処理 (NLP) の概念を通じて Python でテキスト データを分析できるようにすることです。まず、テキストを小さなチャンクにトークン化し、単語をそのルート形式に正規化し、さらに分析を行う準備としてドキュメント内のノイズを除去する方法を学習します。

[[434759]]

さあ始めましょう!

前提条件

このチュートリアルでは、Python の nltk ライブラリを使用して、テキストに対するすべての NLP 操作を実行します。このチュートリアルを書いている時点では、nltk のバージョン 3.4 を使用しています。ライブラリをインストールするには、ターミナルで pip コマンドを使用します。

  1. pip インストール nltk==3.4

システムにインストールされている nltk のバージョンを確認するには、ライブラリを Python インタープリターにインポートしてバージョンを確認します。

  1. nltk をインポートする 
  2. print(nltk.__version__)

このチュートリアルの一部の操作を実行するには、特定の nltk リソースをダウンロードする必要がある場合があります。必要に応じて各リソースについて説明します。

ただし、このチュートリアルの後半で個々のリソースをダウンロードせずに今すぐ取得したい場合は、次のコマンドを実行します。

  1. python -m nltk.downloaderすべて 

ステップ1: トークンに変換する

コンピュータシステムは本質的に自然言語の意味を見つけることができません。自然言語を処理する最初のステップは、生のテキストをトークンに変換することです。トークンは連続した文字の組み合わせであり、特定の意味を持ちます。文をトークンに分割する方法はあなた次第です。たとえば、単純な方法としては、スペースで文を分割して個々の単語に分割する方法があります。

NLTK ライブラリでは、word_tokenize() 関数を使用して文字列をトークンに変換できます。ただし、最初に punkt リソースをダウンロードする必要があります。ターミナルで次のコマンドを実行します。

  1. nltk.download( 'punkt' )をダウンロード

次に、word_tokenizefromnltk.tokenize をインポートして使用する必要があります。

  1. nltk.tokenizeからword_tokenizeをインポートします
  2. print(word_tokenize( "こんにちは、素敵なホテルですね。" ))

コードの出力は次のようになります。

  1. [ 'こんにちは' '、' 'ここ' 'は' 'a' '素敵な' 'ホテル' '.' ]

word_tokenize は空白に基づいて文字列を分割するだけでなく、句読点もトークンに分割することに気づくでしょう。分析中に句読点を残すかどうかはあなた次第です。

ステップ2: 単語を基本形に変換する

自然言語を扱う場合、同じ単語に複数の文法形式があることに気付くことがよくあります。たとえば、「go」、「going」、「gone」は同じ動詞「go」の形です。

プロジェクトの必要性により、単語のさまざまな文法形式を維持する必要があるかもしれませんが、同じ単語のさまざまな文法形式を基本形式に変換する方法について説明しましょう。単語を基本語に変換するには 2 つの手法を使用できます。

最初のテクニックはステミングです。ステミングは、単語から接辞を削除する単純なアルゴリズムです。 NLTK にはさまざまなステミング アルゴリズムが用意されています。このチュートリアルでは、ポーターのアルゴリズムを使用します。

まず、nltk.stem.porter から PorterStemmer を取得します。次に、ステマーを stemmer 変数に初期化し、.stem() メソッドを使用して単語の基本形を検索します。

  1. nltk.stem.porterからPorterStemmer をインポート
  2. ステマー = PorterStemmer()
  3. print(stemmer.stem( "行く" ))

上記のコードの出力は go です。上記の「go」の他の形式に対してステマーを実行すると、ステマーが同じ基本形式「go」を返すことがわかります。しかし、語幹抽出は接辞の削除に基づく単純なアルゴリズムにすぎないため、その言語であまり一般的でない単語の場合は失敗します。

たとえば、「constitutes」という単語の語幹を解析しようとすると、直感に反する結果が得られます。

  1. print(stemmer.stem( "構成" ))

出力は「constitut」であることがわかります。

この問題は、より洗練された方法を使用して、特定のコンテキスト内の単語の基本形を見つけることで解決できます。このプロセスは、レマタイズ化と呼ばれます。レンマ化は、テキストのコンテキストと語彙に基づいて単語を正規化します。 NLTK では、WordNetLemmatizer クラスを使用して文をレマタイズできます。

まず、Python ターミナルの NLTK ダウンローダーから wordnet リソースをダウンロードする必要があります。

  1. nltk.download( 'wordnet' )をダウンロード

ダウンロードしたら、WordNetLemmatizer クラスをインポートして初期化する必要があります。

  1. nltk.stem.wordnetからWordNetLemmatizer をインポートします
  2. lem = WordNetLemmatizer()

lemmatizer を使用するには、.lemmatize() メソッドを使用します。単語とコンテキストの 2 つの引数が必要です。この例では、コンテキストとして「v」を使用します。 .lemmatize() メソッドの出力を確認した後、コンテキストをさらに詳しく調べましょう。

  1. print(lem.lemmatize( 'constitutes' , 'v' ))

.lemmatize() メソッドが単語「constitutes」をその基本形「constitute」に正しく変換していることがわかります。また、アルゴリズムがより複雑なため、レマタイズ化はステミングよりも時間がかかることにも気づくでしょう。

.lemmatize() メソッドの 2 番目の引数をプログラムで決定する方法を確認しましょう。 NLTK には、文中の単語のコンテキストを判断するのに役立つ pos_tag() 関数があります。しかし、まずは

averaged_perceptron_tagger NLTK ダウンローダーからリソースをダウンロードします。

  1. nltk.download( '平均パーセプトロンタガー' )

次に、pos_tag() 関数をインポートし、文に対して実行します。

  1. nltk.tagからpos_tag をインポート
  2. sample = "こんにちは、素敵なホテルですね。"  
  3. print(pos_tag(word_tokenize(サンプル)))

出力はペアのリストであることがわかります。各ペアはトークンとそのタグで構成され、テキスト全体におけるトークンのコンテキストを表します。句読点自体のラベルは次のようになります。

  1. [( 'こんにちは' , 'NNP' ),
  2. ( ',' ',' )、
  3. ( 'これ' 'DT' )、
  4. ( 'is' 'VBZ' )、
  5. ( 'a' 'DT' )、
  6. ( '素敵' 'JJ' )、
  7. ( 'ホテル' , 'NN' ),
  8. ( '.' '.' )]

各トークンのコンテキストをどのようにデコードしますか? Web 上のすべてのタグとそれに対応する意味の完全なリストを以下に示します。すべての名詞タグは「N」で始まり、すべての動詞タグは「V」で始まることに注意してください。この情報は、.lemmatize() メソッドの 2 番目の引数で使用できます。

  1. def lemmatize_tokens(ステンス):
  2. レマタイザー = WordNetLemmatizer()
  3. lemmatized_tokens = []
  4. 単語の場合pos_tag(文)タグ:
  5. タグが( 'NN' )で始まる場合:
  6. 位置 = 'n'  
  7. elif tag.startswith( 'VB' ):
  8. 位置 = 'v'  
  9. それ以外
  10. 位置 = 'a'  
  11. lemmatized_tokens.append(lemmatizer.lemmatize(単語、位置))
  12. lemmatized_tokensを返す
  13.  
  14. sample = 「法的権限はすべての治安判事を構成する。」  
  15. print(lemmatize_tokens(word_tokenize(sample)))

上記のコードの出力は次のようになります。

  1. [ 「法的」 「権威」 「構成する」 「すべて」 「治安判事」 「。」 ]

この出力は予想通りであり、「constitutes」と「magistrates」はそれぞれ「constitute」と「magistrate」に変換されています。

ステップ3: データのクリーニング

データを準備する次のステップは、データをクリーンアップし、分析に意味のないものを削除することです。大まかに言えば、分析から句読点やストップワードを削除することを検討します。

句読点を削除するのはかなり簡単な作業です。ライブラリの句読点オブジェクト文字列には、すべての英語の句読点が含まれています。

  1. インポート文字列
  2. print(文字列.句読点)

このコード スニペットの出力は次のようになります。

  1. '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'  

トークンから句読点を削除するには、次のコマンドを実行します。

  1. トークン内のトークンの場合:
  2. 文字列内のトークンの場合。句読点:
  3. # 何かをする

次に、ストップワードの削除に焦点を当てます。ストップワードは、「I」、「a」、「the」など、言語でよく使用される単語であり、テキストを分析する際にほとんど意味を追加しません。したがって、分析からストップワードを削除します。まず、NLTK ダウンローダーからストップワード リソースをダウンロードします。

  1. nltk.download( 'ストップワード' )

ダウンロードが完了したら、nltk.corpus からストップワードをインポートし、引数として「english」を指定して .words() メソッドを使用します。以下は 179 個の英語ストップワードのリストです。

  1. nltk.corpusからストップワードをインポート
  2. stop_words = stopwords.words( '英語' )

このセクションで説明した概念とレマタイズの例を組み合わせて、次の関数 clean_data() を作成できます。さらに、単語がストップワード リストに含まれているかどうかを比較する前に、単語を小文字に変換します。この方法では、ストップワードが文の先頭に現れ、大文字で書かれていても、それをキャプチャすることができます。

  1. def clean_data(トークン、stop_words = ()):
  2.  
  3. クリーンアップされたトークン = []
  4.  
  5. pos_tag(tokens)トークン、タグ場合:
  6. タグが"NN"で始まる場合:
  7. 位置 = 'n'  
  8. elif tag.startswith( 'VB' ):
  9. 位置 = 'v'  
  10. それ以外
  11. 位置 = 'a'  
  12.  
  13. レマタイザー = WordNetLemmatizer()
  14. トークン = lemmatizer.lemmatize(トークン, pos)
  15.  
  16. トークンがない場合  string.punctuationtoken.lower ( )では  stop_words:
  17. cleaned_tokens.append(トークン)
  18. cleaned_tokensを返す
  19.  
  20. sample = "素早い茶色のキツネが怠け者の犬を飛び越えます。"  
  21. stop_words = stopwords.words( '英語' )
  22.  
  23. clean_data(word_tokenize(サンプル), stop_words)

この例の出力は次のようになります。

  1. [ '素早い' '茶色' 'キツネ' 'ジャンプ' '怠け者' '犬' ]

ご覧のとおり、句読点とストップワードは削除されています。

単語の頻度分布

NLP の基本的なクリーニング手法について理解できたので、テキスト内の単語の頻度を調べてみましょう。この演習では、グーテンベルクが無料で公開した童話「ネズミと鳥とソーセージ」のテキストを使用します。このおとぎ話のテキストを文字列 text に保存します。

まず、テキストでトークン化し、上で定義した clean_data 関数を使用してクリーンアップします。

  1. トークン = word_tokenize(テキスト)
  2. cleaned_tokens = clean_data(トークン、stop_words = stop_words)

テキスト内の単語の頻度分布を調べるには、FreqDistNLTK クラスを使用できます。トークンをパラメータとして使用してクラスを初期化します。次に、.most_common() メソッドを使用して共通の用語を検索します。この場合、上位 10 項目を見つけてみましょう。

  1. nltkからFreqDistをインポート
  2.  
  3. freq_dist = FreqDist(クリーン化されたトークン)
  4. 頻度分布.最も共通(10)

このおとぎ話でよく使われる用語を 10 個紹介します。

  1. [( '鳥' , 15),
  2. 「ソーセージ」 、11)、
  3. ( 'マウス' 、8)、
  4. 「木」 、7)、
  5. 「時間」 、6)、
  6. ( '長い' 、 5)、
  7. 「作る」 、5)、
  8. 「飛ぶ」 、4)、
  9. ( 'フェッチ' 、4)、
  10. 「水」 、4)]

当然のことながら、最もよく使われた 3 つの単語は、おとぎ話の 3 人の主人公の名前でした。

テキストを分析する場合、単語の頻度はあまり重要ではない場合があります。通常、NLP の次のステップは、ドキュメントのリスト内の単語の重要性を表す統計、つまり TF-IDF (Term Frequency-Inverse Document Frequency) を生成することです。

結論は

このチュートリアルでは、まず Python での自然言語処理について見ていきます。テキストをトークンに変換し、単語を基本形に変換し、最後にテキストをクリーンアップして、分析に意味のない部分を削除します。

このチュートリアルでは簡単な NLP タスクを学習しましたが、探索すべきテクニックは他にもたくさんあります。たとえば、テキスト データに対してトピック モデリングを実行し、テキストで取り上げられている可能性のある共通のトピックを見つけることを目標とする場合があります。 NLP におけるより複雑なタスクは、感情分析モデルを実装して、テキストの背後にある感情を判断することです。

<<:  音声分析:自動運転車の鍵となる技術

>>:  LSTM ニューラルネットワークを使用して株価の動向を予測する

ブログ    
ブログ    
ブログ    

推薦する

2つのセッションは「AI顔認識」と生体認証データの法制化と規制の緊急の必要性に焦点を当てています。

[[385416]]現在、両セッションは活発に行われており、全国のさまざまな分野の代表者が独自の提...

Redditのネットユーザーが議論中!コンピューティング能力とデータは本当にすべてを解決できるのでしょうか?

誰もが知っているように、コンピューティング能力とデータは非常に重要ですが、それだけで十分でしょうか?...

AIが地震の前兆信号を識別?機械学習がデータ内の不思議な相関関係を発見、人類に地震予測の希望を与える

最近、世界中で地震が頻繁に発生しています。 1月1日、突然、マグニチュード7.6の地震が日本を襲い、...

25倍のパフォーマンス向上: RustはCとC++に取って代わり、機械学習のPythonバックエンドとして好まれるようになると期待されています。

機械学習開発の分野では、全体像を見て細かい詳細をすべて取り除くと、機械学習開発における不変の 2 つ...

2020年に人工知能がIT業界を変える

21 世紀は人類史上刺激的な時代であり、人々の日常生活に技術の進歩が起こっています。今では、患者の健...

AIは「気質」に基づいて赤ちゃんの年齢と性別を正確に識別できる

PLOS ONE に掲載された新しい研究では、機械学習を使用して 4,438 人の乳児の「気質」デー...

...

...

...

Google は人工知能の分野で「堀」を持っていないのでしょうか?

少し前、匿名の人物が、Google 社内の研究者による研究メモを Discord プラットフォームに...

4つの主要な応用分野が開拓され、外骨格ロボットのブルーオーシャンが出現している

現在、ロボット産業の急速な発展に伴い、ロボット製品システムはより完成度が高まり、その用途も多様化して...

GPT-2からGPT-4まで、大規模言語モデルの革新を探る

翻訳者 |陳俊レビュー | Chonglou最近では、大規模言語モデル ( LLM )を使用して、書...

ChatGPT 素晴らしいアップデート! @300万GPTをあなたのために働かせましょう

一部の(Grayscale)ユーザーは次のようなプロンプトを受け取りました:グループ チャットで誰か...

セキュリティ分野におけるドローン技術応用の現状

[[422011]] 2013年、バハマで仕事をしていたとき、私は現在ドローンとして知られているもの...