Natural Language Toolkit(NLTK)を使用してPython 3で言語データを操作する方法

前書き

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

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

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

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

前提条件

このチュートリアルでは、Python 3をインストールし、コンピューターにローカルプログラミング環境をセットアップする必要があります。 そうでない場合は、appropriate installation and set up guide for your operating systemをたどって設定できます。

このチュートリアルを最大限に活用するには、Python programming languageにある程度精通している必要があります。

[[step-1 -—- importing-nltk]] ==ステップ1—NLTKのインポート

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

python -c "import nltk"

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

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

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

If NLTK is not installed、エラーメッセージが表示されます:

OutputTraceback (most recent call last): File "", line 1, in  ImportError: No module named 'nltk'

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

pip install nltk

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

[[step-2 -—- downloading-nltk-39-s-data-and-tagger]] ==ステップ2—NLTKのデータとタガーをダウンロードする

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

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

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コーパスをインポートします。

from nltk.corpus import twitter_samples

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

twitter_samples.fileids()

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

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

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

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コーパスの正のサブセットに表示される形容詞と名詞の数を数えることです。

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

  • adjectiveは、名詞(または代名詞)を修飾する単語です。たとえば、horribleの映画、funnyの本、deliciousのハンバーガーなどです。 形容詞を数えると、使用されている言語の種類、つまり 意見は事実よりも形容詞を含む傾向があります。

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

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

[[step-3 -—- tokenizing-sentences]] ==ステップ3—文のトークン化

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

ファイルでは、まずコーパスをインポートしましょう。 次に、tweetsvariableを作成し、それにpositive_tweets.jsonファイルからのツイート文字列のlistを割り当てましょう。

nlp.py

from nltk.corpus import twitter_samples

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

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

Tokenizationは、文字列のシーケンスを単語、キーワード、フレーズ、記号、その他の要素など、tokensと呼ばれる部分に分割する行為です。 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タグをタグ付けできます。

[[step-4 -—- tagging-sentences]] ==ステップ4—文のタグ付け

NLTKのPOSタガーにアクセスするには、インポートする必要があります。 すべてのimport statementsは、スクリプトの先頭に配置する必要があります。 この新しいインポートを、他の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タグに関する情報があることがわかります。 各トークン/タグのペアはtupleとして保存されます。

NLTKでは、adjectiveの略語はJJです。

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

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

[[step-5 -—- counting-pos-tags]] ==ステップ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 loopsを作成します。 first loopは、リスト内の各ツイートを繰り返し処理します。 second loopは、各ツイートの各トークン/タグのペアを反復処理します。 各ペアについて、適切なタプルインデックスを使用してタグを検索します。

次に、conditional statementsを使用して、タグが文字列'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)

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

[[step-6 -—- running-the-nlp-script]] ==ステップ6—NLPスクリプトの実行

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

python nlp.py

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

OutputTotal 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でのファイルの読み取りに慣れるために、“How To Handle Plain Text Files in Python 3"に関するガイドを確認してください。

また、実際のTwitterデータを操作することもできます。 Twitter APIへのアクセスについて詳しくは、「https://www.digitalocean.com/community/tutorials/how-to-create-a-twitter-app[Twitterアプリの作成方法]」をご覧ください。次に、“How To Create a Twitterbot with Python 3 and the Tweepy Library”に関するガイドを確認できます。このガイドでは、TweepyPythonライブラリを使用して特定のハッシュタグを含むツイートを収集する方法を示しています。 収集したデータは、NLTKで分析できます。

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

結論

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

Related