[[421481]] この記事はWeChatの公開アカウント「Pythonとビッグデータ分析」から転載したもので、著者はLittle Birdです。この記事を転載する場合は、Python およびビッグデータ分析の公開アカウントにお問い合わせください。 最近仕事が忙しくて、少し前に勾配と微分の問題で本当に悩みました。数学が苦手なので、機械学習やニューラルネットワークは本当に頭が痛いです。リラックスするためにアプリケーションレベルに切り替えたいと思い、自然言語処理を思いつきました。ワンホットモデルは基底とエントリポイントです。リストを行列と辞書に変換する単純な関数のようです。手動で実装することも考えましたが、CountVectorizerを見たらそうではないことがわかったので諦めました。 名前が示すように、ワンホット表現はゼロベクトルから始まり、単語が文または文書に出現する場合、ベクトル内の対応するエントリを 1 に設定します。 文をトークン化し、句読点を無視し、すべての単語を小文字で表すと、サイズ 8 の語彙 {time、fruit、flies、like、a、an、arrow、banana} が得られます。したがって、各単語を 8 次元のワンホット ベクトルで表すことができます。この本では、トークン/単語wのワンホット表現を表すために1[w]を使用します。 フレーズ、文、または文書の場合、圧縮されたワンホット表現は、その構成単語の論理 OR のワンホット表現にすぎません。 「like a banana」というフレーズのワンホット表現は、列が 8 次元のワンホット ベクトルである 3×8 行列になります。また、「折り畳み」またはバイナリ エンコーディングもよく見られます。このエンコーディングでは、テキスト/フレーズが語彙の長さのベクトルで表され、0 と 1 が単語の有無を表します。バナナのようなのバイナリエンコードは [0,0,0,1,1,0,0,1] です。 - sklearn.feature_extraction.textからCountVectorizer、TfidfVectorizer をインポートします
- Seaborn をSNSとしてインポートする
- matplotlib.pyplot をpltとしてインポートします。
- 輸入業者
- jieba.analyse をインポートする
-
- # ワンホット表現はゼロベクトルから始まり、単語が文または文書内に出現する場合は、ベクトル内の対応するエントリを 1 に設定します。
- # 英語の処理と表示
- corpus = [ 「時は矢のように過ぎ去る。」 、 「果物はバナナのように飛ぶ。」 ]
- one_hot_vectorizer = CountVectorizer(バイナリ= True )
- one_hot = one_hot_vectorizer.fit_transform(コーパス).toarray()
- sns.heatmap(one_hot, annot= True , cbar= False , yticklabels=[ '文1' , '文2' ])
- plt.show()
- # 中国語の処理と表示
- # ストップワードリストを取得する
- def get_stopwords_list(ストップワードファイル):
- stopwords = [line.strip() for line in open (stopwordfile, encoding= 'UTF-8' ).readlines()]
- ストップワードを返す
-
- # ストップワードを削除する
- def movestopwords(文):
- stopwords = get_stopwords_list( 'stopwords.txt' ) # ここでストップワードのパスを読み込みます
- santi_words = [x for x in sentence if len(x) > 1 and x not ストップワード内]
- santi_wordsを返す
-
- # コーパス
- corpus = [ "シャオミンは中国科学院計算技術研究所で修士号を取得し、その後日本の京都大学で学びました。" ,
- 「王暁さんは清華大学で学士号を取得し、南京コンピューター技術研究所で勤務・研究した後、日本の早稲田大学で学びました。 」
- 「シャオ・リーは清華大学で学士号を取得し、中国科学院計算技術研究所で修士号を取得し、南京大学で博士号を取得しました。 」
- ニューコーパス = []
- コーパス内のstrの場合:
- orgwordlist = jieba.lcut(str) # jieba 単語分割
- wordlist = movestopwords(orgwordlist) # ストップワードを削除
- newword = " " . join (wordlist) # コーパスの必要に応じてスペースで区切る
- newcorpus.append(newword) # コーパスの要件に従ってリストに変換します
- #ニューコーパス
- # [ 'シャオミンは中国科学院計算技術研究所で修士号を取得し、日本の京都大学で学びました' 、
- # 「シャオ・ワン 清華大学南京計算技術学院の学部生 早稲田大学でさらに勉強 日本でさらに勉強」
- # 「シャオ・リー、清華大学学部生、修士、中国科学院計算技術研究所卒業生、南京大学博士」
- one_hot_vectorizer = CountVectorizer( binary = True ) # bag-of-wordsデータ構造を作成する
- one_hot = one_hot_vectorizer.fit_transform(newcorpus).toarray() # コーパスと行列を変換する
- # 以下はホットワードの出力結果です
- # one_hot_vectorizer.vocabulary_
- # { '暁明' : 4、 '修士' : 14、 '卒業' : 11、 '中国科学院' : 0、 '計算技術研究所' : 15、 '京都大学' : 8、 '進学' : 12、 '暁王' : 6、 '学部' : 10、 '清華大学' : 13、 '南京' : 1、 '仕事' : 7、 '早稲田大学' : 9、 '暁李' : 5、 '博士号' : 3、 '南京大学' : 2}
- # one_hot_vectorizer.get_feature_names()
- # [ '中国科学院' 、 '南京' 、 '南京大学' 、 '博士号' 、 '暁明' 、 '暁李' 、 '暁王' 、 '仕事' 、 '京都大学、日本' 、'早稲田大学、日本' 、 '学部' 、 '卒業' 、 '進学' 、 '清華大学' 、 '修士' 、 'コンピューティング技術研究所' ]
- #ワンホット
- # [[1 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1]
- # [0 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1]
- # [1 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1]]
- sns.set_style({ 'font.sans-serif' :[ 'SimHei' , 'Arial' ]})
- sns.heatmap(one_hot, annot= True , cbar= False , xticklabels=one_hot_vectorizer.get_feature_names(),
- yticklabels=[ 'ステートメント 1' , 'ステートメント 2' , 'ステートメント 3' ])
- plt.show()
IDF 表現は、ベクトル表現において一般的なシンボルにペナルティを与え、まれなシンボルに報酬を与えます。コーパスのシンボルwのIDF(w)は次のように定義されます。ここでn[w]は単語wを含む文書の数、Nは文書の総数です。 TF-IDF スコアは、TF(w) * IDF(w) の積です。まず、すべてのドキュメント(つまり、n[w] = N)について、IDF(w)は0であり、TF-IDFスコアは0であり、この用語に完全にペナルティが課せられることに注意してください。 2 番目に、用語がまれにしか出現しない場合 (おそらく 1 つのドキュメントにのみ出現する場合)、IDF は log n の最大値になります。 - tfidf_vectorizer = TfidfVectorizer() # 単語バッグデータ構造を作成する
- tfidf = tfidf_vectorizer.fit_transform(newcorpus).toarray() # コーパスと行列を変換する
- # 以下はホットワードの出力結果です
- # tfidf_vectorizer.vocabulary_
- # '暁明' : 4、 '修士' : 14、 '卒業' : 11、 '中国科学院' : 0、 '計算工学研究所' : 15、 '京都大学' : 8、 '進学' : 12、 '暁王' : 6、 '学部' : 10、 '清華大学' : 13、 '南京' : 1、 '仕事' : 7、 '早稲田大学' : 9、 '暁李' : 5、 '博士号' : 3、 '南京大学' : 2}
- # tfidf_vectorizer.get_feature_names()
- # [ '中国科学院' 、 '南京' 、 '南京大学' 、 '博士号' 、 '暁明' 、 '暁李' 、 '暁王' 、 '仕事' 、 '京都大学、日本' 、'早稲田大学、日本' 、 '学部' 、 '卒業' 、 '進学' 、 '清華大学' 、 '修士' 、 'コンピューティング技術研究所' ]
- # tfidf
- # [[0.35221512 0. 0. 0. 0. 0.46312056 0. 0. 0. 0.46312056 0. 0. 0.35221512 0.35221512 0. 0.35221512 0.27352646]
- # [0. 0.35761701 0. 0. 0. 0. 0.35761701 0. 0.35761701 0.27197695 0. 0.54395391 0.27197695 0. 0.21121437]
- # [0.30443385 0. 0.40029393 0.40029393 0. 0.40029393 0. 0. 0. 0. 0. 0. 0.30443385 0.30443385 0.30443385 0.23642005]]
- sns.heatmap(tfidf, annot= True , cbar= False , xticklabels=tfidf_vectorizer.get_feature_names(),
- yticklabels=[ 'ステートメント 1' , 'ステートメント 2' , 'ステートメント 3' ], vmin=0, vmax=1, cm
|