テキストデータを処理する[翻訳済み](チュートリアル3 scikit学習)


オリジナルURLます。http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html
翻訳:Taceyウォン
時間:2016年9月25日


このチュートリアルの主な目的は、主なツールは、文書の20件のさまざまなトピックを、関連するデータ処理を含む解析することにより、これを中国scikit-学ぶ紹介するこの実用的なタスクのコレクションです。

この章では、表示されます。

  • ファイルの内容とディレクトリをロードする方法
  • 機械学習用特徴ベクトルを抽出する方法
  • 分類する線形モデルを訓練する方法
  • 分類特徴抽出グリッド間の検索戦略を使用して、より良い設定を見つける方法

チュートリアルの準備

このチュートリアルを開始するには、まずscikit学習をインストールし、それに関連するコンピュータに依存しなければなりません。

異なるシステムのインストールの詳細については、インストール手順を参照してください。

このチュートリアルのソースコードは、あなたのscikit-学ぶフォルダで見つけることができます
bash scikit-learn/doc/tutorial/text_analytics/

チュートリアルフォルダはフォルダに関する含まれている必要があります。

  • *.rst 文件- ソースコードのスフィンクスのチュートリアルドキュメント
  • data- チュートリアルフォルダに使用される場所のデータセット
  • skeletons- 不完全なサンプルの行使のために準備します

あなたもすることができskeletons、ハードドライブ上の任意の場所にあることと名前LV sklearn_tut_workspaceそれが元のファイルを破壊しないであろう、それはあなたがどんな練習を編集することができますいずれかのように:

$ cp -r skeletons <工作目录>/sklearn_tut_workspace

機械学習アルゴリズムは、各入力するデータを必要と$TUTORIAL_HOME/dataサブフォルダランああfetch_data.py(あなたがスクリプトを実行する前に、内容を見ることができます)スクリプトを。

例えば:

$ cd $TUTORIAL_HOME/data/languages
$ less fetcg_data.py
$ python fetch_data.py

負荷20件のニュースグループのデータセット

データ・セットの名前は、以下の公式サイトからのアプリケーションの記述である「二十Nesgroups」であります

20のニュースグループのデータセットは、おそらく彼の紙に、広いほぼ20種類のニュースグループ我々の知る限り、それは元々ケン・ラングによって収集された、ニュースグループの書類を2000年のコレクション近づいているされて:.「Newsweederを:彼は明示的にデータの収集を言及しなかったものの」、フィルタリングニュースを学ぶことが実験技術における機械学習アプリケーションで0.20ニュースグループのテキストを設定することは一般的なデータ・セットとなっています。

次は、組み込みのデータローダ20のニュースグループにscikit-学ぶのセットを使用します。また、また使用、Webサイトのデータ収集から直接ダウンロードすることができますsklearn.datasets.load_filesで解凍したフォルダをロードする機能を20news-bydata-trainサブフォルダ。

最初の例では、実行時間のより多くのブロックを得るために、我々は、この実験にクラス変異体の24種類を選出します。


>>> categoties = ['alt.altheism','soc.religion.christian',
                                'comp.graphics','sci.med']

私たちは今、次の書類を上記のリストに一致するロードできます。

>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty_train = fetch_20newsgroups(subset = 'train',
                                 categories = categories,shuffle = True,
                                 random_state = 42)

これは、データセットが返さscikit-learnPythonで搬送オブジェクトができ:「ビーム」dict,.例えば、更なるオブジェクトのプロパティを容易にするために、キーアクセスtarget_nameクラス名のリストを格納します。

>>> twenty_train.target_name
['alt.altheism','soc.religion.christian', 'comp.graphics','sci.med']

ファイル自体がメモリにロードされ、に保存されたdataファイル名でインデックスすることもできます。

>>> len(twenty_train.data)
2257
>>> len(twenty_train.filenames)
2257

私たちは、最初の最初の行にロードされたファイルをプリントアウトしてみましょう

>>> print("\n".join(twenty_train.data[0].split("\n")[:3]))
From: [email protected] (Michael Collier)
Subject: Converting images to HP LaserJet III?
Nntp-Posting-Host: hampton
>>> print(twenty_train.target_names[twenty_train.target[0]])
comp.graphics

教師付き学習アルゴリズムは、各文書が分類ラベルを対応の訓練セットを持っていることが必要です。したがって、ニュースグループのクラス名は、文書カテゴリフォルダの名前であることを起こります。

速度及び空間、のためscikit-learnに対応する整数の特定の性質、ロードされたアレイのメンバー、target_names_list各サンプルのインデックスタイプ名分類整数ID格納されている。targetプロパティ:

>>> twenty_train.target[:10]
array([1, 1, 3, 3, 3, 3, 3, 2, 2, 2])

次のような名前は、再取得に分類することができます。

>>> for t in twenty_train.target[:10]:
            print(twenty_train.target_names[t])
comp.graphics
comp.graphics
soc.religion.christian
soc.religion.christian
soc.religion.christian
soc.religion.christian
soc.religion.christian
sci.med
sci.med
sci.med

あなたはすぐにあなたがデータセット全体の後の前に研修でいくつかのインスピレーションと啓示を得ることができるので非常に便利であるモデルを訓練するためにのみ最初のサンプルを選択した場合:あなたは、ランダムなサンプルがソートされている気づいているかもしれません。

テキストファイルから特徴を抽出します

テキスト文書に機械学習を適用するために、我々は、第1のデジタル特徴ベクトルにテキストを変換する必要があります。

言葉のバッグ

最も簡単な方法は、袋の文言を表明することにあります。

  • トレーニングセットにおける単語のそれぞれについて1は、任意の文書が割り当てられる(例えば、ワードマッピング辞書整数を構築するために)処理された整数IDを表示さ
  • 2.各文書について#i、各ワード数wにおける出現回数、および格納するX[i,j]特性#j値、j単語であるw辞書のインデックスを。

言葉の表現のバッグは、n_featuresこの図が100,000より一般的に大きい:別の言葉でライブラリの数が予想されます。

場合はストレージアレイは、今日の一般的なコンピュータ処理はほぼ不可能メモリの10000 X 100000 X = 4GバイトをFLOAT32 numpyの必要があります。n_samples = 10000X

ので、幸いなことに、原因特定の文書に、唯一未満2000個の異なる単語が、使用されますX中的大多数值会是零ので、我々は、一般的に言葉高次元の疎なデータセットのバッグと呼ばれるこのような理由で。私たちは、メモリに格納されたベクトルのみを特徴とすることができます非ゼロ要素は、このように多くのメモリを節約できます。

scikit学習テキストマークを使用して、

scikit学習では、予めテキスト、数字、ストップワードフィルタリングレベルのコンポーネントが組み立てられ、変換辞書特徴ベクトルと文書の機能を構築することができます。

>>> from sklearn.feature_extraction.text import COuntVectorzier
>>> count_vect = CountVectorizer()
>>> x_train_counts = count_vect.fit_transform(twenty_train.data)
>>> x_train_counts.shape
(2257, 35788)

CountVectorizerサポート単語やNの文字の単語列(N-グラム)を1回カウントするように適合された、ベクトルコンバータ(ベクトライザー)は、辞書機能表示を構築しています:

>>> count_vect.vocabulary_.get(u'algorithm')
4690

全体の訓練の周波数に対応するインデックス値の語彙の単語は、そのライブラリに表示することが予想されます。

周波数から周波数へ

周波数カウントは良いスタートですが、少し問題があります:短い文書に比べ、長い文書は、彼らが同じトピックについて話をすることができるにもかかわらず、商品のより高い値がカウントされています。

これらの潜在的なバイアスを避けるために、それはすべてのドキュメントと単語が文書に表示された回数で割っすることができます。この新しい機能が呼び出されtf、つまり、文档频率(Term Frequencies)

ではtf、これらの言葉が少ないことを示すカテゴリ情報によって運ば小さな言語ライブラリの文書にのみ出現する単語と比較するための正しい方法の上側のさらなる改良、文書内の単語のほとんどの予想される困難を軽減することであるが、重く見えます。

このアプローチは、右のダウンと呼ばれているtf-idfことを意味します、文档频率-逆文档频率(Term Frequency times Inverse Document Frequency)

tfそして、tf-idf次のように計算することができます。

>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> tf_transformer = TfidfTransformer(use_idf = False).fit(X_train_counts)
>>> x_train_tf = tf_transformer.transform(X_train_counts)
>>> x_train_tf.shape
(2257,35788)

上記のサンプルコードでは、まず使用しfit(...)、その後、データのアプリケーションを評価する方法をtransform(...)フォームに変換する。これらの二つの工程を組み合わせることができ、冗長な処理を高速化するためにスキップされる方法カウントが私達の証拠場合TFを、参照しますこれは次を使用することができるように同じ最終結果が得られるfit_transform(...)実装する方法。

>>> tfidf_transformer = TfidfTransformer()
>>> x_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
>>> x_train_tfidf.shape
(2257,35788)

分類器をトレーニング

今、私たちは私たちの特性を持っていることを、私たちは、物品のカテゴリを予測しようとする分類器を訓練することができます。のは、ミッションが良いベースラインを提供配向させることができる単純ベイズ分類器を、使用してみましょう.`scikit-この変形は、単語の最も適した形式はバリアント多項式を計数し、分類を学ぶの複数を含みます:

>>> from sklearn.baive_bayes import MultinomialNB
>>> clf = MultinomiaNB().fit(X_train_tfidf,twenty_train.target)

新しい文書を予測しようとするために、我々はそれを除いてほぼ同じ特徴を抽出する特徴抽出処理の前でそのような何かを必要とするここでは、変換を行うために時間を使う。transform代替fit_transform、彼らがトレーニングセットに適応してきたので:

>>> dics_new = ['God is love','OpenGL on the GPU is fast']
>>> x_new_counts = count_vect.transform(docs_new)
>>> x_new_tfidf = tfidf_transformer.transform(x_new_counts)
>>> predicted = clf.predict(x_new_tfodf)
>>> for doc ,category in zip(docs_new,predicted):
            print("%r -> %s" % (doc,twenty_train.target_names[category]))
'God is love' => soc.religion.christian
'OpenGL on the GPU is fast' => comp.graphics

パイプラインの建設

するために量子化 => 変換 => 分類プロセス全体を扱いやすい、scikit-learn提供してPipeline分類器としての機能に合わせて、クラスを:

>>> from sklearn.pipeline importPipeline
>>> text_clf = Pipeline([('vect', CountVectorizer()),
                                        ('tfidf', TfidfTransformer()),
                                        ('clf', MultinomialNB()),])

どこでvecttfidfそしてclf(分類)の命名法は非常に任意である、我々は彼らが私たちが今だけ我々のモデルを訓練するために単一のコマンドを使用することができ、次の章のグリッドサーチに使用されるはずです。:

>>> text_clf = text_clf.fit(twenty_train.data, twenty_train.target)

テストセットの性能評価

予測精度の評価モデルも非常に簡単です:

>>> import numpy as np
>>> twenty_test = fetch_20newsgroups(subset'test',
                                categories = categories,shuffle = True,
                                random_state = 42)
 >>> docs_test = twenty_test.data
 >>> predicted = text_clf.predict(docs_test)
 >>> np.mean(predicted == twenty_test.target)
 0.834

量、我々は予測精度の83.4パーセントを取得します。のは、線形サポートベクターマシン(SVM)の使用を見てみましょうされていない、それが良い結果を.SVMが広く、それはに比べても最高のテキスト分類アルゴリズムの一つ(とみなされてしまいますナイーブベイズ少し遅い)私たちは、単にオブジェクトの異なる分類を挿入することによって、「学習者」を変更するには、当社のパイプラインに行くことができます:

>>> from sklearn.linear_model import SGDClassifier
>>> text_clf = Pipeline([('vect', CountVectorizer()),
                     ('tfidf', TfidfTransformer()),
                     ('clf', SGDClassifier(loss='hinge', penalty='l2',
                                           alpha=1e-3, n_iter=5,          random_state=42)),
])
>>> _ = text_clf.fit(twenty_train.data, twenty_train.target)
>>> predicted = text_clf.predict(docs_test)
>>> np.mean(predicted == twenty_test.target)            
0.912...

scikit-learnしかし、また、それは、より詳細なパフォーマンス分析の結果のためのツールを提供しています。

>>> from sklearn import metrics
>>> print(metrics.classification_report(twenty_test.target,     predicted,target_names=twenty_test.target_names))                                       
                        precision    recall  f1-score   support

           alt.atheism       0.95      0.81      0.87       319
         comp.graphics       0.88      0.97      0.92       389
               sci.med       0.94      0.90      0.92       396
soc.religion.christian       0.90      0.95      0.93       398

           avg / total       0.92      0.91      0.91      1502
>>> metrics.confusion_matrix(twenty_test.target, predicted)
array([[258,  11,  15,  35],
       [  4, 379,   3,   3],
       [  5,  33, 355,   3],
       [  5,  10,   4, 379]])

私たちはしばしば、コンピュータグラフィックスの雪の混乱からグループや記事を起草混同行列表示無神論からの記事やキリスト教のテーマとして期待されるように。

グリッドサーチパラメータ調整(調整パラメータ)を使用します

我々のようないくつかのパラメータ、遭遇したものような多くのパラメータが必要ですクラシファイアを平滑化パラメータを含めるにはペナルティパラメータがある損失とペナルティ値を設定するために使用することができます(またはPythonで、関連するモジュールのドキュメントへのアクセスを通じて得詳細)。TfidfTransformeruse_idfMultinomiaNBalphaSGDClassfieralphahelp

調整チェーンのさまざまなコンポーネントのパラメータと比較すると、より実現可能かもしれない最善の方法を取得するためのパラメータの可能な値の徹底的な検索では、グリッド上で検索を実行します。

状況下でidは0001に0.1からパラメータを処罰する線形SVM分類器の試みのためのすべての分類を実行しようとするかどうかを私たちは言葉や文字、:

>>> from sklearn.grid_search import GridSearchCV
>>> parameters = {'vect__ngram_range': [(1, 1), (1, 2)],
            'tfidf__use_idf': (True, False),
             'clf__alpha': (1e-2, 1e-3), }

もちろん、そのような徹底的な検索は非常に高価である。我々は、マルチコアCPUを使用することができる場合、私たちができるn_jobs私たちは、このパラメータに割り当てられた場合は8つのパラメータの組み合わせを試して、並列方法を使用して、グリッド検索のパラメータを伝え-1、グリッド検索は、利用可能なコアの数を検出し、それらのすべてを使用します。

>>> GridSearchCV(text_clf, parameters, n_jobs=-1)

グリッド検索のパフォーマンスは、通常のようなものですscikit-learnしかし、我々は検索速度を加速するために適用されるアプリケーションのトレーニングセットの小さいサブセットにモデル化します。:

>>> gs_clf = gs_clf.fit(twenty_train.data[:400], twenty_train.target[:400])

GridSearchCV对象上调用フィット产生的结果是一个我们可以用来`分類器を予測:

>>> twenty_train.target_names[gs_clf.predict(['God is love'])]
'soc.religion.christian'

これは非常に大きくて扱いにくいオブジェクトですが、我々はできるオブジェクトを調べてますがgrid_scores、最適なパラメータのプロパティを取得する。grid_score我々はできる、属性の枝のリストに最高のスコアを取得するには、パラメータ/です:

>>> best_parameters, score, _ = max(gs_clf.grid_scores_, key=lambda x: x[1])
>>> for param_name in sorted(parameters.keys()):
              print("%s: %r" % (param_name, best_parameters[param_name]))
clf__alpha: 0.001
tfidf__use_idf: True
vect__ngram_range: (1, 1)
>>> score                                              
0.900...

練習

「スケルトン」フォルダをコピーし、「ワークスペース」という名前を付けます:

$ cp -r sketletons workspace

そして、あなたは、元の運動ファイルを失うことを恐れることなく、物事の作業領域を編集することができます。

ipythonシェルを起動し、次のコマンドでスクリプトを実行します。

[1] %run workspace/exercise_XX_script.py arg1 arg2 arg3

例外がトリガされた場合は、使用%debug剖検ipdbセッションを開始します。

実現と反復改良運動が解決されるまで。

各演習では、スケルトンファイルを対応するデータの予測精度と評価モデルの定型的なコードをロードするために必要なすべてのimport文を提供します

演習1:音声認識

  • カスタムプリプロセッサを使用すると、CharNGramAnalyzerテキスト分類パイプラインを書く。Wikipediaの記事データをトレーニングセットから
  • 設定いくつかのテストでのパフォーマンスを評価

コマンドラインipython:

%run workspace/exercise_01_language_train_model.py data/languages/paragraphs/

練習2:ムービー評判分析をレビュー

  • 映画のレビューを分割するために、テキスト分類パイプラインを書き込むには、肯定的な感情と否定的な感情です
  • 良いトレーニングを探してグリッドサーチを使用し、
  • テストセットの性能を評価

コマンドラインipython:

%run workspace/exercise_02_sentiment.py data/movie_reviews/txt_sentoken/

練習3:コマンドラインテキスト分類ツール

前の演習の結果を使用してPythonの標準ライブラリのcPickleコマンドラインツールで作成されたモジュールが提供される標準的な入力言語のテキスト検出に属しているテキストは英語で書かれている場合は、その感情的な極性(肯定的な感情、ネガティブな感情)を推定します。

プログラムは、より良い信頼の見通しのレベルを提供することができれば!

どこ次に行き

ここでは、このチュートリアルを完了した後、さらにおなじみの-scikitを学ぶのを助けるためにいくつかの提案は以下のとおりです。

  • 再生しようとCountVectorizerしてanalyzertoken normalisation
  • あなたがラベルを持っていない場合は、してみてください聚类方法あなたの問題を解決するために
  • 使用してみてくださいTruncated SVD潜在意味解析を解決するために
  • 使用して見aveのアウトオブコア分類を、コンピュータのメインメモリに収まらないデータから学ぶことを。
  • 見ていハッシングベクトラを CountVectorizerにメモリ効率的な代替として。

ます。https://www.cnblogs.com/taceywong/p/5907221.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34148340/article/details/94197946
おすすめ