Gensim は「人間のためのトピックモデリング」を行う自然言語処理パッケージとして宣伝されたものである。 しかし、それは事実上それ以上のものです。 テキストを処理し、単語ベクトルモデル (Word2Vec や FastText など) で作業し、トピックモデルを構築するための最先端のパッケージなのです。 Photo by Jasmin Schreiber
- 目次
- はじめに
- 辞書とコーパスとは?
- 6. テキストファイルから bag of words コーパスを作るには?
- どのように gensim 辞書とコーパスをディスクに保存し、それらを再び読み込むのですか?
- データセットを読み込むためのgensim downloader APIの使い方
- Phraserモデルを使ってビッググラムとトリグラムを作成するには?
- LDAでトピックモデルを作成する方法
- LDAトピックモデルの出力をどのように解釈するか?
- gensimを使ったLSIトピックモデルの作り方
- gensimを使用してWord2Vecモデルをトレーニングする方法
- 新しいデータで既存のWord2Vecモデルを更新するには?
- 学習済みのWord2VecとFastTextモデルを使って単語ベクトルを抽出する方法
- How to create document vectors using Doc2Vec?
- コサイン類似度やソフトコサイン類似度などの類似度メトリックを計算するにはどうしたらいいですか。
- テキストドキュメントの要約方法は?
- まとめ
目次
1. はじめに
2.辞書とコーパスとは?
3.How to create a Dictionary from a list of sentences?
4.How to create a Dictionary from one or more text files?
5.How to create a bag of words corpus in gensim?
6.外部テキストファイルからBag of Wordコーパスを作成する方法
7.gensim辞書とコーパスをディスクに保存し、再び読み込む方法
8.gensimでTFIDF行列(コーパス)を作成する方法
9.gensimでBag of Wordコーパスを作成する方法
10.Gensim辞書とコーパスから辞書を作成する方法
11. gensim downloader APIを用いたデータセットのロード方法?
10. Phraserモデルを使ってbigramsとtrigramsを作成する方法
11.How to create bigrams and trigrams using Phraser models? LDAを用いたトピックモデルの作り方
12.How to create topic models with LDA? LDAトピックモデルの出力の解釈方法?
13.LDAトピックモデルの出力の解釈方法?
14.LDAトピックモデルの出力の解釈方法? gensimを用いたLSIトピックモデルの作成方法?
14.How to create a LSI topic model using gensim? gensimを使ったWord2Vecモデルの学習方法?
15. 既存のWord2Vecモデルを新しいデータで更新する方法?
16. 学習済みのWord2VecとFastTextモデルを使って、単語ベクトルを抽出する方法
17. Doc2Vecを使って文書ベクトルを作成する方法?
18. コサイン類似度やソフトコサイン類似度のような類似度メトリクスの計算方法?
19. テキスト文書を要約する方法
20. 結論
はじめに
gensimとは?
Gensimは「人間のためのトピックモデリング」を行う自然言語処理パッケージとして宣伝されています。 しかし、実際にはそれ以上のものです。
トピック・モデリングについてよく知らないのであれば、それは大量のテキストから基本的なトピックを抽出するためのテクニックです。 Gensim は LDA や LSI (この記事の後半で説明します) といったアルゴリズムと、高品質のトピック モデルを構築するために必要な高度な機能を提供します。
トピック モデルと単語の埋め込みは scikit や R などの他のパッケージで利用できると思うかもしれません。 しかし、トピックモデルを構築し評価するための設備の幅と範囲はgensimの比ではなく、さらにテキスト処理のための多くの便利な設備があります。
テキスト処理、単語ベクトルモデル(Word2Vec、FastTextなど)での作業、トピックモデルの構築のための優れたパッケージと言えます。
また、gensim のもうひとつの大きな利点は、ファイル全体をメモリに読み込むことなく大きなテキスト ファイルを処理できることです。
この投稿では、ほぼすべての主要機能の実用的な概要を、シンプルで理解しやすい方法で説明することを目的としています。
Let’s begin.
辞書とコーパスとは?
Gensim がテキスト ドキュメントを扱うには、単語 (別名トークン) をユニークな ID に変換する必要があります。
しかし、なぜ辞書オブジェクトが必要で、どこで使えるのでしょうか。
辞書オブジェクトは通常、「単語の袋」コーパスを作成するために使われます。 Gensim が得意とするトピック・モデリングやその他のモデルの入力として使用されるのは、この辞書と bag-of-words (Corpus) です。
さて、gensim はどのようなテキスト入力を扱えるのでしょうか。
- Python のネイティブリストオブジェクトに格納された文
- 大小さまざまな 1 つのテキストファイル
- 複数のテキストファイルです。
さて、テキスト入力が大きい場合、テキストファイル全体を読み込むことなく辞書オブジェクトを作成できる必要があります。
良いことに、Gensim では、テキストファイル全体をシステム メモリに読み込むことなく、一度に 1 行ずつテキストを読み込んで辞書を更新できます。 次の 2 つのセクションで、その方法を説明します。
ただし、その前に、いくつかの自然言語処理専門用語を理解しておきましょう。 ドキュメント」は通常「文」または「段落」を意味し、「コーパス」は通常「単語のバッグとしてのドキュメントのコレクション」です。 つまり、コーパスには、各文書について、各単語のidとその文書における頻度数が格納されている。 その結果、単語の順序の情報は失われます。
ここまでですべてが明らかになったのなら、手を動かして、文のリストから辞書を作成する方法を確認しましょう。
gensimでは、辞書はすべての単語(トークン)とその一意のIDのマップを含んでいます。
辞書は、文章のパラグラフから、複数行からなるテキストファイルから、そしてディレクトリに含まれる複数のそのようなテキストファイルから作成することができます。 2 番目と 3 番目のケースでは、ファイル全体をメモリに読み込まずに行うので、テキストを 1 行ずつ読むと辞書が更新されます。
List of sentences の入力から始めましょう。 リスト内包はこれを行う一般的な方法です。
辞書には 34 のユニークなトークン (または単語) があると書かれています。 これらのトークンそれぞれの一意の ID を見てみましょう。
これで、Dictionary オブジェクトを作成することに成功しました。 Gensim はこの辞書を使用して、ドキュメント内の単語をこの辞書が提供するそれぞれの ID に置き換える bag-of-words コーパスを作成します。
将来新しいドキュメントを取得した場合、既存の辞書を更新して新しい単語を含めることも可能です。
以下の例では、ファイルを 1 行ずつ読み込んで、gensim の simple_preprocess
を使用して一度に 1 行ずつ処理します。
この利点は、ファイルを一度にメモリに読み込まずにテキスト ファイル全体を読み込むことができる点です。 いいですね!
さて、複数のファイルから1行ずつ読み込むにはどうしたらいいでしょうか?
すべてのテキストファイルが同じディレクトリにあると仮定して、__iter__
メソッドを持つクラスを定義する必要があります。 __iter__()
メソッドは、与えられたディレクトリ内のすべてのファイルを繰り返し処理し、処理された単語トークンのリストを得なければなりません。
テキストファイルを含むディレクトリへのパスを受け取る ReadTxtFiles
という名前で、そのようなクラスを定義しましょう。
このブログの記事は、イテレータとジェネレータの概念を理解するための素晴らしい概要を提供しています。
リストとテキストファイルから辞書を作成する方法はわかりました。
gensim で作業するために慣れ親しむ必要がある次の重要なオブジェクトは、コーパス (Bag of Words: 単語の袋) です。 つまり、各文書における単語IDとその頻度を格納したコーパスオブジェクトです。
更新された辞書を手に入れたら、あとはトークン化された単語のリストを Dictionary.doc2bow()
に渡すだけで、Bag of Words コーパスが作成されます。
上記のコーパスをどう解釈するかですが、
1行目の (0, 1) は id=0 の単語が1番目のドキュメントに1回現れることを意味します。
同様に、2番目のリスト項目の (4, 4) は id 4 の単語が2番目のドキュメントで4回現れることを意味します。
さて、これでは人間が読むことはできない。 ID を単語に変換するには、変換を行うための辞書が必要です。
では、元のテキストを取り戻す方法を見てみましょう。
word_counts = , count) for id, count in line] for line in mycorpus]pprint(word_counts)#> , ]
注意:単語の順序は失われます。 単語とその頻度情報だけが残ります。
6. テキストファイルから bag of words コーパスを作るには?
Python のリストから単語を読み取るのは、テキスト全体がすでにメモリ内にあったので非常に簡単です。
しかし、ファイル全体をメモリにロードしたくないような大きなファイルがある場合があります。 しかし、コーパスオブジェクトはどのように作成するのでしょうか?
BoWCorpus
の__iter__()
はファイルから1行を読み、simple_preprocess()
で単語のリストに加工し、dictionary.doc2bow()
に渡しています。
また、smart_open
パッケージの smart_open()
を使用していることに注目してください。これは、S3、HDFS、WebHDFS、HTTP、またはローカルや圧縮ファイルなどさまざまなソースから大きなファイルを開いて行ごとに読み取ることができます。
ただし、システム内のファイルに open()
を使用していた場合は、ファイルとして完全に動作します。
どのように gensim 辞書とコーパスをディスクに保存し、それらを再び読み込むのですか?
これは非常に簡単です。 以下の例を参照してください。
辞書とコーパスのオブジェクトを保存しました。
辞書とコーパスを保存しましたが、読み込んでみましょう。
gensimでTFIDF行列(コーパス)を作るにはどうしたらいいですか。
Tf-Idf は、用語頻度 (TF) のようなローカル成分とグローバル成分、つまり逆ドキュメント頻度 (IDF) を掛け合わせ、オプションで結果を単位長に正規化することによって計算されます。 Gensim はこれらのバリエーションを実装するために使用できる SMART 情報検索システムを使用しています。 TfidfModel
のsmartirs
パラメータを指定することで、使用する数式を指定することができます。 詳細は help(models.TfidfModel)
を参照してください。
では、TFIDF の重みはどのようにして求めるのでしょうか。
コーパスを models.TfidfModel()
で学習させます。 そして、学習したtfidf
モデルの角括弧の中にコーパスを適用する。
元のコーパスとtfidfで重み付けしたコーパスの単語の重みの違いに注目。
「is」と「the」という単語は二つの文書で出現し、重み付けされた。 3つの文書すべてに出現する’this’という単語は完全に削除された。
データセットを読み込むためのgensim downloader APIの使い方
Gensimには、一般的なテキストデータセットと単語埋め込みモデルをダウンロードするためのAPIが組み込まれています。
利用可能なデータセットとモデルの包括的なリストはここで管理されます。
API を使用してデータセットをダウンロードするには、正しいデータまたはモデル名で api.load()
メソッドを呼び出すだけで、簡単にダウンロードできます。
以下の例では、「glove-wiki-gigaword-50」モデルをダウンロードしています。
Phraserモデルを使ってビッググラムとトリグラムを作成するには?
これで、gensimでデータセットと学習済みモデルをダウンロードする方法がわかりました。
しかし、ビッググラムとトリグラムとは何なのか、そしてなぜ重要なのか? なぜなら、2つの単語が組み合わさって実際の実体が形成されるからです。 たとえば フランス」という単語は言語や地域を指し、「革命」という単語は惑星革命を指すことができます。
特に bag-of-words モデルを使用する場合、文から bigram と trigram を形成することは非常に重要です。
では、どのように bigrams を作成するのですか。 作成されたPhrases
モデルはインデックスを作成できるので、元のテキスト(リスト)を作成されたPhrases
モデルに渡すだけでビグラムが形成されます。 以下に例を示す。
これでビッグラムが完成した。 トリグラムをどのように作成するかわかりますか。
さて、ビッグラムモデルの出力に対して、同じ手順を繰り返します。 一度、bigramを生成したら、その出力を新しいPhrases
モデルの学習に渡すことができます。 そして、学習したtrigramモデルにbigramのコーパスを適用する。 混乱しましたか?
LDAでトピックモデルを作成する方法
トピックモデルの目的は、与えられたテキストドキュメントのコレクションから基本的なトピックを抽出することです。 テキスト内の各ドキュメントはトピックの組み合わせとみなされ、各トピックは関連する単語の組み合わせとみなされます。
トピックモデルは Latent Dirichlet Allocation (LDA) や Latent Semantic Indexing (LSI) といったアルゴリズムによって行うことができます。 一方、トピック モデルでは、各トピックのキーワードと、各文書におけるトピックの寄与率が提供されます。
トピックの品質は、テキスト処理の品質と、アルゴリズムに提供するトピック数に大きく依存します。 最適なトピック モデルを構築する方法に関する以前の記事では、その手順をより詳細に説明しています。 しかし、以下の例で、関係する基本的な手順と解釈を理解することをお勧めします。
Step 0: 必要なパッケージをロードし、ストップワードをインポートします。
Step 1: データセットのインポート。 ここではgensimのdownloader APIでダウンロードできるtext8
データセットを使用します。
# Step 1: Import the dataset and get the text and real topic of each news articledataset = api.load("text8")data =
Step 2: ダウンロードしたデータからストップワードを取り除き、lemmatizeすることで準備をします。 Lemmatizationを行うには、gensimはpattern
パッケージを必要とします。 そのため、実行する前に必ずターミナルまたはプロンプトでpip install pattern
を実行してください。 名詞(NN)、形容詞(JJ)、代名詞(RB)のみを残すようにlemmatizationを設定しました。 このような単語だけをトピックのキーワードにしたいからです。 これは個人的な選択です。
これで data_processed
は単語のリストのリストとして処理されました。 これを利用してDictionary
とCorpus
を作成し、LDAモデルの入力とします。
これで辞書とコーパスが作成されました。 LdaMulticore()
を使って、7つのトピックでLDAトピックモデルを構築してみましょう。
lda_model.print_topics
は、7つのトピックのうち、どの単語がどのトピックに貢献したかを、その単語の貢献度の重み付けとともに示しています。 そこで、そのような単語を stop_words
リストに追加して取り除き、さらにトピック モデルを調整して、最適なトピックの数を決定します。
LDAトピックモデルの出力をどのように解釈するか?
lda_model
オブジェクトはインデックス作成をサポートしています。
- その文書が属するトピックとその割合
- その文書内の各単語が属するトピック
lda_model
は3つのものを提供する。 - The topic(s) each word in that document is belong to AND the phi values.
So, what is phi value?
Phi value is the probability of the word belong to that particular topic.
[1]その文書内の各単語が属するトピックと、ファイ値。 そして、与えられた単語のためのファイ値の合計は、その単語がその文書に発生した回数に追加されます。
例えば、0番目の文書に対する以下の出力では、ID = 0の単語はトピック番号6に属しているとファイ値は3.999である。
gensimを使ったLSIトピックモデルの作り方
LSIモデルを使う場合の構文は、LsiModel()
を使う以外はLDAモデルを作ったときと同じです。
gensimを使用してWord2Vecモデルをトレーニングする方法
単語埋め込みモデルは、与えられた単語に対して数値ベクトルを提供できるモデルです。 Gensim の downloader API を使用すると、word2vec, fasttext, GloVe, ConceptNet などの単語埋め込みモデルをあらかじめダウンロードすることができます。 これらは、wikipedia や google news など、一般によく使われるテキストデータの大規模なコーパスを基に構築されています。
しかし、技術文書などの特殊なニッチ分野で作業している場合、すべての単語の埋め込みを取得できないことがあります。
Gensimの実装では、与えられたコーパスに対して独自の単語埋め込みモデルを学習させることができます。
私たちは文書に対してWord2Vecモデルを学習し保存しました。
新しいデータで既存のWord2Vecモデルを更新するには?
既存のWord2Vec
モデルで、新しいデータセットに対してbuild_vocab()
を呼び出し、次にtrain()
メソッドを呼び出します。
学習済みのWord2VecとFastTextモデルを使って単語ベクトルを抽出する方法
学習済みのWord2Vecモデルに対して単語ベクトルを取得する方法を紹介しました。 しかし、gensim では、downloader API を使って、事前に学習された最先端のモデルをダウンロードすることができます。 これらのモデルのいくつかから単語ベクトルを抽出する方法を見てみましょう。
3 つの異なる埋め込みモデルがあります。 4809>
How to create document vectors using Doc2Vec?
Word2Vec
とは異なり、Doc2Vec
モデルは1つのユニットとしてまとめられた単語グループのベクトル表現を提供します。
text8
データセットを使ってDoc2Vec
を学習してみましょう。
import gensimimport gensim.downloader as api# Download datasetdataset = api.load("text8")data =
Doc2Vec
の学習データはTaggedDocument
のリストである必要があります。 これを作成するために、models.doc2vec.TaggedDocument()
.
に入力として単語のリストと一意な整数を渡すと、入力が用意される。 モデルを訓練するには、Doc2Vec
モデルを初期化し、語彙を構築し、最後にモデルを訓練する必要があります。
文の文書ベクトルを取得するには、infer_vector()
メソッドに単語のリストとして渡します。
コサイン類似度やソフトコサイン類似度などの類似度メトリックを計算するにはどうしたらいいですか。
ソフトコサイン類似度はコサイン類似度に似ていますが、さらにそのベクトル表現を通して単語間の意味的関係を考慮します。
ソフトコサインを計算するには、Word2Vec や FastText のような単語埋め込みモデルが必要です。 まず、similarity_matrix
を計算する。 次に入力文をbag-of-wordsコーパスに変換し、類似度行列とともにsoftcossim()
に渡します。
以下はfasttextやGloVeなどの単語埋め込みモデルに基づく、いくつかの有用な類似度や距離の測定基準です。 これらのモデルはすでにダウンローダー API を使ってダウンロードしました。
テキストドキュメントの要約方法は?
Gensimはsummarization
モジュールのsummarize()
関数を使って、textrank要約を実装しています。 必要なことは、出力要約ratio
または要約された出力の最大count
語のいずれかと共にtet文字列を渡すことだけです。
文の分割はgensim.summarization.texcleaner
モジュールの組み込みsplit_sentences()
メソッドを用いて行うので、トークン化リストに分割する必要がありません。
sample.txt の新しい記事の切り抜きを要約してみましょう。
gensim による要約の詳細については、このチュートリアルを参照してください。
まとめ
ここまでで、gensim のさまざまな機能について多くを学び、テキストの扱い方と操作方法を十分に把握することができました。 上記の例は、さまざまな NLP タスクを開始し、その上に構築するための素晴らしいテンプレートとして役立つはずです。 あなたの NLP プロジェクトで gensim をより頻繁に使うために役立つと感じられることを願っています
。