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 ニューラルネットワークを使用して株価の動向を予測する

ブログ    
ブログ    

推薦する

Facebookの新しいAIモデルSE​​ERは自己教師学習を実現し、LeCunは最も有望だと称賛している

[[385451]]この記事はWeChatの公開アカウント「Xinzhiyuan」から転載したもので...

優秀なプログラマーが開発効率を上げるために知っておくべき32のアルゴリズム

検索アルゴリズム - 指定された開始点から指定された終了点までのパスを計算するグラフ検索アルゴリズム...

...

ディープラーニングタスクに最適な GPU を選択するにはどうすればよいでしょうか?

ディープラーニングは計算集約型の分野であり、GPU の選択によってディープラーニングの実験が根本的に...

...

AIOps によるネットワーク管理の一般的な方法

エンタープライズ NetOps チームは、大量の受信データを精査して、ネットワーク上で発生する技術、...

人工知能、機械学習、認知コンピューティングの入門

何千年もの間、人々はインテリジェントな機械を構築する方法について考え続けてきました。それ以来、人工知...

取り残された子どもたちを教育するのは難しい。AI教育はこの問題の解決に役立つだろうか?

[[251968]]最近、湖南省の12歳少年が母親を殺害したというニュースが報道され、遺児の教育問...

OpenAIがテキストから動画を生成するAIジェネレーター「Sora」をリリース

OpenAI が Sora をリリースし、テキストからビデオへの AI コンテンツ生成競争に参入。 ...

ナノロボットは本当に伝説通り魔法の力を持つのでしょうか?

「ナノロボット」は映画やSF小説に頻繁に登場するキャラクターで、何度も登場して驚くべきスキルを発揮...

金属の巨人からディープラーニングまで、人工知能の(ごく)短い歴史

[[202011]]クレタ島を海賊や侵略者から守るために、人々は巨大な青銅の戦士タロスを創造しました...

ファーウェイの孫茂陸氏:今後5年間で10億ドルを投資し、スマートエンタープライズサービスを構築する

上海で開催されたHUAWEI CONNECT 2019で、ファーウェイはエンタープライズサービス開発...

ビル・ゲイツ:AIが最大の影響を与えるには何十年もかかる

[[271684]]ビル・ゲイツは、世界を変えるトレンドを予見し、それを活用することで、史上最も成功...

注釈付きビデオの 1 フレームでセグメント機能を学習し、完全な監視パフォーマンスを実現できます。 Huake、時系列行動検出における新たなSOTAを達成

ビデオ内の興味深い部分を見つけるにはどうすればいいですか?時間的アクションローカリゼーション (TA...