Scikit-learn を使用して機械学習用のテキストデータを準備する方法

Scikit-learn を使用して機械学習用のテキストデータを準備する方法

[[208625]]

テキスト データを使用して予測モデルを構築する前に、特別な準備が必要です。

まずテキストを解析して単語を抽出します。このプロセスはトークン化と呼ばれます。次に、単語を機械学習アルゴリズムへの入力として整数値または浮動小数点値にエンコードする必要があります。このプロセスは特徴抽出 (または量子化) と呼ばれます。

scikit-learn は、テキスト データをトークン化して特徴を抽出するのに役立つシンプルなツールを提供します。

この記事では、scikit-learn を使用して Python で機械学習用のテキスト データを準備する方法を学びます。

この記事を読むと、次のことがわかります。

  • CountVectorizer を使用してテキストを単語頻度ベクトルに変換する方法。
  • TfidfVectorizer を使用してテキストの単語重みベクトルを抽出する方法。
  • HashingVectorizer を使用してテキストを特徴インデックスにマッピングする方法。

始めましょう。

バッグ・オブ・ワード・モデル

機械学習アルゴリズムを使用する場合、テキストを直接操作することはできません。代わりに、テキストを数字に変換する必要があります。

ドキュメントを分類する場合、各ドキュメントは「入力」として機能し、ドキュメントのカテゴリ ラベルは予測アルゴリズムの「出力」になります。このアルゴリズムは入力として数値ベクトルのみを受け入れることができるため、ドキュメントを固定長の数値ベクトルに変換する必要があります。

機械学習の分野には、テキスト文書に適したシンプルで効果的なモデルがあります。これは、Bag-of-Words モデル、略して BOW と呼ばれます。

このモデルの単純な点は、単語内のすべての連続情報を破棄し、主に文書内の単語の出現頻度に焦点を当てていることです。

これは、各単語に一意の番号を割り当てることによって実現できます。このようにして、私たちが目にするあらゆる文書は、既知の単語の語彙の長さである固定長のベクトルにエンコードできます。このベクトルの各位置の値は、エンコードされたドキュメント内で各単語が出現する回数、つまり頻度です。

これは「単語の袋」モデルであり、順序に関する情報を考慮せずに、文書にどの単語が出現するか、またはエンコードされた文書に単語がどのくらいの頻度で出現するかを表すエンコード方法のみを考慮します。

この単純なアプローチには、"単語" の意味をより適切に説明し、各単語がベクトル内でどのようにエンコードされるかを定義するための多くの拡張があります。

scikit-learn では 3 つの異なるメソッドが提供されており、それぞれについて簡単に見ていきます。

CountVectorizer — 単語数を定量化する

CountVectorizer は、テキスト ドキュメントのデータセットをトークンに変換して既知の単語の語彙を構築するだけでなく、その語彙を使用して新しいテキストをエンコードする簡単な方法を提供します。

使い方は次のとおりです:

  1. CountVectorizer クラスのインスタンスを作成します。
  2. fit() 関数を呼び出して、学習を通じて 1 つ以上のドキュメントから語彙を導出します。
  3. 1 つ以上のドキュメントに transform() 関数を適用し、各ドキュメントをベクトルにエンコードします。

エンコードされたベクトルは、語彙全体の長さと、各単語がドキュメント内に出現する回数を返します。

これらのベクトルには多くのゼロ値が含まれているため、スパースと呼ばれます。 Python は、scipy.sparse ライブラリでこのようなスパース ベクトルを処理する効率的な方法を提供します。

transform() を呼び出すことによって返されるベクトルはスパース ベクトルです。これを、より直感的で理解しやすい numpy 配列に変換できます。これは、toarray() 関数を呼び出すことによって実行できます。

以下は、CountVectorizer を使用してトークン化し、語彙を構築し、ドキュメントをエンコードする例です。

  1. sklearn.feature_extraction.textからCountVectorizer をインポートします
  2. # テキストドキュメントリスト
  3. text = [ "素早い茶色のキツネが怠け者の犬を飛び越えた。" ]
  4. # 変換関数を構築する
  5. ベクターライザー = CountVectorizer()
  6. # トークン化と語彙の構築
  7. ベクトル化器.fit(テキスト)
  8. # 要約
  9. 印刷(vectorizer.vocabulary_)
  10. # ドキュメントのエンコード
  11. ベクトル = vectorizer.transform(テキスト)
  12. # コーディングドキュメントを要約する
  13. 印刷(ベクトル.形状)
  14. print(type(ベクトル))
  15. 印刷(ベクトルを配列に書き込む())

上記の例からわかるように、語彙を使用してトークン化されているものを確認できます。

  1. 印刷(vectorizer.vocabulary_)

ご覧のとおり、デフォルトではすべての単語が小文字になり、句読点は無視されます。これらのパラメータとトークン化のその他の側面は構成可能であり、API ドキュメントですべてのオプションを確認することをお勧めします。

例を実行すると、最初に語彙が印刷され、次にエンコードされたドキュメントの形状が印刷されます。語彙には 8 個の単語があるため、エンコードされたベクトルの長さは 8 であることがわかります。

エンコーディング ベクトルはスパース行列であることがわかります。最後に、エンコードされたベクトルを配列の形式で確認すると、インデックス 7 の単語のカウントが 2 であるのを除き、各単語のカウントが 1 であることがわかります。

  1. { '犬' : 1、 'キツネ' : 2、 'オーバー' : 5、 '茶色' : 0、 '素早い' : 6、 'その' : 7、 '怠け者' : 4、 'ジャンプした' : 3}
  2. (1、8)
  3. <クラス'scipy.sparse.csr.csr_matrix' >
  4. [[1 1 1 1 1 1 1 2]]

重要なのは、量子化法は語彙に含まれない単語を含む文書にも使用できることです。これらの単語は無視され、結果のベクトルには出現回数は表示されません。

以下は、上記のトークナイザーを使用して、語彙に含まれる単語 1 つと語彙に含まれない単語 1 つを含むドキュメントをエンコードする例です。

  1. # 他のドキュメントをエンコードする
  2. text2 = [ "子犬" ]
  3. ベクトル = vectorizer.transform(text2)
  4. 印刷(ベクトルを配列に書き込む())

例を実行すると、エンコードされたスパース ベクトルのマトリックス表現が出力され、語彙内の単語は 1 回出現し、語彙外の単語は完全に無視されることが示されます。

  1. [[0 0 0 0 0 0 0 1]]

エンコードされたベクトルは、機械学習アルゴリズムで直接使用できます。

TfidfVectorizer - 単語の重みを計算する

単語の出現回数をカウントすることは良い出発点ですが、非常に基本的な機能でもあります。

単純な頻度カウントの問題の 1 つは、「the」などの一部の単語が何度も出現し、そのカウントがエンコーディング ベクトルにとってあまり意味がないことです。

別の方法としては、単語の重みを数えることです。現在最も人気のある方法は TF-IDF です。これは「Term Frequency–Inverse Document Frequency」の頭字語であり、文書に対する単語の重要度を表します。

用語の頻度: 特定の単語が文書内に出現する回数を指します。

逆文書頻度: 文書内で単語が頻繁に出現するほど、IDF 値は低くなります。

数学的なことはさておき、TF-IDF は単語に重みを与え、特定のドキュメントにのみ頻繁に出現するがすべてのドキュメントに出現するわけではない単語など、より興味深い単語にマークを付けます。

TfidfVectorizer は、ドキュメントをトークン化し、語彙と逆ドキュメント頻度重みを学習し、新しいドキュメントをエンコードできます。あるいは、CountVectorizer を使用してすでにベクトルを学習している場合は、Tfidftransformer を使用して逆ドキュメント頻度を計算し、ドキュメントのエンコードを開始できます。

同様に、create、fit、および transform 関数の呼び出しは、CountVectorizer の場合と同じです。

以下は、TfidfVectorizer を使用して 3 つの小さなドキュメントの語彙と逆ドキュメント頻度を学習し、ドキュメントの 1 つをエンコードする例です。

  1. sklearn.feature_extraction.textからTfidfVectorizer をインポートします
  2. # テキストドキュメントリスト
  3. text = [ "素早い茶色のキツネが怠け者の犬を飛び越えた。" ,
  4. 「犬。
  5. 「キツネ
  6. # 変換関数を作成する
  7. ベクターライザー = TfidfVectorizer()
  8. # トークン化して語彙を作成する
  9. ベクトル化器.fit(テキスト)
  10. # 要約
  11. 印刷(vectorizer.vocabulary_)
  12. 印刷(vectorizer.idf_)
  13. # ドキュメントのエンコード
  14. ベクトル = vectorizer.transform([text[0]])
  15. # コーディングドキュメントを要約する
  16. 印刷(ベクトル.形状)
  17. 印刷(ベクトルを配列に書き込む())

上記の例では、ドキュメントから 8 語の語彙を学習し、各単語に出力ベクトル内の一意の整数インデックスを割り当てました。

私たちは語彙内の各単語の逆文書頻度を計算し、最も頻繁に観察される単語「the」(インデックス 7)に満点のスコア 1.0 を割り当てました。

最後に、最初のドキュメントは 8 要素のスパース マトリックスにエンコードされ、各単語の最終的な重みスコアを確認すると、「the」、「fox」、「dog」の値が語彙内の他の単語と異なることがわかります。

  1. { 'キツネ' : 2、 '怠け者' : 4、 '犬' : 1、 '素早い' : 6、 'その' : 7、 '以上' : 5、 '茶色' : 0、 '飛び上がった' : 3}
  2. [ 1.69314718 1.28768207 1.28768207 1.69314718 1.69314718 1.69314718
  3. 1.69314718 1. ]
  4. (1、8)
  5. [[ 0.36388646 0.27674503 0.27674503 0.36388646 0.36388646 0.36388646
  6. 0.36388646 0.42983441]]

これらのスコアは 0 から 1 の間の値に正規化され、エンコードされたドキュメント ベクトルはほとんどの機械学習アルゴリズムで直接使用できます。

HashingVectorizer — ハッシュ量子化テキスト

単語の頻度と重みは便利ですが、語彙が多くなると制限が出てきます。

こうすると、ドキュメントをエンコードするために巨大なベクトルが必要になり、メモリを大量に消費してアルゴリズムの速度が低下します。

良い方法は、一方向ハッシュ方式を使用して単語を整数に変換することです。この方法の利点は、語彙を必要とせず、任意の長さの固定長ベクトルを選択できることです。欠点は、ハッシュが一方向であるため、エンコードを単語に戻すことができないことです (これは多くの教師あり学習タスクでは重要ではない可能性があります)。

HashingVectorizer クラスはこのメソッドを実装しているので、これを使用して単語を継続的にハッシュし、必要に応じてドキュメントをトークン化してエンコードすることができます。

以下は、HashingVectorizer を使用して単一のドキュメントをエンコードする例です。

固定長 20 の任意のベクトルを選択しました。この値はハッシュ関数の範囲に対応しており、小さい値(20 など)ではハッシュ衝突が発生する可能性があります。以前のコンピュータ サイエンスのコースでは、推定語彙サイズに基づいてハッシュ長と衝突確率を選択するためのいくつかのヒューリスティック アルゴリズムを紹介しました。

この量子化方法では、トレーニング データ ファイルに適合させるための関数を呼び出す必要がないことに注意してください。代わりに、インスタンス化後、ドキュメントを直接エンコードするために使用できます。

  1. sklearn.feature_extraction.textからHashingVectorizer をインポートします
  2. # テキストドキュメントリスト
  3. text = [ "素早い茶色のキツネが怠け者の犬を飛び越えた。" ]
  4. # 変換関数を作成する
  5. ベクターライザー = HashingVectorizer(n_features=20)
  6. # ドキュメントのエンコード
  7. ベクトル = vectorizer.transform(テキスト)
  8. # コーディングドキュメントを要約する
  9. 印刷(ベクトル.形状)
  10. 印刷(ベクトルを配列に書き込む())

このサンプル コードを実行すると、サンプル ドキュメントが 20 個の要素を持つスパース マトリックスにエンコードされます。

エンコードされたドキュメントの値は正規化された単語数に対応し、デフォルトでは -1 ~ 1 の間ですが、整数数に設定するようにオーバーライドできます。

  1. (1、20)
  2. [[ 0. 0. 0. 0. 0. 0.33333333
  3. 0. -0.33333333 0.33333333 0. 0. 0.33333333
  4. 0. 0. 0. -0.33333333 0. 0.
  5. -0.66666667 0. ]]

さらに読む

このセクションでは、この記事に関する詳細な読み物を提供します。

自然言語処理

  • Wikipedia の Bag-of-words モデルの紹介。
  • Wikipedia のトークン化の概要。
  • Wikipedia「TF-IDF」。

サイキットラーン

  • scikit-learn マニュアル、セクション 4.2、特徴抽出。
  • sckit-learn 特徴抽出 API。
  • scikit-learn チュートリアル: テキスト データ処理。

クラスAPI

  • CountVectorizer scikit-learn API
  • TfidfVectorizer scikit-learn API
  • TfidfTransformer scikit-learn API
  • ハッシュベクター化 scikit-learn API

要約する

このチュートリアルでは、scikit-learn を使用して機械学習用のテキスト データを準備する方法を学習します。

これらの例では表面をなぞったに過ぎませんが、これらのクラスの設定には、ドキュメントのトークン化の結果に影響する多くの詳細があり、調査する価値があることを強調したいと思います。

<<:  Google Brain エンジニアの講演: TensorFlow とディープラーニング

>>:  AIの千里の道のりは一歩から始まる

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

中国科学院自動化研究所は、科学サブジャーナル「自己組織化バックプロパゲーションがネットワーク学習効率を向上」を出版した。

[[430306]]人工知能の分野では、現在人工ニューラルネットワークで広く使用されているバックプ...

...

どこにでもAI?小売業における 10 のエキサイティングな AI アプリケーション

[[311856]]小売業における当社の中核的な経験は、近年ほとんど変わっていません。店舗(またはオ...

1つの記事で基本モデルの定義と動作原理を理解する

翻訳者 |ブガッティレビュー | Chonglou 1.基本モデルの定義ベースモデルは、大量のデータ...

ペンシルバニア大学の最新研究:AI はアイデア生成において人間よりも 7 倍効率的であり、GPT の創造力は人間の 99% を上回ります。

囲碁からゲームのプレイ、さまざまな反復作業の完了まで、AI の能力は多くの面で人間をはるかに上回って...

文部科学省が文書を発表:AI、アルゴリズム等が2018年度から高等学校の教育課程に取り入れられる!

教育部はこのほど記者会見を開き、「高等学校一般教育課程計画及び中国語等教科教育課程基準(2017年版...

...

llama.cppを勉強した後、携帯電話で大規模なモデルを実行するのはとても簡単だと分かりました

最近、オープンソース コミュニティでは、大規模モデルの最適化手法を模索する人が増えています。 LLa...

清華大学・黄敏烈氏:GoogleのAI人格は本当に目覚めたのか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

人工知能は匿名のチェスプレイヤーの身元を確認でき、プライバシーの脅威となる

人工知能技術はすでに音声や手書きを通じて個人の身元を確認することができます。現在、人工知能アルゴリズ...

GenAI の投資が 2024 年にデータセンターにどのような変化をもたらすか

私たちは、日常の習慣から抜け出し、長い間待ち望まれていた自分自身を変えるために、ちょっとしたモチベー...

15人の専門家が予測:AIは2024年にサイバーセキュリティのルールを変える

AI技術の飛躍的な発展に伴い、攻撃者はAIの武器化を加速させ、ソーシャルエンジニアリング技術と組み合...

Keras 機能 API によるディープラーニング

[[380280]] Keras Python ライブラリを使用すると、ディープラーニング モデルを...

Pytorch の核心であるモデルの定義と構築を突破しましょう! ! !

こんにちは、Xiaozhuangです!今日はモデルの定義と構築についてお話ししましょう。初心者に最適...

...