Python 3でmatplotlibを使用して単語の頻度をグラフ化する方法

前書き

テキストデータは、ジャーナリズム、ソーシャルメディア、メールなど、さまざまな形式で存在します。 テキストデータを分析して視覚化すると、テキストの解釈方法を変える可能性のある一般的な傾向を明らかにすることができます。

このチュートリアルでは、テキストコーパスで単語の頻度をグラフ化する方法を検討します。 作成するプログラムは、プレーンテキストのドキュメントを検索し、各固有の単語をその頻度で整理します。 次に、見つけたデータを `+ matplotlib +`を使用してグラフ化します。

前提条件

このチュートリアルを使用するには、次の前提条件を満たしていることを確認してください。

  • Python 3とプログラミング環境がhttps://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-pythonに既にインストールされている必要があります。 -3 [ローカルコンピューター]またはhttps://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-16 -04-server [サーバー]。

  • このガイドを最大限に活用するには、Python 3およびhttps://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3[dictionary data type]について特に理解する必要があります。

最後に、必ずhttps://www.digitalocean.com/community/tutorials/how-to-plot-data-in-python-3-using-matplotlib#step-1-%E2%80%94-importingに従うようにしてください-matplotlib [ステップ1-https://www.digitalocean.com/community/tutorials/how-to-plot-data-in-python-3-using-matplotlib [データのプロット方法]の[+ matplotlib + `のインポート] Python 3でmatplotlibを使用する]このプロジェクトでは `+ matplotlib +`をインストールすることが不可欠です。

手順1-プログラムファイルの設定

コンピューターに `+ matplotlib`がインストールされたので、プロジェクトの作成を開始できます。

任意のテキストエディターを使用して、新しいPythonファイルを作成し、 `+ word_freq.py +`と呼びます。 これがメインファイルになります。

このプログラムでは、https://www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3 [import] + matplotlib +`とhttps://www.digitaloceanを使用します。 com / community / tutorials / how-to-construct-classes-and-define-objects-in-python-3 [class]必要なもの(これは `+ pyplot +)で、これに `+ plt `を渡しますhttps:/ /www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3#aliasing-modules[alias]。 これは基本的に、スクリプト全体で使用されるグローバル変数として「 plt +」を宣言します。

word_freq.py

import matplotlib.pyplot as plt

次に、いくつかのデフォルトパッケージをPythonにインポートします。 これらは、コマンドライン入力をセットアップして取り込むために使用されます。 注意すべき重要なパッケージは `+ argparse +`です。 これは、コマンドラインから情報を取得し、ユーザーのヘルプテキストを含めるために使用するものです。

次のデフォルトパッケージをPythonでインポートしましょう。

word_freq.py

import matplotlib.pyplot as plt

最後に、標準のメインメソッドを作成して呼び出します。 mainメソッド内では、ほとんどのコードを記述します。

word_freq.py

import matplotlib.pyplot as plt
import sys
import operator
import argparse

すべてをインポートし、プロジェクトのスケルトンをセットアップしたので、インポートしたパッケージの使用に進みます。

ステップ2 –引数パーサーのセットアップ

このパートでは、コマンドライン引数を作成し、https://www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3 [変数]にすばやく保存しますアクセス。

メインメソッドでは、パーサー変数を作成し、 `+ argparse `が提供するデフォルトコンストラクターに割り当てます。 次に、ファイルで検索する単語に予想される引数を割り当てます。 最後に、単語が含まれるファイルに期待される引数を割り当てます。 これは ` .txt +`ファイルになります。

word_freq.py

...
def main():










if __name__ == "__main__":
 main()

今のところ、メソッドの最初の引数はコマンドラインで期待するもののタイトルです。 2番目の引数 `+ help =" …​ "+`は、コマンドライン引数の内容に関する情報をユーザーに提供するために使用されます。

次に、指定された引数を別の変数に保存し、 `+ args +`を呼び出します。

word_freq.py

...
def main():
 parser = argparse.ArgumentParser()
 parser.add_argument(
     "word",
     help="the word to be searched for in the text file."
 )
 parser.add_argument(
     "filename",
     help="the path to the text file to be searched through"
 )



if __name__ == "__main__":
 main()

適切な測定のために、コマンドライン引数にタイプミスがある場合に備えて、常に入力をチェックする必要があります。 これは、スクリプトが突然クラッシュするのを防ぐためでもあります。 したがって、 `+ try +`ステートメントを使用してエラーを処理しましょう。

word_freq.py

...
def main():
   ...
   args = parser.parser_args()








if __name__ == "__main__":
 main()

`+ sys.exit(1)+`を使用して、コードに問題があり、正常に完了できなかったことをユーザーに示しています。

これで、プロジェクトはコマンドライン引数を取得できるようになります。 次のステップは、入力ファイルを解析することです。

手順3-ファイルの解析

この手順では、ファイルを取得し、各単語を読み取り、出現頻度をログに記録し、すべてを辞書データ型に保存します。

2つのコマンドライン引数(「単語とファイル名)、そしてその関数を `+ main()+`で呼び出します。

word_freq.py

...
def main():
   ...




if __name__ == "__main__":
 main()

ファイルを解析する最初のステップは、 `+ doc +`を呼び出す辞書データ型を作成することです。 これは、ファイルで見つかったすべての単語を保持し、出現回数を追跡します。

word_freq.py

...
def word_freq( word, filename ):


if __name__ == "__main__":
 main()

次のステップは、指定されたファイルを反復処理することです。 これはhttps://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-python-3#nested-for-loops[nested + for + loop]を使用して行われます。

最初の「+ for +」ループは、ファイルを開いて最初の行を取り出すように設計されています。 次に、各行の内容を取得し、単語を配列に格納しながら、単語間の空白文字の文字列に基づいて分割します。

2番目の「+ for +」ループはこの配列を受け取り、辞書にあるかどうかをチェックしてループします。 ある場合は、カウントを1つ追加します。 そうでない場合は、新しいエントリを作成し、1に初期化します。

word_freq.py

...
def word_freq(word, filename):
   doc = {}









if __name__ == "__main__":
 main()

これでプロジェクトの半分が完了しました。

要約すると、 `+ our main()`メソッドはコマンドライン入力を設定し、それらを ` word_freq()`関数に渡す必要があります。 ` word_freq()+`は、コマンドラインから単語とファイル名を取得し、テキストファイルで見つかった一意の各単語を保存する必要があります。

次に、このデータを取得し、グラフで使用するために整理します。

手順4-データの保存と並べ替え

グラフを作成する前に、開いたファイルに単語が実際に含まれていることを確認する必要があります。 + if + https://www.digitalocean.com/community/tutorials/how-to-write-conditional-statements-in-python-3-2 [条件ステートメント]でこれを行うことができます。

word_freq.py

...
def word_freq(word, filename):
   ...
     else:
         doc[entry] = 1




if __name__ == "__main__":
 main()

単語がファイルにあることがわかったので、グラフのデータの設定を開始できます。

最初に、辞書データ型を出現頻度の高いものから低いものへソートし、後で使用するために変数を初期化する必要があります。 辞書をソートして、グラフ上で適切に視覚化する必要があります。

word_freq.py

...
def word_freq(word, filename):
   ...
   if (not word in doc):
       sys.stderr.write("Error: " + word + " does not appear in " + filename)
       sys.exit(1)







if __name__ == "__main__":
 main()

注意すべき2つの変数は、「+ just_the_occur 」です。これは、単語が出現した回数を保持するデータです。 他の変数は ` just_the_rank +`です。これは、単語のランクに関するデータを保持する変数です。

ソートされたディクショナリーができたので、それをループして単語とそのランクを見つけ、このデータをグラフに追加します。

word_freq.py

...
def word_freq( word, filename ):
   ...

 sortedDoc = (sorted(doc.items(), key = operator.itemgetter(1)))[::-1]
 just_the_occur = []
 just_the_rank = []
 word_rank = 0
 word_frequency = 0











if __name__ == "__main__":
 main()

ここでは、変数「+ just_the_occur 」と「 just_the_rank 」の両方が同じ長さであることを確認する必要があります。そうでない場合、「 matplotlib +」ではグラフを作成できません。

また、ループに「+ if +」ステートメントを追加して、単語(既に存在することを知っています)を見つけ、そのランクと頻度を引き出します。

これで、グラフを作成するために必要なものがすべて揃いました。 次のステップは、最終的に作成することです。

ステップ5-グラフの作成

この時点で、最初に作成した `+ plt +`変数をプラグインできます。 グラフを作成するには、タイトル、y軸ラベル、x軸ラベル、スケール、グラフタイプが必要です。

私たちの場合、データを整理するために対数10のグラフを作成します。 タイトルと軸のラベルは好きなものにすることができますが、グラフがわかりやすいほどグラフを見ている人にとって良いものになります。

word_freq.py

...
def word_freq( word, filename ):
   ...
 just_the_rank.append(entry_num)
 entry_num += 1
 just_the_occur.append(entry[1])



















if __name__ == "__main__":
 main()

タイトル、 + plt.ylabel()+、および `+ plt.xlabel()+`関数は各軸のラベルです。

`+ plt.loglog()`関数は、x軸とy軸に対してそれぞれ ` just_the_rank `と ` just_the_occur +`を取ります。

ログベースを変更し、10に設定します。

次に、散布図を設定してポイントを強調表示します。 それを目立つようにサイズ100のオレンジ色の星にしました。 最後に、単語でラベルを付けました。

グラフのすべてが完了したら、 `+ plt.show()+`で表示するように指示します。

コードがようやく完成したので、テスト実行できます。

ステップ6-プログラムの実行

テキストサンプルでは、​​読み取るためのテキストファイルが必要になるため、無料の電子書籍(ほとんどがパブリックドメイン)を読者に提供するボランティアプロジェクトであるProject Gutenbergからダウンロードします。

Charles Dickensによる小説_http://www.gutenberg.org/ebooks/98 [A Tale of Two Cities] _のテキストを、 `+ curl `付きの ` cities.txt +`というファイルとして現在のディレクトリに保存しましょう。 Pythonスクリプトが含まれています:

curl http://www.gutenberg.org/files/98/98-0.txt --output cities.txt

次に、選択した単語(「魚」を使用します)のパラメーターとテキストファイルの名前を渡してコードを実行します。

python word_freq.py fish cities.txt

すべてが正常に機能した場合、これが表示されます。

image:https://assets.digitalocean.com/articles/eng_python/WordFrequency/word-frequency-matplotlib.png [matplotlibの単語頻度散布図]

「魚」という単語のランキングは5309であり、発生が視覚化されています。

これで、さまざまな単語やさまざまなテキストファイルで実験を続けることができます。 テキストファイルの操作の詳細については、https://www.digitalocean.com/community/tutorials/how-to-handle-plain-text-files-in-python-3 [プレーンテキストファイルの処理方法]をご覧ください。 Python 3]チュートリアル。

完成したコードとコードの改善

この時点で、 `+ .txt +`ファイル内の特定の単語の単語頻度を決定する完全に機能するプログラムが必要です。

以下は、このプロジェクトの完成したコードです。

word_freq.py

import matplotlib.pyplot as plt
import sys
import operator
import argparse


def main():
   parser = argparse.ArgumentParser()
   parser.add_argument(
       "word",
       help="the word to be searched for in the text file."
   )
   parser.add_argument(
       "filename",
       help="the path to the text file to be searched through"
   )

   args = parser.parse_args()

   try:
       open(args.filename)
   except FileNotFoundError:

       # Custom error print
       sys.stderr.write("Error: " + args.filename + " does not exist!")
       sys.exit(1)

   word_freq(args.word, args.filename)


def word_freq(word, filename):
   doc = {}

   for line in open(filename):

       # Assume each word is separated by a space
       split = line.split(' ')
       for entry in split:
           if (doc.__contains__(entry)):
               doc[entry] = int(doc.get(entry)) + 1
           else:
               doc[entry] = 1

   if (word not in doc):
       sys.stderr.write("Error: " + word + " does not appear in " + filename)
       sys.exit(1)

   sorted_doc = (sorted(doc.items(), key=operator.itemgetter(1)))[::-1]
   just_the_occur = []
   just_the_rank = []
   word_rank = 0
   word_frequency = 0

   entry_num = 1
   for entry in sorted_doc:

       if (entry[0] == word):
           word_rank = entry_num
           word_frequency = entry[1]

       just_the_rank.append(entry_num)
       entry_num += 1
       just_the_occur.append(entry[1])

   plt.title("Word Frequencies in " + filename)
   plt.ylabel("Total Number of Occurrences")
   plt.xlabel("Rank of word(\"" + word + "\" is rank " + str(word_rank) + ")")
   plt.loglog(just_the_rank, just_the_occur, basex=10)
   plt.scatter(
       [word_rank],
       [word_frequency],
       color="orange",
       marker="*",
       s=100,
       label=word
   )
   plt.show()

if __name__ == "__main__":
   main()

すべてが完了したので、このコードに対して実行できるいくつかの潜在的な改善と修正があります。

2つの単語の頻度を比較する場合は、コマンドライン引数に単語の位置を追加します。 これを実現するには、単語のチェッカーと単語の変数をさらに追加する必要があります。

また、プログラムを変更して、各単語の長さを比較することもできます。 これを行うには、単語を長さで比較し、それぞれの一意の長さを辞書に保存します。

結論

テキストファイルを読み取ってデータを整理するプログラムを作成し、テキスト内の他の単語と比較した特定の単語の頻度を確認しました。

データの視覚化に興味がある場合は、https://www.digitalocean.com/community/tutorials/how-to-make-a-bar-chart-with-javascript-and-the-d3-もご覧ください。ライブラリ[JavaScriptとD3ライブラリを使用して棒グラフを作成する方法]チュートリアル。