Gensim-変換
この章は、Gensimのさまざまな変換について学習するのに役立ちます。変換するドキュメントを理解することから始めましょう。
ドキュメントの変換
ドキュメントの変換とは、ドキュメントを数学的に操作できるようにドキュメントを表現することを意味します。コーパスの潜在的な構造を推測することとは別に、ドキュメントの変換は次の目標にも役立ちます-
言葉の関係を発見します。
コーパスに隠された構造を引き出します。
これは、新しい、より意味的な方法でドキュメントを記述します。
これにより、ドキュメントの表現がよりコンパクトになります。
新しい表現はより少ないリソースを消費するため、効率が向上します。
新しい表現では限界データの傾向が無視されるため、有効性が向上します。
新しいドキュメント表現でもノイズが減少します。
ドキュメントをあるベクトル空間表現から別のベクトル空間表現に変換するための実装手順を見てみましょう。
実装手順
ドキュメントを変換するには、次の手順に従う必要があります-
ステップ1:コーパスを作成する
最初の基本的なステップは、ドキュメントからコーパスを作成することです。前の例ですでにコーパスを作成しました。いくつかの機能強化を加えた別の単語を作成しましょう(一般的な単語と1回だけ表示される単語を削除します)-
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
ここで、コーパスを作成するためのドキュメントを提供します-
t_corpus = ["以前はComputationalNetwork Toolkitとして知られていたCNTK"、 "無料の使いやすいオープンソースの商用グレードのツールキット"、 "人間の脳のように学習するための深層学習アルゴリズムのトレーニングを可能にします"、 "無料のチュートリアルはtutorialspoint.comにあります」、「Tutorialspoint.comは、AI深層学習機械学習などのテクノロジーに関する最高の技術チュートリアルも無料で提供しています」]
次に、トークン化を行う必要があり、それに伴って一般的な単語も削除します-
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[
word for word in document.lower().split() if word not in stoplist
]
for document in t_corpus
]
次のスクリプトは、のみ表示される単語を削除します-
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
出力
[
['toolkit'],
['free', 'toolkit'],
['deep', 'learning', 'like'],
['free', 'on', 'tutorialspoint.com'],
['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]
今それをに渡します corpora.dictionary() コーパス内の一意のオブジェクトを取得するためのオブジェクト-
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
出力
Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)
次に、次のコード行は、コーパスのBag ofWordモデルを作成します-
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
出力
[
[(0, 1)],
[(0, 1), (1, 1)],
[(2, 1), (3, 1), (4, 1)],
[(1, 1), (5, 1), (6, 1)],
[(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]
ステップ2:変換を作成する
変換はいくつかの標準的なPythonオブジェクトです。トレーニングされたコーパスを使用して、これらの変換、つまりPythonオブジェクトを初期化できます。ここで使用しますtf-idf 訓練されたコーパスの変換を作成するためのモデル BoW_corpus。
まず、gensimからモデルパッケージをインポートする必要があります。
from gensim import models
ここで、次のようにモデルを初期化する必要があります-
tfidf = models.TfidfModel(BoW_corpus)
ステップ3:ベクトルの変換
ここで、この最後のステップで、ベクトルが古い表現から新しい表現に変換されます。上記の手順でtfidfモデルを初期化したため、tfidfは読み取り専用オブジェクトとして扱われます。ここでは、このtfidfオブジェクトを使用して、ベクトルを単語の袋表現(古い表現)からTfidfの実数値の重み(新しい表現)に変換します。
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]
出力
[(1, 0.4869354917707381), (3, 0.8734379353188121)]
コーパスの2つの値に変換を適用しましたが、次のようにコーパス全体に変換することもできます。
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
出力
[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
(1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543),
(4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]
完全な実装例
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
"CNTK formerly known as Computational Network Toolkit",
"is a free easy-to-use open-source commercial-grade toolkit",
"that enable us to train deep learning algorithms to learn like the human brain.",
"You can find its free tutorial on tutorialspoint.com",
"Tutorialspoint.com also provide best technical tutorials on
technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[word for word in document.lower().split() if word not in stoplist]
for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW])
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Gensimのさまざまな変換
Gensimを使用すると、さまざまな一般的な変換、つまりベクトル空間モデルアルゴリズムを実装できます。それらのいくつかは次のとおりです-
Tf-Idf(用語頻度-逆ドキュメント頻度)
初期化中、このtf-idfモデルアルゴリズムは、整数値を持つトレーニングコーパス(Bag-of-Wordsモデルなど)を想定しています。その後、変換時にベクトル表現を取り、別のベクトル表現を返します。
出力ベクトルは同じ次元になりますが、(トレーニング時の)まれな特徴の値が増加します。基本的に、整数値のベクトルを実数値のベクトルに変換します。以下はTf-idf変換の構文です-
Model=models.TfidfModel(corpus, normalize=True)
LSI(潜在意味索引付け)
LSIモデルアルゴリズムは、整数値のベクトルモデル(Bag-of-Wordsモデルなど)またはTf-Idf加重空間から潜在空間にドキュメントを変換できます。出力ベクトルは低次元になります。以下はLSI変換の構文です-
Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
LDA(潜在的ディリクレ配分)
LDAモデルアルゴリズムは、ドキュメントをBag-of-Wordsモデル空間からトピック空間に変換する別のアルゴリズムです。出力ベクトルは低次元になります。以下はLSI変換の構文です-
Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)
ランダムプロジェクション(RP)
非常に効率的なアプローチであるRPは、ベクトル空間の次元を減らすことを目的としています。このアプローチは、基本的にドキュメント間のTf-Idf距離を概算します。それは少しランダムに投げることによってこれを行います。
Model=models.RpModel(tfidf_corpus, num_topics=500)
階層的ディリクレプロセス(HDP)
HDPは、Gensimに新たに追加されたノンパラメトリックベイズ法です。使用中は注意が必要です。
Model=models.HdpModel(corpus, id2word=dictionary