Nlpを利用したツイート分析

プラジュワル・シュレイヤス
Prajwal Shreyas

フォローしている

2019年7月23日•9分読み取り

はじめに

近年、ビッグデータの爆発に伴い、組織やデータ科学者は、非伝統的なデータソースを使用して情報抽出を実行するための大きな需要があります。 研究では、データのほぼ80%が非構造化テキストデータとして存在することが示されているため、チャットの転写産物、ソーシャルメディアの投稿、レビュー、ニュー

テキスト分析とは何ですか?

テキスト分析は、パターンを発見し、意思決定を可能にするために非構造化データを合成するプロセスです。 近年まで、テキスト分析は、非効率的で時間がかかるテキストの眼球と手動の分類、すなわち昔ながらの方法を実行しなければなりませんでした。 また、これは、twitterデータなどの何百万もの文書を扱うときの練習解決策ではありません。

Twitterデータ(ツイートとも呼ばれます)は、大量のトピックに関する豊富な情報源です。 このデータを使用して、特定のキーワードに関連する傾向を見つけたり、ブランドの感情を測定したり、新製品やサービスに関するフィードバッ この投稿では、twitterデータのテキスト分析のステップバイステップガイドを提供します。

twitterデータでテキスト分析を実行するには?

テキスト分析に関連するステップは次のとおりです。

ステップ1:ツイートを収集する

ステップ2: ツイートの前処理

ステップ3:センチメント分析の適用

ステップ4:名前付きエンティティ認識の適用

ステップ5:クラスターのツイート

ステップ6:分析の視覚化

ここで、twitterデータのサンプルで上記の手順を実行するjupyterノートブックを添付しました。

ステップ1:ツイートの収集

ツイートのデータには、Twitter Rest APIまたはStreaming APIという二つの方法でプログラムでアクセスできます。

Rest APIを使用すると、特定のユーザーのすべてのツイートまたはフォロワーのリストを収集できます。 必要な権限があれば、ユーザーのアカウントを照会したり、変更したりすることもできます。 Streaming APIを使用すると、検索用語、ユーザー id、または場所に基づいてリアルタイムでツイートを収集できます。

APIにアクセスするには、Twitterからの4つの情報、すなわちAPIキー、APIシークレット、アクセストークン、アクセストークンシークレットが必要です。 アカウントを設定し、pythonパッケージを使用してtwitter APIサービスに接続するための詳細な手順は、ここのブログで説明されています。

私たちの分析のために、私はtwitter streaming APIサービスを使用し、2016年10月1日から1週間にわたって20のFTSE100社のツイートを収集しました。 これにより、合計37,313のツイートが発生しました。 Streaming APIの出力は、分析する前に適切な形式に解析する必要があります。 次のセクションでは、ツイートの前処理に関連する手順を説明します。ステップ2:ツイートの前処理

ここでは、twitter APIからの応答を構造化されたテーブルに解析します。 Twitter streaming APIからの応答は以下の形式です:

twitter APIからの出力を解析するための詳細なコードは以下のとおりです。 出力は、”doc_id”、”username”、”text”などのキーフィールドに構造化されています。 解析された応答は、データベースまたはJSONファイルに格納できます。

import simplejson as json
def get_tweet(doc):
tweetItem = {}
#Available tweet data
tweetItem = doc
#hashtags are identified and provided as a field in the tweet
tweetItem = map(lambda x: x,doc)
# user_mentiones are identified and provided as a field
tweetItem = map(lambda x: x,doc
) # symbols e.g. $APPL are identified and provided as a field
tweetItem = map(lambda x: x,doc)
tweetItem = doc
tweetItem = doc
tweetItem = doc try: tweetItem = doc
except KeyError as e:
tweetItem = 0
pass
return tweetItem

ステップ3:感情分析

人々はつぶやきを介して意見を表明し、これらは通常、それに関連付けられた感情、すなわち正、負、または中立を持っています。 この感情の分析は、議論されているトピックや会社に関するいくつかの有用な洞察につながる可能性があります。 したがって、この分析を実行するために感情分析アルゴリズムを使用することをお勧めします。 ここでは、深層学習アルゴリズムを使用した感情分析の実行に関する詳細を記載した別のブログを作成しました。

感情は有用な指標ですが、ツイートには人、場所、組織の名前などの追加情報が含まれています。 抽出されたデータは、製品や会社に関する非常に有用な洞察につながる可能性があります。 そのため、次のステップでは、この情報を抽出するように設計された名前付きエンティティ認識アルゴリズムの使用方法について説明します。

ステップ4: 名前付きエンティティ認識

名前付きエンティティ認識アルゴリズムは、ツイートに含まれる人物、場所、組織などの重要なタグを識別します。 たとえば、ツイートに”London”という言及がある場合、アルゴリズムはそれを”Location”とタグ付けします。 しかし、ツイートは一般的に標準的な英語の構文に従っていないため、タグの精度は約60%から70%です。

Stanford NER taggerを使用して、ツイートのエンティティ認識を取得できます。 以下の例では、Donald Trumpのツイートを使用しました。

# -*- coding: utf-8 -*-
from nltk.tag import StanfordNERTagger
from nltk.tokenize import word_tokenize
st = StanfordNERTagger('/stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz',
'/usr/share/stanford-ner/stanford-ner.jar',
encoding='utf-8')#a tweet by Donald Trump
text = 'Just had a very good call with @SwedishPM Stefan Löfven who assured me that American citizen A$AP Rocky will be treated fairly. Likewise, I assured him that A$AP was not a flight risk and offered to personally vouch for his bail, or an alternative....'
tokenized_text = word_tokenize(text)
classified_text = st.tag(tokenized_text)
print(classified_text)

ステップ5: 類似のツイートのクラスタリング

ツイートの数は互いに非常に似ていますが、これは同じトピックについてツイートする人々が原因である可能性があり したがって、ノイズを低減するためには、それらの類似性に基づいてグループにつぶやきをクラスタ化することが有用であろう。 これは、クラスタリングアルゴリズムを使用して行うことができます。

アルゴリズムの内部動作は、tf-idf(term frequency—Inverse document frequency)行列として知られている機械学習の概念に基づいています。 ここで、各ツイートは文書(d)として扱われ、ツイート内の単語は用語(t)として扱われます。

Term Frequency-Inverse Document Frequencyは、単語がコーパスにとってどれほど重要であるかを示す数値統計です。

用語の頻度は、現在の単語の数とdocument/string/etc内のすべての単語の数の比率です。

用語頻度式

用語t_iの頻度、ここでn_t—現在の文書/文字列内のt_iの数、n_kの合計は現在の文書/文字列内のすべての用語の数です。

Inverse Document Frequencyは、用語t_iを持つ文書の数に対するコーパス内のすべての文書/文字列の数の比率のログです。

逆ドキュメント頻度式

tf-idf(t,d,D)は、tf(t,d)とidf(t,D)の積です。 Tf-idfの詳細については、こちらのブログを参照してください。

TF-IDF Formula

以下のコードでは、クラスタリングを取得するために、テキスト入力とは別に、入力で指定する必要がある追加のパラメータは、類似性しきい値 関数”get_clusters(processedTweets,similarity_threshold)”でしきい値を設定できます。 したがって、80%類似しているすべてのつぶやきは、コサイン類似性として知られている類似度の尺度に基づいて一緒にクラスター化されます。

def cluster_text(dist_text,processedTweets,dist_threshold_txt):
cluster_id = 1
for i in range(dist_text.shape):
try:
doc_dist_array_txt = dist_text
# identify document ids where the tweets are similar
similarDocs = np.where(doc_dist_array_txt <= dist_threshold_txt)
processedTweets.ix.isin(), 'cluster_ref'] = cluster_id
cluster_id = cluster_id + 1
except ValueError:
continue
return processedTweets
# %%%%%%%%% Calculate Cosine distance of documents %%%%%%%%%%%%%%
def tokenize_only(text):
# first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
tokens =
filtered_tokens =
# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
for token in tokens:
if re.search('', token):
filtered_tokens.append(token)
return filtered_tokens
def get_clusters(processedTweets, similarity_threshold):
tweets = processedTweets.tolist()
#Define count vectorizer parameters
vectorizer = CountVectorizer(max_df=1.0, min_df=1, stop_words=stopwords, tokenizer=tokenize_only)
# Get document term frequency matix
dtf_matrix = vectorizer.fit_transform(tweets) #fit the vectorizer to tweets which does not contain'htttp' and 'RT'
dist_text = np.around(abs(1 - cosine_similarity(dtf_matrix)),2)
# --------1D clustering based on distance measure
# Pre clustering setup
processedTweets = None # Tweets that are 1-similarithy% similar, as defined by dist_threshold
# Clustering of tweets based on text
processedTweets = cluster_text(dist_text,processedTweets,dist_threshold_txt = (1-similarity_threshold))
return processedTweets

結果には追加の列”cluster_ref”が含まれます。 たとえば、ドキュメント1とドキュメント2が類似しているため、両方ともcluster_refが1の場合、cluster_refはすべての類似したドキュメントを単一のグループにグルー

ステップ6: 結果の視覚化

上記の結果の視覚化は、製品や会社に関する消費者の意見への洞察を促進するのに役立ちます。 以下のセクションでは、視覚化の目的でTableauを使用します。 ここでダッシュボードへのリンクを参照してください。

下の最初のグラフは、各企業の正、負、平均感情(青線)です。 バーは会社の平均センチメントを表し、ツイート数には重み付けされません。 この重み付けされていない感情は、ツイートの数を考慮していないため、企業間の正確な比較を提供しません。

コメントを残す

メールアドレスが公開されることはありません。