序章

テキストベースのコミュニケーションは、最も一般的な表現形式の1つになっています。 私たちは毎日、メール、テキストメッセージ、ツイート、ステータスの更新を行っています。 その結果、非構造化テキストデータが非常に一般的になり、大量のテキストデータを分析することが、人々が何を考えているかを理解するための重要な方法になりました。

Twitterのツイートは、世界中のトレンドニューストピックを見つけるのに役立ちます。 Amazonのレビューは、ユーザーが最も評価の高い製品を購入するのに役立ちます。 知識の整理と構造化のこれらの例は、自然言語処理(NLP)タスクを表しています。

NLPは、コンピューターと人間の相互作用に焦点を当てたコンピューターサイエンスの分野です。 NLP技術はテキストの分析に使用され、コンピューターが人間の言語を理解する方法を提供します。 NLPアプリケーションのいくつかの例には、自動要約、トピックセグメンテーション、および感情分析が含まれます。

このチュートリアルでは、Python用のNLPツールである Natural Language Toolkit(NLTK)の使用方法を紹介します。

前提条件

このチュートリアルでは、Python 3をインストールし、コンピューターにローカルプログラミング環境をセットアップする必要があります。 そうでない場合は、適切なインストールとオペレーティングシステムのセットアップガイドに従ってセットアップできます。

このチュートリアルを最大限に活用するには、Pythonプログラミング言語にある程度精通している必要があります。

ステップ1—NLTKのインポート

Pythonでの作業を開始する前に、NLTKモジュールがインストールされていることを確認しましょう。 コマンドラインで、次のコマンドを実行してNLTKを確認します。

  1. python -c "import nltk"

NLTKがインストールされている場合、このコマンドはエラーなしで完了します。 次に、最新バージョンがインストールされていることを確認しましょう。

  1. python -c "import nltk; print(nltk.__version__)"

このバージョンを必要とするNLTKのTwitterパッケージを使用するため、バージョン3.2.1がインストールされている必要があります。

NLTKがインストールされていない場合、次のエラーメッセージが表示されます。

  1. Output
    Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'

エラーメッセージはNLTKがインストールされていないことを示しているので、pipを使用してライブラリをダウンロードします。

  1. pip install nltk

次に、このチュートリアルで使用するデータとNLTKツールをダウンロードします。

ステップ2—NLTKのデータとタガーをダウンロードする

このチュートリアルでは、NLTKからダウンロードできるTwitterコーパスを使用します。 具体的には、NLTKのtwitter_samplesコーパスを使用します。 次のように、コマンドラインからコーパスをダウンロードしてみましょう。

  1. python -m nltk.downloader twitter_samples

コマンドが正常に実行された場合は、次の出力が表示されます。

Output
[nltk_data] Downloading package twitter_samples to [nltk_data] /Users/sammy/nltk_data... [nltk_data] Unzipping corpora/twitter_samples.zip.

次に、品詞(POS)タガーをダウンロードします。 POSタグ付けは、特定のPOSタグ(名詞、動詞、形容詞、副詞など)に対応するものとしてテキスト内の単語にラベルを付けるプロセスです。 このチュートリアルでは、特にNLTKのaveraged_perceptron_taggerを使用します。 平均的なパーセプトロンタガーは、パーセプトロンアルゴリズムを使用して、どのPOSタグに単語が与えられる可能性が最も高いかを予測します。 次のように、タガーをダウンロードしましょう。

  1. python -m nltk.downloader averaged_perceptron_tagger

コマンドが正常に実行された場合は、次の出力が表示されます。

Output
[nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] /Users/sammy/nltk_data... [nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.

コーパスが正しくダウンロードされたことを再確認しましょう。 ターミナルで、Pythonインタラクティブ環境を開きます。

python

Pythonのインタラクティブ環境で、twitter_samplesコーパスをインポートします。

  1. from nltk.corpus import twitter_samples

NLTKのTwitterコーパスには、現在、TwitterStreamingAPIから取得した20,000件のツイートのサンプルが含まれています。 完全なツイートは、行で区切られたJSONとして保存されます。 twitter_samples.fileids()メソッドを使用して、コーパスに存在するJSONファイルの数を確認できます。

  1. twitter_samples.fileids()

出力は次のようになります。

Output
[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']

これらのファイルIDを使用して、ツイート文字列を返すことができます。

  1. twitter_samples.strings('tweets.20150430-223406.json')

これを実行すると、多くの出力が返されます。 一般的には次のようになります。

Output
[u'RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP'...]

これで、コーパスが正常にダウンロードされたことがわかりました。 それでは、ショートカットctrl +Dを使用してPythonインタラクティブ環境を終了しましょう。

twitter_samplesコーパスにアクセスできるようになったので、ツイートを処理するためのスクリプトの作成を開始できます。

スクリプトの目標は、twitter_samplesコーパスのポジティブサブセットに表示される形容詞と名詞の数を数えることです。

  • 名詞は、その最も基本的な定義では、通常、人、場所、または物として定義されます。 たとえば、 movie book 、およびburgerはすべて名詞です。 可算名詞は、議論されているさまざまなトピックの数を判断するのに役立ちます。

  • 形容詞は、名詞(または代名詞)を修飾する単語です。たとえば、恐ろしい映画、面白い本、おいしい[ X148X]ハンバーガー。 形容詞を数えることで、使用されている言語の種類を判別できます。 意見には、事実よりも形容詞が多く含まれる傾向があります。

後でこのスクリプトを拡張して、正の形容詞( great awesome happy など)と負の形容詞( Boring lame sad など)。これは、たとえば、製品や映画に関するツイートやレビューの感情を分析するために使用できます。 このスクリプトは、その製品または映画に関連する決定に情報を提供できるデータを提供します。

次のステップでスクリプトを開始します。

ステップ3—文のトークン化

まず、選択したテキストエディタで、使用するスクリプトを作成し、nlp.pyと呼びます。

このファイルでは、最初にコーパスをインポートしましょう。 次に、tweets 変数を作成し、positive_tweets.jsonファイルからツイート文字列のリストを割り当てます。

nlp.py
from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')

ツイートのリストを最初にロードするとき、各ツイートは1つの文字列として表されます。 ツイート内のどの単語が形容詞または名詞であるかを判別する前に、まずツイートをトークン化する必要があります。

トークン化は、文字列のシーケンスを単語、キーワード、フレーズ、記号、その他の要素など、トークンと呼ばれる部分に分割する行為です。 tweets_tokensという新しい変数を作成して、トークン化されたツイートのリストを割り当てます。

nlp.py
from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

この新しい変数tweets_tokensは、リスト内の各要素がトークンのリストであるリストです。 各ツイートのトークンができたので、適切なPOSタグでトークンにタグを付けることができます。

ステップ4—文にタグを付ける

NLTKのPOSタガーにアクセスするには、それをインポートする必要があります。 すべてのimportステートメントは、スクリプトの先頭に配置する必要があります。 この新しいインポートを他のインポートステートメントの下に置きましょう。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

これで、各トークンにタグを付けることができます。 NLTKを使用すると、pos_tag_sents()を使用してすべてを一度に実行できます。 新しい変数 tweets_taggedを作成します。これを使用して、タグ付きリストを保存します。 この新しい行は、現在のスクリプトの最後に直接配置できます。

tweets_tagged = pos_tag_sents(tweets_tokens)

タグ付きトークンがどのように見えるかを知るために、tweets_taggedリストの最初の要素は次のようになります。

[(u'#FollowFriday', 'JJ'), (u'@France_Inte', 'NNP'), (u'@PKuchly57', 'NNP'), (u'@Milipol_Paris', 'NNP'), (u'for', 'IN'), (u'being', 'VBG'), (u'top', 'JJ'), (u'engaged', 'VBN'), (u'members', 'NNS'), (u'in', 'IN'), (u'my', 'PRP$'), (u'community', 'NN'), (u'this', 'DT'), (u'week', 'NN'), (u':)', 'NN')]

ツイートがリストとして表されており、トークンごとにPOSタグに関する情報があることがわかります。 各トークン/タグのペアは、タプルとして保存されます。

NLTKでは、形容詞の略語はJJです。

NLTKタガーは、単数名詞NN)を複数名詞NNS)とは異なるタグでマークします。 簡単にするために、NNタグを追跡することによって、単数名詞のみをカウントします。

次のステップでは、JJNNがコーパス全体に出現する回数をカウントします。

ステップ5—POSタグを数える

JJNNがアキュムレータ(カウント)変数を使用して表示される回数を追跡します。この変数は、タグが見つかるたびに継続的に追加されます。 まず、スクリプトの下部にカウントを作成しましょう。最初にゼロに設定します。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

変数を作成した後、2つのforループを作成します。 最初のループは、リスト内の各ツイートを繰り返し処理します。 2番目のループは、各ツイートの各トークン/タグのペアを反復処理します。 ペアごとに、適切なタプルインデックスを使用してタグを検索します。

次に、条件文を使用して、タグが文字列'JJ'または'NN'のいずれかに一致するかどうかを確認します。 タグが一致する場合は、適切なアキュムレータに(+= 1)を追加します。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

2つのループが完了すると、コーパスに形容詞と名詞の合計数が表示されます。 スクリプトで見つかった形容詞と名詞の数を確認するために、スクリプトの最後にprintステートメントを追加します。

nlp.py
...

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

この時点で、私たちのプログラムは、コーパスで見つかった形容詞と名詞の数を出力できるようになります。

ステップ6—NLPスクリプトの実行

nlp.pyファイルを保存して実行し、見つかった形容詞と名詞の数を確認します。

  1. python nlp.py

スクリプトの実行には数秒かかる場合がありますので、しばらくお待ちください。 すべてがうまくいけば、スクリプトを実行すると、次の出力が得られるはずです。

Output
Total number of adjectives = 6094 Total number of nouns = 13180

出力が同じように見える場合は、このチュートリアルを正常に完了したことを意味します。 おめでとう!

完成したコード

完成したコードについては、他の人や将来の自分がフォローしやすいようにコメントを追加する必要があります。 スクリプトは次のようになります。

nlp.py
# Import data and tagger
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

# Load tokenized tweets
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

# Tag tagged tweets
tweets_tagged = pos_tag_sents(tweets_tokens)

# Set accumulators
JJ_count = 0
NN_count = 0

# Loop through list of tweets
for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

# Print total numbers for each adjectives and nouns
print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

このチュートリアルでは、NLTKからダウンロードしたTwitterコーパスを使用しましたが、独自のデータを読み取ることができます。 Pythonでのファイルの読み取りに慣れるために、「Python3でプレーンテキストファイルを処理する方法」に関するガイドを確認してください。

また、実際のTwitterデータの操作に興味があるかもしれません。 Twitter APIへのアクセスについて詳しくは、「Twitterアプリの作成方法」をご覧ください。 次に、「Python3とTweepyライブラリを使用してTwitterbotを作成する方法」のガイドを確認できます。このガイドでは、TweepyPythonライブラリを使用して特定のハッシュタグを含むツイートを収集する方法を示しています。 収集したデータは、NLTKで分析できます。

ここから、コードを拡張して、複数名詞と単数名詞の両方をカウントしたり、形容詞の感情分析を行ったり、Pythonとmatplotlibを使用してデータを視覚化したりできます。

結論

このチュートリアルでは、PythonのNLTKライブラリを使用してテキストを分析するための自然言語処理の手法をいくつか学びました。 これで、Pythonでコーパスのダウンロード、トークン化、タグ付け、およびPOSタグのカウントを行うことができます。 このチュートリアルを利用して、Pythonで独自のテキストデータを操作するプロセスを容易にすることができます。