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の千里の道のりは一歩から始まる

ブログ    

推薦する

ディープラーニングは他の画像処理アルゴリズムを置き換えることができますか?

近年、ディープラーニング技術の登場により、視覚画像処理はますます普及し、さまざまな分野で広く利用され...

ペット経済に乗って、ロボットアプリケーションが新しい市場を開拓

[[391010]]昨今、都市化の加速と生活水準の向上に伴い、ペットを飼うことがますます多くの人々の...

Tech Neo 9月号:アルゴリズムに基づくIT運用・保守

51CTO.com+プラットフォームは、オリジナルの技術コンテンツの選択と絶妙なレイアウトを通じて、...

...

4Paradigm が分子特性予測のための生成型 3D 事前トレーニング済みモデルを開発

論文タイトル: 分子特性予測のための自動 3D 事前トレーニング論文リンク: https://arx...

脳コンピューターインターフェース技術は本当に人気がある

[[274622]]参加者は脳波計を装着し、コンピューターの画面を見つめながら、急速に点滅するターゲ...

...

私の国のドローンは新たな段階に入り、成熟した開発にはまだ3つのレベルを通過する必要があります

[[428031]]先日の建国記念日、ドローンは間違いなく「最もクールな存在」でした。交通の補助、景...

メタは昨年、同社への信頼の欠如によりAI研究者の3分の1を失った。

6月19日、MetaのCEOマーク・ザッカーバーグ氏は人工知能の分野に多額の投資を行っていたが、人...

...

ガートナー:今後2年間で、テクノロジープロバイダーの3分の1がAIに100万ドル以上を投資する

9月30日、ガートナーの最近の調査によると、人工知能技術計画を持つテクノロジーおよびサービスプロバイ...

負荷分散スケジューリングアルゴリズムを見てみましょう

[[122758]]ロード ホストは、スケジューリング メソッドまたはアルゴリズムと呼ばれる多くの負...

...

...

ドローンのアフターサービス市場の改善が必要

最近、ニュースの表紙でドローンが人を負傷させたというニュースが報道され、ネットワーク全体の注目を集め...