テキスト分類の実践:sklearnとgensimモジュールに基づく
49501 ワード
りろんぶんせき
これまでデータマイニングコースの学習を経て、機械学習に基づく複数のドキュメントの自動要約をいくつか試み、テキスト内容の類似度に基づく引用推薦システムを試みたことがあるため、テキスト処理の基本的な流れについて比較的明確な認識があった.
テキストコンテンツの意味情報をマイニングしても、テキスト間の類似度をマイニングしても、私たちの最初のステップはデータの前処理を行います.そこで,数学言語でテキストデータを記述するために,ベクトル空間モデル(VSM)を導入した.1つのドキュメントをベクトル空間のベクトルと見なし、ドキュメント内の各単語をベクトル空間の軸とし、各軸におけるベクトルの投影をベクトルの方向の重みに等しくすることができます.
ベクトル空間の各軸が1つの語項を表すことが知られており,各語項の重み,すなわちその語の重要度を計算することを考慮した.さらにTF−IDF表現を導入し,具体的な式はここでは後述しない.TFはある語句の文書における重要度を反映しているが、IDFはある語句の文書ライブラリにおける普遍的な重要度を反映しているため、TF-IDFが高重みに達した語句は必ずある特定の文書において高周波で現れ、その指標はある語句の重要度をよく特徴付けることができ、これは私たちの次の特徴抽出に理論的基礎を提供している.複数の文書からなる文書の集合を考慮すると,TFIDFアルゴリズムを用いて文の重要度を得ることができ,少ない文書で出現したものを選択する傾向があるが,同じ文書で出現回数の多い語項を選択することができる.このような特徴に合致する語項は文書にとって比較的区別度があるからである.
ベクトル空間表現法の特徴も分かる.意味ギャップ:各語項と他の語項との間の対応する特徴方向は互いに直交しているため、意味的に非常に似た語項は、ベクトル空間においても何の関係もない.同じ単語に対して彼は空間の中で1つの特徴方向にしか対応していないため,ベクトル空間モデルも自然言語でよく1語多義,同義語などの現象を処理することができない. 高次元性:文書セットの規模が大きい場合、この項目ごとに次元を指定するため、ベクトル空間表現の次元が高すぎる、すなわち、よく言及される次元ディザスタ を引き起こす.疎性:テキストが短く、ドキュメントの数型が多い場合、疎性の問題は特に明らかです.高次元のベクトル空間では、各ドキュメントにごく一部の分詞しか表示されないため、このベクトルは極めてまばらです.
特徴選択と抽出により,データ中の情報損失が許容範囲内であることを保証する場合に,重要でない情報を捨てることができる.私の前のやり方は,各語項目をTF-IDFでソートし,閾値を設定し,閾値より重みの低い語項目を捨て,さらに次元を下げる効果を達成した.
意味ギャップについては,特異値分解(SVD)法により文書ベクトルをベクトル空間からステルス意味空間にマッピングするステルス意味解析(LSI)を導入した.ベクトル空間に対して、ステルス意味空間の次元は単語ではなく、ドキュメントセットのトピック、または概念です.ドキュメントのトピック数は、ドキュメント内の単語の総数よりはるかに小さいため、暗黙的な意味解析は同義語の問題をある程度解決するだけでなく、次元を下げることもできます.その欠点は,先行知識がないため,テーマ数を指定する際に頭をたたいて選択するしかない.幸いなことに、今回のデータセット20 newsgroupは、ニュースに20のテーマがあることを示しているので、20の隠れた意味空間次元、20のクラスタリングセンターを断固として選択することができます.
ベクトル空間のベクトルは極めてまばらであるため,密に表現すると蓄積空間の浪費や演算速度の減速をもたらす.このベクトルを疎で表すことを考慮し,実際にpythonにおける疎表現の原理は,2つの整数が要素の位置を表し,もう1つの浮動小数点数が要素のスカラー値を表す3元群を用いることである.
プログラミング実装
理論解析は以上のようにして,次に実験を行う.実験は2つの部分に分けられ,第1の部分はsklearnモジュールに基づいて行い,第2の部分はgensimモジュールに基づいて完全なテキスト分類プロセスを行った.
第1部
今回のデータセットはsklearnが持参したデータセットのfetch_20 newsgroups、このデータセットは20の文章の分類を含む18846編のニューステキストです.
基本的な処理フローは、データ収集、特徴抽出、モデル訓練、モデル評価である.テキストフィーチャーを取得するにはsklearnモジュールのfeature_を使用します.extraction.textのテキスト特徴抽出関数CountVectorizerとTfidfTransformerは,それぞれテキストのワード周波数データとTF−IFを得る.筆者は,素朴ベイズアルゴリズムを用いて文書を分類し,モデルを訓練した後,訓練集合を検証することを考えた.具体的なコードは以下のように実現される.
出力結果は次のとおりです.
各ニュースドキュメント間でガウス分布に独立して分布していると仮定すると,素朴なベイズの分類効果はまだ可能であり,精度は0.7738980350504514に達した.その原因を分析すると,機械学習は深さ学習とは異なり,素朴なベイズ分類器を用いてテキストのキーワードをつかんで区別し,文章の意味面から分析しなかったため,分類効果が好ましくなかった.
第2部
次に,標準的なテキスト処理方法に従ってgensimを用いて標準的なテキスト処理を行い,興味深い関連カリキュラム推奨の小さなシステムを構築することを試みる.このデータセットはCourseraのカリキュラムデータであり、データセットのテキストにはカリキュラムの名前とカリキュラムの概要が含まれています.各行に1つのカリキュラム情報があり、名前とプロフィールの間をタブで分割します.
完全な処理プロセスは、ドキュメントを分割し、分詞し、無効語を除去し、語幹化することです.各文書の語幹化された単語集合を得た後,辞書,ワードバッグモデル,TFIDFモデル,LSIモデルなどを構築する.しかし,以前はsklearnが持つテキスト特徴抽出関数CountVectorizerやTfidfTransformerを用いていたが,語形還元や語根化は行われず,文書の意味にあまり役に立たない無効語も除去されず,分類効果に一定の影響を及ぼす.
主な手順は次のとおりです.
結果は次のとおりです.
戻ってきた関連コースがMachineLearningのテーマに密接に関連していることがわかります.
上記はLSIモデルで類似度インデックス行列を取得していますが、TFIDFモデルで類似度インデックス行列を構築し、最も相関度の高い10コースのカリキュラム名を取得するように変更しました.
結果は次のとおりです.
おすすめ読書
1.gensimとsklearnを使用してテキスト分類器を構築する(一):プロセスの概要(https://blog.csdn.net/u014595019/article/details/52433754)
このブロガーはgensimが生成したlsiモデルを疎行列の表現に変換し,sklearnに伝達してモデル訓練を行う.しかし、20 newsgroupデータセットでは、ドキュメント数が多すぎるプログラムは非常に時間がかかり、実行しませんでした.しかし、gensimが生成したtfidfは各文の語周波数特性を二元群で表し、sklearnが伝達するのは行列であり、二元群の表現を疎行列の表現に変換するだけでよいため、その原理は非常に簡単である.scipyモジュールを使用して、sparseからcsr_をロードする必要があります.matrixを使用して、疎行列を生成します.次のようになります.
2.【gensim中国語教程】gensimの使用開始
3.gensimの使い方及び例
これまでデータマイニングコースの学習を経て、機械学習に基づく複数のドキュメントの自動要約をいくつか試み、テキスト内容の類似度に基づく引用推薦システムを試みたことがあるため、テキスト処理の基本的な流れについて比較的明確な認識があった.
テキストコンテンツの意味情報をマイニングしても、テキスト間の類似度をマイニングしても、私たちの最初のステップはデータの前処理を行います.そこで,数学言語でテキストデータを記述するために,ベクトル空間モデル(VSM)を導入した.1つのドキュメントをベクトル空間のベクトルと見なし、ドキュメント内の各単語をベクトル空間の軸とし、各軸におけるベクトルの投影をベクトルの方向の重みに等しくすることができます.
ベクトル空間の各軸が1つの語項を表すことが知られており,各語項の重み,すなわちその語の重要度を計算することを考慮した.さらにTF−IDF表現を導入し,具体的な式はここでは後述しない.TFはある語句の文書における重要度を反映しているが、IDFはある語句の文書ライブラリにおける普遍的な重要度を反映しているため、TF-IDFが高重みに達した語句は必ずある特定の文書において高周波で現れ、その指標はある語句の重要度をよく特徴付けることができ、これは私たちの次の特徴抽出に理論的基礎を提供している.複数の文書からなる文書の集合を考慮すると,TFIDFアルゴリズムを用いて文の重要度を得ることができ,少ない文書で出現したものを選択する傾向があるが,同じ文書で出現回数の多い語項を選択することができる.このような特徴に合致する語項は文書にとって比較的区別度があるからである.
ベクトル空間表現法の特徴も分かる.
特徴選択と抽出により,データ中の情報損失が許容範囲内であることを保証する場合に,重要でない情報を捨てることができる.私の前のやり方は,各語項目をTF-IDFでソートし,閾値を設定し,閾値より重みの低い語項目を捨て,さらに次元を下げる効果を達成した.
意味ギャップについては,特異値分解(SVD)法により文書ベクトルをベクトル空間からステルス意味空間にマッピングするステルス意味解析(LSI)を導入した.ベクトル空間に対して、ステルス意味空間の次元は単語ではなく、ドキュメントセットのトピック、または概念です.ドキュメントのトピック数は、ドキュメント内の単語の総数よりはるかに小さいため、暗黙的な意味解析は同義語の問題をある程度解決するだけでなく、次元を下げることもできます.その欠点は,先行知識がないため,テーマ数を指定する際に頭をたたいて選択するしかない.幸いなことに、今回のデータセット20 newsgroupは、ニュースに20のテーマがあることを示しているので、20の隠れた意味空間次元、20のクラスタリングセンターを断固として選択することができます.
ベクトル空間のベクトルは極めてまばらであるため,密に表現すると蓄積空間の浪費や演算速度の減速をもたらす.このベクトルを疎で表すことを考慮し,実際にpythonにおける疎表現の原理は,2つの整数が要素の位置を表し,もう1つの浮動小数点数が要素のスカラー値を表す3元群を用いることである.
プログラミング実装
理論解析は以上のようにして,次に実験を行う.実験は2つの部分に分けられ,第1の部分はsklearnモジュールに基づいて行い,第2の部分はgensimモジュールに基づいて完全なテキスト分類プロセスを行った.
第1部
今回のデータセットはsklearnが持参したデータセットのfetch_20 newsgroups、このデータセットは20の文章の分類を含む18846編のニューステキストです.
基本的な処理フローは、データ収集、特徴抽出、モデル訓練、モデル評価である.テキストフィーチャーを取得するにはsklearnモジュールのfeature_を使用します.extraction.textのテキスト特徴抽出関数CountVectorizerとTfidfTransformerは,それぞれテキストのワード周波数データとTF−IFを得る.筆者は,素朴ベイズアルゴリズムを用いて文書を分類し,モデルを訓練した後,訓練集合を検証することを考えた.具体的なコードは以下のように実現される.
import numpy as np
from sklearn import datasets
from sklearn import metrics
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
# ,
newsTrain = datasets.fetch_20newsgroups(subset='train')
newsTest = datasets.fetch_20newsgroups(subset='test', shuffle=True, random_state=7)
# : ,TFIDF
count_vect = CountVectorizer()
tfidf_transformer = TfidfTransformer()
X_trainCounts = count_vect.fit_transform(newsTrain.data)
X_testCounts = count_vect.transform(newsTest.data)
X_trainTfidf = tfidf_transformer.fit_transform(X_trainCounts)
X_testTfidf = tfidf_transformer.transform(X_testCounts)
#
clf = MultinomialNB().fit(X_trainTfidf, newsTrain.target)
# sklearn metrics
predicted = clf.predict(X_testTfidf)
print(metrics.classification_report(newsTest.target, predicted,target_names=newsTest.target_names))
print("accurary\t"+str(np.mean(predicted == newsTest.target)))
出力結果は次のとおりです.
precision recall f1-score support
alt.atheism 0.80 0.52 0.63 319
comp.graphics 0.81 0.65 0.72 389
comp.os.ms-windows.misc 0.82 0.65 0.73 394
comp.sys.ibm.pc.hardware 0.67 0.78 0.72 392
comp.sys.mac.hardware 0.86 0.77 0.81 385
comp.windows.x 0.89 0.75 0.82 395
misc.forsale 0.93 0.69 0.80 390
rec.autos 0.85 0.92 0.88 396
rec.motorcycles 0.94 0.93 0.93 398
rec.sport.baseball 0.92 0.90 0.91 397
rec.sport.hockey 0.89 0.97 0.93 399
sci.crypt 0.59 0.97 0.74 396
sci.electronics 0.84 0.60 0.70 393
sci.med 0.92 0.74 0.82 396
sci.space 0.84 0.89 0.87 394
soc.religion.christian 0.44 0.98 0.61 398
talk.politics.guns 0.64 0.94 0.76 364
talk.politics.mideast 0.93 0.91 0.92 376
talk.politics.misc 0.96 0.42 0.58 310
talk.religion.misc 0.97 0.14 0.24 251
avg / total 0.82 0.77 0.77 7532
各ニュースドキュメント間でガウス分布に独立して分布していると仮定すると,素朴なベイズの分類効果はまだ可能であり,精度は0.7738980350504514に達した.その原因を分析すると,機械学習は深さ学習とは異なり,素朴なベイズ分類器を用いてテキストのキーワードをつかんで区別し,文章の意味面から分析しなかったため,分類効果が好ましくなかった.
第2部
次に,標準的なテキスト処理方法に従ってgensimを用いて標準的なテキスト処理を行い,興味深い関連カリキュラム推奨の小さなシステムを構築することを試みる.このデータセットはCourseraのカリキュラムデータであり、データセットのテキストにはカリキュラムの名前とカリキュラムの概要が含まれています.各行に1つのカリキュラム情報があり、名前とプロフィールの間をタブで分割します.
完全な処理プロセスは、ドキュメントを分割し、分詞し、無効語を除去し、語幹化することです.各文書の語幹化された単語集合を得た後,辞書,ワードバッグモデル,TFIDFモデル,LSIモデルなどを構築する.しかし,以前はsklearnが持つテキスト特徴抽出関数CountVectorizerやTfidfTransformerを用いていたが,語形還元や語根化は行われず,文書の意味にあまり役に立たない無効語も除去されず,分類効果に一定の影響を及ぼす.
主な手順は次のとおりです.
import nltk
from gensim import corpora, models, similarities
from nltk.stem.lancaster import LancasterStemmer
# Coursera ,
courses = []
with open('coursera_corpus', 'r', encoding="utf8") as data:
for line in data.readlines():
courses.append(line.strip())
# ( + + ), , , TFIDF
stopwords = nltk.corpus.stopwords.words('english')
punctuations = [i for i in string.punctuation]
alphabet = [i for i in 'abcdefghigklmnopqrstuvwxyz']
setStopwords = set(punctuations + stopwords + alphabet)
# , target
courses_name = [course.split('\t')[0] for course in courses]
# ,
lstemmer = LancasterStemmer()
alltexts = [[word for word in nltk.word_tokenize(doc.lower()) if word not in stopwords] for doc in courses]
texts = [[lstemmer.stem(word) for word in doc] for doc in alltexts]
# , ,BOW ,TF-IDF ,LSI ,
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=10)
index = similarities.MatrixSimilarity(lsi[corpus])
#courses_name[210] 'Machine Learning', machine learning
ml_course = texts[210]
ml_bow = dictionary.doc2bow(ml_course)
ml_lsi = lsi[ml_bow]
# , ,
sims = index[ml_lsi]
sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])
top10sims = sort_sims[:10]
for i in range(len(top10sims)):
print(i, courses_name[top10sims[i][0]])
結果は次のとおりです.
0 Machine Learning
1 Machine Learning
2 Computer Security
3 Human-Computer Interaction
4 Probabilistic Graphical Models
5 Cryptography I
6 Algorithms: Design and Analysis, Part 2
7 Computer Architecture
8 Introduction to Databases
9 Metadata: Organizing and Discovering Information
戻ってきた関連コースがMachineLearningのテーマに密接に関連していることがわかります.
上記はLSIモデルで類似度インデックス行列を取得していますが、TFIDFモデルで類似度インデックス行列を構築し、最も相関度の高い10コースのカリキュラム名を取得するように変更しました.
numFeature =len(dictionary.token2id.keys())
index = similarities.SparseMatrixSimilarity(corpus_tfidf,num_features=numFeature)
結果は次のとおりです.
0 Machine Learning
1 Machine Learning
2 Neural Networks for Machine Learning
3 Natural Language Processing
4 Probabilistic Graphical Models
5 Artificial Intelligence Planning
6 Coding the Matrix: Linear Algebra throughComputer Science Applications
7 Human-Computer Interaction
8 Algorithms: Design and Analysis, Part 1
9 Linear and Integer Programming
おすすめ読書
1.gensimとsklearnを使用してテキスト分類器を構築する(一):プロセスの概要(https://blog.csdn.net/u014595019/article/details/52433754)
このブロガーはgensimが生成したlsiモデルを疎行列の表現に変換し,sklearnに伝達してモデル訓練を行う.しかし、20 newsgroupデータセットでは、ドキュメント数が多すぎるプログラムは非常に時間がかかり、実行しませんでした.しかし、gensimが生成したtfidfは各文の語周波数特性を二元群で表し、sklearnが伝達するのは行列であり、二元群の表現を疎行列の表現に変換するだけでよいため、その原理は非常に簡単である.scipyモジュールを使用して、sparseからcsr_をロードする必要があります.matrixを使用して、疎行列を生成します.次のようになります.
tfidfTrain = tfidf[bowCorpus]
row = []; col = []; data = [];
for i in range(len(newsTrain.data)):
for j in range(len(tfidfTrain[i])):
row.append(i)
col.append(tfidfTrain[i][j][0])
data.append(tfidfTrain[i][j][1])
row = np.array(row)
col = np.array(col)
data = np.array(data)
X_train_tfidf = csr_matrix((data, (row, col)))
2.【gensim中国語教程】gensimの使用開始
3.gensimの使い方及び例