NaturalLanguageToolkit(NLTK)を使用してPython3で言語データを操作する方法
序章
テキストベースのコミュニケーションは、最も一般的な表現形式の1つになっています。 私たちは毎日、メール、テキストメッセージ、ツイート、ステータスの更新を行っています。 その結果、非構造化テキストデータが非常に一般的になり、大量のテキストデータを分析することが、人々が何を考えているかを理解するための重要な方法になりました。
Twitterのツイートは、世界中のトレンドニューストピックを見つけるのに役立ちます。 Amazonのレビューは、ユーザーが最も評価の高い商品を購入するのに役立ちます。 知識の整理と構造化のこれらの例は、自然言語処理(NLP)タスクを表しています。
NLPは、コンピューターと人間の相互作用に焦点を当てたコンピューターサイエンスの分野です。 NLP技術はテキストの分析に使用され、コンピューターが人間の言語を理解する方法を提供します。 NLPアプリケーションのいくつかの例には、自動要約、トピックのセグメンテーション、および感情分析が含まれます。
このチュートリアルでは、Python用のNLPツールである Natural Language Toolkit(NLTK)の使用方法を紹介します。
前提条件
このチュートリアルでは、Python 3をインストールし、コンピューターにローカルプログラミング環境をセットアップする必要があります。 そうでない場合は、適切なインストールとオペレーティングシステムのセットアップガイドに従ってセットアップできます。
このチュートリアルを最大限に活用するには、Pythonプログラミング言語にある程度精通している必要があります。
ステップ1—NLTKのインポート
Pythonでの作業を開始する前に、NLTKモジュールがインストールされていることを確認しましょう。 コマンドラインで、次のコマンドを実行してNLTKを確認します。
- python -c "import nltk"
NLTKがインストールされている場合、このコマンドはエラーなしで完了します。 次に、最新バージョンがインストールされていることを確認しましょう。
- python -c "import nltk; print(nltk.__version__)"
このバージョンを必要とするNLTKのTwitterパッケージを使用するため、バージョン3.2.1がインストールされている必要があります。
NLTKがインストールされていない場合、次のエラーメッセージが表示されます。
- OutputTraceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'
エラーメッセージはNLTKがインストールされていないことを示しているので、を使用してライブラリをダウンロードします pip
:
- pip install nltk
次に、このチュートリアルで使用するデータとNLTKツールをダウンロードします。
ステップ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タグ付けは、特定の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コーパスには、現在、TwitterStreamingAPIから取得した20,000件のツイートのサンプルが含まれています。 完全なツイートは、行で区切られたJSONとして保存されます。 コーパスに存在するJSONファイルの数を使用して確認できます twitter_samples.fileids()
方法:
- twitter_samples.fileids()
出力は次のようになります。
Output[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']
これらのファイルIDを使用して、ツイート文字列を返すことができます。
- 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'...]
これで、コーパスが正常にダウンロードされたことがわかりました。 それでは、ショートカットを使用してPythonインタラクティブ環境を終了しましょう ctrl
+ D
.
これで、 twitter_samples
コーパス、ツイートを処理するためのスクリプトを書き始めることができます。
スクリプトの目標は、の正のサブセットに現れる形容詞と名詞の数を数えることです。 twitter_samples
コーパス:
-
名詞は、その最も基本的な定義では、通常、人、場所、または物として定義されます。 たとえば、 movie 、 book 、およびburgerはすべて名詞です。 可算名詞は、議論されているさまざまなトピックの数を判断するのに役立ちます。
-
形容詞は、名詞(または代名詞)を修飾する単語です。たとえば、恐ろしい映画、面白い本、
おいしい[ X148X]ハンバーガー。 形容詞を数えることで、使用されている言語の種類を判別できます。 意見には、事実よりも形容詞が多く含まれる傾向があります。
後でこのスクリプトを拡張して、正の形容詞( great 、 awesome 、 happy など)と負の形容詞( Boring 、 lame 、 sad など)。これは、たとえば、製品や映画に関するツイートやレビューの感情を分析するために使用できます。 このスクリプトは、その製品または映画に関連する決定に情報を提供できるデータを提供します。
次のステップでスクリプトを開始します。
ステップ3—文のトークン化
まず、選択したテキストエディタで、使用するスクリプトを作成し、それを呼び出します nlp.py
.
このファイルでは、最初にコーパスをインポートしましょう。 次に、を作成しましょう tweets
変数に、からのツイート文字列のリストを割り当てます。 positive_tweets.json
ファイル。
from nltk.corpus import twitter_samples
tweets = twitter_samples.strings('positive_tweets.json')
ツイートのリストを最初にロードするとき、各ツイートは1つの文字列として表されます。 ツイート内のどの単語が形容詞または名詞であるかを判別する前に、まずツイートをトークン化する必要があります。
トークン化は、文字列のシーケンスを単語、キーワード、フレーズ、記号、その他の要素など、トークンと呼ばれる部分に分割する行為です。 と呼ばれる新しい変数を作成しましょう tweets_tokens
、ツイートのトークン化されたリストを割り当てます。
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の品詞タグ付けにアクセスするには、それをインポートする必要があります。 すべてのimportステートメントは、スクリプトの先頭に配置する必要があります。 この新しいインポートを他のインポートステートメントの下に置きましょう。
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
鬼ごっこ。
次のステップでは、回数をカウントします JJ
と NN
コーパス全体に表示されます。
ステップ5—POSタグを数える
何回追跡します JJ
と NN
アキュムレータ(カウント)変数を使用して表示されます。この変数は、タグが見つかるたびに継続的に追加されます。 まず、スクリプトの下部にカウントを作成しましょう。最初にゼロに設定します。
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
)適切なアキュムレータに。
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ステートメントを追加します。
...
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
ファイルして実行し、見つかった形容詞と名詞の数を確認します。
- python nlp.py
スクリプトの実行には数秒かかる場合がありますので、しばらくお待ちください。 すべてがうまくいけば、スクリプトを実行すると、次の出力が得られるはずです。
OutputTotal number of adjectives = 6094
Total number of nouns = 13180
出力が同じように見える場合は、このチュートリアルを正常に完了したことを意味します。 おめでとう!
完成したコード
完成したコードについては、他の人や将来の自分がフォローしやすいようにコメントを追加する必要があります。 スクリプトは次のようになります。
# 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で独自のテキストデータを操作するプロセスを容易にすることができます。