Python に基づく簡単な自然言語処理の練習

Python に基づく簡単な自然言語処理の練習

Python によるシンプルな自然言語処理

この記事は、Python をベースにした簡単な自然言語処理タスクの紹介です。この記事のすべてのコードはここにあります。まずは『Python 構文クイックガイド』と『機械学習開発環境セットアップ』を読むことをお勧めします。機械学習に関する詳しい情報については、機械学習、ディープラーニング、自然言語処理分野の推奨書籍リストや、プログラマー向けのデータサイエンスと機械学習の知識体系と資料集を参照してください。

20 ニュース グループ コーパス処理

20 ニュースグループ データセットには、もともと Ken Lang によって収集された、さまざまなニュースグループからの約 20,000 件のドキュメントが含まれています。このセクションには、データセットのキャプチャ、特徴の抽出、単純な分類器のトレーニング、トピック モデルのトレーニングなどが含まれます。この部分のコードには、メイン処理コードのカプセル化ライブラリとノートブックベースのインタラクティブなデモンストレーションが含まれています。まずデータを取得する必要があります:

  1. def fetch_data(self、サブセット= 'train' 、カテゴリ=なし):
  2. "" "戻りデータ
  3. データ取得操作を実行する
  4. 引数:
  5. subset -> 文字列-- キャプチャするターゲット セット: train / test / all  
  6. 「」 「
  7. ランダム = np.random.mtrand.RandomState(8675309)
  8. データ = fetch_20newsgroups(サブセット=サブセット、
  9. カテゴリ=カテゴリ、
  10. シャッフル= True
  11. ランダム状態=rand)
  12.  
  13. self.data[サブセット] = データ

次に、ノートブックでデータ形式をインタラクティブに表示します。

  1. # オブジェクトをインスタンス化する
  2. twp = トゥエンティニュースグループ()
  3. # データを取得
  4. twp.fetch_data()
  5. 20_train = twp.data[ 'train' ]
  6. print( "データセット構造" , "->" , teny_train.keys())
  7. print( "ドキュメント数" , "->" , len(twenty_train.data))
  8. print( "ターゲット分類" , "->" ,[twenty_train.target_names[t] for t in tenty_train.target[:10]])
  9.  
  10. データセット構造 -> dict_keys([ 'data' , 'filenames' , 'target_names' , 'target' , 'DESCR' , 'description' ])
  11. 文書数 -> 11314
  12. 対象カテゴリ -> [ 'sci.space' 'comp.sys.mac.hardware' 'sci.electronics' 'comp.sys.mac.hardware' 'sci.space' ' rec.sport.hockey' 'talk.religion.misc' 'sci.med' 'talk.religion.misc' 'talk.politics.guns' ]

次に、コーパスから特徴を抽出します。

  1. # 特徴抽出を実行する
  2.  
  3. # 文書用語マトリックスを構築する
  4.  
  5. sklearn.feature_extraction.textからCountVectorizer をインポートします
  6.  
  7. count_vect = カウントベクター化()
  8.  
  9. X_train_counts = count_vect.fit_transform(twenty_train.data)
  10.  
  11. print( "DTM構造" , "->" , X_train_counts.shape)
  12.  
  13. # 語彙内の単語の下付き文字を表示する
  14. print( "下付き文字に対応する単語" , "->" , count_vect.vocabulary_.get(u 'algorithm' ))
  15.  
  16. DTM構造 -> (11314, 130107)
  17. 対応する単語の下付き文字 -> 27366

ドキュメントを分類タスクに使用するには、TF-IDF などの一般的な方法を使用してドキュメントを特徴ベクトルに変換することも必要です。

  1. # ドキュメントのTF特徴ベクトルを構築する
  2. sklearn.feature_extraction.textからTfidfTransformer をインポートします
  3.  
  4. tf_transformer = TfidfTransformer(use_idf= False ).fit(X_train_counts)
  5. X_train_tf = tf_transformer.transform(X_train_counts)
  6.  
  7. print( "文書のTF特徴ベクトル" , "->" , X_train_tf)
  8.  
  9. # ドキュメントのTF-IDF特徴ベクトルを構築する
  10. sklearn.feature_extraction.textからTfidfTransformer をインポートします
  11.  
  12. tf_transformer = TfidfTransformer().fit(X_train_counts)
  13. X_train_tfidf = tf_transformer.transform(X_train_counts)
  14.  
  15. print( "文書のTF-IDF特徴ベクトル" , "->" , X_train_tfidf)
  16.  
  17. 文書のTF特徴ベクトル -> (0, 6447) 0.0380693493813
  18. (0, 37842) 0.0380693493813

特徴抽出、分類器のトレーニング、予測を別々の関数にカプセル化できます。

  1. def extract_feature(自己):
  2. 「」 「
  3. コーパスから文書の特徴を抽出する
  4. 「」 「
  5.  
  6. # トレーニングデータの文書-単語行列を取得する
  7. self.train_dtm = self.count_vect.fit_transform(self.data[ 'train' ].data)
  8.  
  9. # ドキュメントのTF機能を取得する
  10.  
  11. tf_transformer = TfidfTransformer(use_idf = False )
  12.  
  13. self.train_tf = tf_transformer.transform(self.train_dtm)
  14.  
  15. # ドキュメントのTF-IDF特徴を取得する
  16.  
  17. tfidf_transformer = TfidfTransformer().fit(self.train_dtm)
  18.  
  19. self.train_tfidf = tf_transformer.transform(self.train_dtm)
  20.  
  21. 定義 train_classifier(自己):
  22. 「」 「
  23. トレーニングセットから分類器をトレーニングする
  24. 「」 「
  25.  
  26. 自己抽出機能();
  27.  
  28. self.clf = 多項式NB().fit(
  29. self.train_tfidf、self.data[ 'train' ].target)
  30.  
  31. def predict(self, ドキュメント):
  32. 「」 「
  33. トレーニングセットから分類器をトレーニングする
  34. 「」 「
  35.  
  36. X_new_counts = self.count_vect.transform(ドキュメント)
  37.  
  38. tfidf_transformer = TfidfTransformer().fit(X_new_counts)
  39.          
  40. X_new_tfidf = tfidf_transformer.transform(X_new_counts)
  41.  
  42. self.clf.predict(X_new_tfidf)を返します

次に、トレーニングを実行し、予測と評価を行います。

  1. # 分類器をトレーニングする
  2. twp.train_classifier()
  3.  
  4. # 予測を実行する
  5. docs_new = [ '神は愛である' 'GPU 上の OpenGL は高速である' ]
  6. 予測 = twp.predict(docs_new)
  7.  
  8. doc 、zip内のカテゴリ(docs_new、予測):
  9. print( '%r => %s' % (doc, teny_train.target_names[category]))
  10.      
  11. # モデル評価を実行する
  12. twp.fetch_data(サブセット = 'テスト' )
  13.  
  14. 予測 = twp.predict(twp.data[ 'test' ].data)
  15.  
  16. numpyをnpとしてインポートする
  17.  
  18. # エラー計算
  19.  
  20. # 単純なエラーの意味
  21. np.mean(予測値 == twp.data[ 'テスト' ].target)
  22.  
  23. # メトリクス
  24.  
  25. sklearnからメトリックをインポート
  26.  
  27. 印刷(metrics.classification_report(
  28. twp.data[ 'test' ].target、予測、
  29. ターゲット名 = twp.data[ 'test' ].target_names))
  30.  
  31. # 混同マトリックス
  32. metrics.confusion_matrix(twp.data[ 'test' ].target, 予測)
  33.  
  34. 「神は愛である」 => 社会宗教キリスト教
  35. 「GPU 上の OpenGL は高速です」 => rec.autos
  36. 精度再現率 F1スコア サポート
  37.  
  38. 代替無神論 0.79 0.50 0.61 319
  39. ...
  40. トーク.宗教.その他 1.00 0.08 0.15 251
  41.  
  42. 平均/ 合計 0.82 0.79 0.77 7532
  43.  
  44. アウト[16]:
  45. 配列([[158, 0, 1, 1, 0, 1, 0, 3, 7, 1, 2, 6, 1,
  46. 8, 3, 114, 6, 7, 0, 0],
  47. ...
  48. [ 35, 3, 1, 0, 0, 0, 1, 4, 1, 1, 6, 3, 0,
  49. 6、5、127、30、5、2、21]])

ドキュメント セットからトピックを抽出することもできます。

# トピック抽出を実行する

  1. # トピック抽出を実行する
  2.  
  3. twp.topics_by_lda()
  4.  
  5. トピック 0 : ストリーム s1 宇宙飛行士動物園 ローレンティアン メイナード s2 gtoal pem fpu
  6. トピック 1: 145 cx 0d bh sl 75u 6um m6 sy gld
  7. トピック 2: アパート WPI 火星 ナチス モナッシュ パレスチナ オスマン帝国 SAS 受賞者 ジェラルド
  8. トピック 3: リヴジー コンテスト 衛星 タム マシュー 軌道 wpd 結婚 ソルンツェ 教皇
  9. トピック 4: x11 コンテスト ライブラリ フォント 文字列 contrib visual xterm ahl ブレーキ
  10. トピック5: ax g9v b8f a86 1d9 pl 0t wm 34u giz
  11. トピック 6: printf null  チャー・メインズ・ベハンナ上院議員拳銃民間人殺人マグパイ
  12. トピック 7: buf jpeg chi tor bos det que uwo pit blah
  13. トピック 8: Oracle di t4 risc nist 命令 msg postscript dma コンベックス
  14. トピック 9: カンジダ クレイ 酵母 バイキング 犬 ヴィーナス ブルーム 症状 観測所 ロビー
  15. トピック 10 : cx ck hz lk mv cramer adl optilink k8 uw
  16. トピック 11: リペム rsa サンドビック w0 ボスニア psuvm ハドソン utk ディフェンシブ ビール
  17. トピック 12: db espn sabbath br ウィジェット liar davidian urartu sdpa 冷却
  18. トピック 13: ripem dyer ucsu carleton adaptec tires chem alchemy lockheed rsa
  19. トピック 14: ingr sv alomar jupiter borland het intergraph factory paradox captain
  20. トピック 15: 民兵 パレスチナ CPR PTS ハンドヘルド シャーク IGC APC ジェイク リーハイ
  21. トピック 16: アラスカ デューク コル ロシア ウオクノール オーロラ プリンストン NSMCA 遺伝子ステレオ
  22. トピック 17 : uuencode msg ヘルメット eos サタン dseg 同性愛 ics ギア pyron
  23. トピック 18: エントリ マイヤーズ x11r4 レーダー 発言 暗号 メイン ハンバーグ シニア ボンチェフ
  24. トピック 19: カブス、UFL、ビタミン テンプル、GSFC、マッコール、アストロ、ベルコア、ウラン ウェズリアン

共通自然言語処理ツールのパッケージ

上記の 20NewsGroup コーパスの処理の紹介を通じて、一般的な自然言語処理タスクには、データ取得、データ前処理、データ特徴抽出、分類モデルのトレーニング、トピック モデル、または単語ベクトルなどの高度な特徴抽出などが含まれることがわかります。また、python-fire を使用してクラスをコマンド ラインから呼び出せるツールにすばやくカプセル化することに慣れており、外部モジュール呼び出しもサポートしています。このセクションでは、主に中国語のコーパスを例に挙げます。たとえば、中国語の Wikipedia データを分析する必要がある場合は、gensim の Wikipedia 処理クラスを使用できます。

  1. クラスWiki(オブジェクト):
  2. 「」 「
  3. Wikipedia コーパス処理
  4. 「」 「
  5.      
  6. def wiki2texts(self, wiki_data_path, wiki_texts_path= './wiki_texts.txt' ):
  7. 「」 「
  8. Wikipediaデータをテキストデータに変換する
  9. 引数:
  10. wiki_data_path -- Wiki 圧縮ファイルのアドレス 
  11. 「」 「
  12. wiki_data_pathでない場合は:
  13. print( "Wiki の圧縮ファイルのパスを入力するか、https://dumps.wikimedia.org/zhwiki/ にアクセスしてダウンロードしてください" )
  14. 出口()
  15.  
  16. # Wikipedia コーパスを構築する
  17. wiki_corpus = WikiCorpus(wiki_data_path、辞書={})
  18. テキスト数 = 0
  19.  
  20.   (wiki_text_path, 'w' , encoding= 'utf-8' )次のように開きます 出力:
  21. wiki_corpus.get_texts()内のテキストの場合:
  22. 出力.write(b ' ' . join (text).decode( 'utf-8' ) + '\n' )
  23. テキスト数 += 1
  24. テキスト数% 10000 == 0の場合:
  25. logging.info( "%d 件の記事が処理されました" % texts_num)
  26.  
  27. print( "処理が完了しました。OpenCC を使用して簡体字中国語に変換してください" )

キャプチャが完了したら、OpenCC を使用して簡体字中国語に変換する必要があります。クロール後、Jieba 単語分割を使用して、生成されたテキスト ファイルを分割できます。コードはこちらです。python chinese_text_processor.py tokenize_file /output.txt を直接使用してタスクを実行し、出力ファイルを生成します。単語に分割されたファイルを取得したら、それを単純な bag-of-words 表現またはドキュメント単語ベクトルに変換できます。詳細なコードは次のとおりです。

  1. クラス CorpusProcessor:
  2. 「」 「
  3. コーパス処理
  4. 「」 「
  5.  
  6. コーパス2bowを定義します。
  7. "" "(vocab,corpus_in_bow)を返します。
  8. コーパスをBOW形式に変換する
  9. 引数:
  10. tokenized_corpus -- トークン化されたドキュメントのリスト 
  11. 戻る
  12. 語彙-- {'人間': 0, ... '未成年者': 11}  
  13. corpus_in_bow -- [[(0, 1), (1, 1), (2, 1)]...]  
  14. 「」 「
  15. 辞書 = corpora.Dictionary(トークン化されたコーパス)
  16.  
  17. # 語彙力をつける
  18. 語彙 = dictionary.token2id
  19.  
  20. # 文書のbag-of-words表現を取得する
  21. corpus_in_bow = [dictionary.doc2bow(text) トークン化さたコーパス内のテキスト]
  22.  
  23. 返す(語彙、corpus_in_bow)
  24.  
  25. def corpus2dtm(self, tokenized_corpus=default_documents, min_df=10, max_df=100):
  26. "" "(語彙、DTM)を返します
  27. コーパスを文書-単語マトリックスに変換する
  28. - dtm -> マトリックス: 文書-単語マトリックス
  29. 私はデータベースを憎むのが好きです
  30. 1 1 0 1
  31. 2 1 0 1 1
  32. 「」 「
  33.  
  34. type(tokenized_corpus[0])リストの場合:
  35. documents = [ " " . join (document) for document in tokenized_corpus]
  36. それ以外
  37. ドキュメント = トークン化されたコーパス
  38.  
  39. max_df == -1の場合:
  40. max_df = round(len(ドキュメント数) / 2)
  41.  
  42. # コーパス統計ベクトルを構築する
  43. vec = CountVectorizer(min_df=min_df,
  44. 最大_df=最大_df、
  45. アナライザー = "単語"
  46. トークンパターン = "[\S]+" ,
  47. トークナイザー=なし、
  48. プリプロセッサ=なし、
  49. stop_words=なし
  50.  
  51. # データを分析する
  52. DTM = vec.fit_transform(ドキュメント)
  53.  
  54. # 語彙力をつける
  55. 語彙 = vec.get_feature_names()
  56.  
  57. 返す(語彙、DTM)

単語分割後の文書に対してトピックモデリングや単語ベクトル抽出を実行することもできます。ここでは、単語分割後の文書を使用することで、中国語と英語の違いを無視できます。

  1. def topics_by_lda(self、tokenized_corpus_path、num_topics=20、num_words=10、max_lines=10000、split= "\s+" 、max_df=100):
  2. 「」 「
  3. セグメント化されたファイルを読み取り、それに基づいてLDAをトレーニングする
  4. 引数:
  5. tokenized_corpus_path -> 文字列-- トークン化されたコーパスのアドレス 
  6. num_topics ->整数  -- トピック数 
  7. num_words ->整数  -- 主題用語の数 
  8. max_lines ->整数  -- 一度に読み取る行の最大数 
  9. split -> 文字列-- 文書内の単語間の区切り文字 
  10. max_df ->整数  -- 一般的な単語を避け、このしきい値を超える単語をフィルタリングします 
  11. 「」 「
  12.  
  13. # すべてのコーパス情報を保存する
  14. コーパス = []
  15.  
  16.   (tokenized_corpus_path、 'r' 、encoding= 'utf-8' )を tokenized_corpusとして開きます
  17.  
  18. フラグ = 0
  19.  
  20. tokenized_corpus内のドキュメントの場合:
  21.  
  22. # 十分な行が読み込まれたかどうかを判定する
  23. if(フラグ > max_lines):
  24. 壊す
  25.  
  26. # 読んだ内容をコーパスに追加する
  27. corpus.append(re.split(split, document))
  28.  
  29. フラグ = フラグ + 1
  30.  
  31. # コーパスのBOW表現を構築する
  32. (語彙、DTM) = self.corpus2dtm(コーパス、max_df=max_df)
  33.  
  34. # LDAモデルをトレーニングする
  35.  
  36. lda = Ldaマルチコア(
  37. matutils.Sparse2Corpus(DTM、ドキュメント列 = False )、
  38. num_topics=トピック数、
  39. id2word = dict([(i, s) for i, s in enumerate(vocab)]),
  40. 労働者=4
  41.  
  42. # トピックデータを印刷して返す
  43. トピック = lda.show_topics(
  44. num_topics=num_topics、
  45. num_words=num_words、
  46. フォーマット済み = False
  47. ログ = False )
  48.  
  49. tiの場合enumerate(topics)トピック:
  50. print( "トピック" , ti, ":" , " " . join (word[0] for word in topic[1]))

この関数は、単語に分割されたファイルを渡して、コマンド ラインから直接呼び出すこともできます。コーパスの単語ベクトルを構築することもできます。コードはこちらです。単語ベクトルの基本的な使い方に慣れていない場合は、Gensim に基づく Word2Vec の実践を参照してください。

  1. wv_train を定義します(self、tokenized_text_path、output_model_path= './wv_model.bin' ):
  2. 「」 「
  3. テキストの単語ベクトルをトレーニングし、出力単語ベクトルを保存します。
  4. 「」 「
  5.  
  6. 文 = word2vec.Text8Corpus(トークン化されたテキストパス)
  7.  
  8. # モデルのトレーニングを実行する
  9. モデル = word2vec.Word2Vec(文、サイズ= 250)
  10.  
  11. # モデルを保存する
  12. モデル.save(出力モデルパス)
  13.  
  14. def wv_visualize(self, model_path, word=[ "中国" , "航空" ]):
  15. 「」 「
  16. 入力した単語に基づいて隣接する単語を検索し、視覚的に表示します
  17. パラメータ:
  18. model_path: Word2Vec モデルのアドレス
  19. 「」 「
  20.  
  21. # モデルをロードする
  22. モデル = word2vec.Word2Vec.load (model_path )
  23.  
  24. # 最も類似した単語を見つける
  25. words = [wp[0] for wp in model.most_similar(word, topn=20)]
  26.  
  27. # 単語に対応する単語ベクトルを抽出する
  28. wordsInVector = [単語内の単語モデル[単語] ]
  29.  
  30. # PCA次元削減を実行する
  31. pca = PCA(n_components=2)
  32. pca.fit(単語をベクトルにフィット)
  33. X = pca.transform(単語ベクトル内)
  34.  
  35. # グラフィックを描く
  36. xs = X[:, 0]
  37. ys = X[:, 1]
  38.  
  39. plt.figure(図のサイズ=(12, 8))
  40. plt.scatter(xs, ys, マーカー= 'o' )
  41.  
  42. # すべての単語をトラバースしてコメントを追加します
  43. enumerate(単語)i、w場合:
  44. plt.annotate(
  45. w、
  46. xy=(xs[i], ys[i]), xytext=(6, 6),
  47. textcoords= 'オフセットポイント' 、ha= '左' 、va= '上'
  48. **辞書(フォントサイズ=10)
  49. plt.show()

[この記事は51CTOコラムニスト「張子雄」によるオリジナル記事です。転載が必要な場合は51CTOを通じて著者にご連絡ください]

この著者の他の記事を読むにはここをクリックしてください

<<:  プログラマーが使用する基本アルゴリズムトップ10

>>:  医療用ロボット:世界第2位のロボットの現状と今後の応用展望

ブログ    
ブログ    

推薦する

...

【WOT2018】蘇寧ドットコム高超:AI技術+短編動画を電子商取引プラットフォームに応用

[51CTO.comより引用] 2013年頃、携帯電話やパソコンに短編動画が大量に登場し、低コスト、...

世界中のコードの品質が急激に低下、その原因は AI です。 1億5300万行のコードの詳細な分析レポートが公開されました

AI が世界中のコード品質を低下させています。最近、GitClear が発表した調査レポートによると...

機械学習入門

1. 機械学習の定義機械学習はコンピュータサイエンスのサブフィールドであり、人工知能の分野および実装...

DALL・Eは発売からわずか2日で復刻されたのか?公式論文はまだ発表されていないが、専門家らはすでにそれを再現している。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

機械学習エンジニアは職を失いつつあるが、学習が唯一の解決策であることに変わりはない

[[335970]]ビッグデータダイジェスト制作出典: medium編集者: Hippo採用は凍結さ...

9 つの SOTA GNN よりも強力です。 Google Brainが新しいグラフニューラルネットワークGKATを提案

[[413820]]グラフは、ソーシャル ネットワークからバイオインフォマティクス、ロボット工学の...

米国は中国のハイテク製品を全面的に禁止する「2021年戦略競争法」を提案した。

米国の民主党と共和党は常に深刻な対立関係にあるが、両党は中国との対決という一つの問題において稀な一致...

Google AIがチューリングテストに合格、ビッグモデルドクターが登場か? GPT-4は17人の医師を困惑させた奇妙な病気を診断した

人類に利益をもたらす AGI を開発する必要がある理由の 1 つ:妻は過去 5 年間、あらゆる種類の...

...

インテリジェントプラットフォームを活用してビデオ監視データの津波に対処する方法

システム設計者は、高度なセンサー技術の急激な拡大と、それを安全または生命/安全の環境にどのように適用...

米メディア:なぜソフトロボットは科学者を魅了するのか?

[[374766]]米フォーチュン誌のウェブサイトは1月1日、「なぜ『ソフトロボット』はNASAや...

AI開発者のための7つの倫理ガイドライン

人工知能はここ数年で大きな進歩を遂げました。 AIテクノロジーで生み出されるソリューションは想像を絶...

...