前提
サイトURL→https://python-man.club/python_get_tweet_morphological-analysis/
サイトに載っていたプログラムをそのままコピーした後
必要なものをpipでインストールしましたがエラーが多く
自分なりにプログラムを修正しても上手くいかず困っています。
python完全初心者です。よろしくお願いします。
実現したいこと
pythonのライブラリ『tweepy』を使ってTwitterをスクレイピング
した後、wordcloudを用いて使用頻度の高い単語などを表示したい。
エラーメッセージ
[('G', 2), ('123', 2), ('ゲーム', 2), ('https', 2), ('://', 2), ('t', 2), ('.', 2), ('co', 2), ('/', 2), ('年', 2), ('イメージ', 2), ('@', 1), ('ba', 1), ('0797', 1), ('naj', 1), ('残念', 1), ('はずれ', 1), ('たる', 1), ('毎日', 1), ('挑戦', 1)]
ソースコード(個人情報は文字列ffffに変更してます)
python
1import tweepy 2from datetime import datetime,timezone 3import pytz 4import pandas as pd 5import collections 6import MeCab 7import datetime 8import matplotlib.pyplot as plt 9from wordcloud import WordCloud 10import seaborn as sns 11sns.set(font='yuminl.ttf') 12 13CONSUMER_KEY = 'ffff' 14CONSUMER_SECRET = 'ffff' 15ACCESS_TOKEN = 'ffff' 16ACCESS_SECRET = 'ffff' 17 18auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 19auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET) 20api = tweepy.API(auth) 21 22search_results = api.search_tweets(q="ゲーム", result_type="recent",tweet_mode='extended',count=50) 23 24tw_data = [] 25for tweet in search_results: 26 #tweet_dataの配列に取得したい情報を入れていく 27 tw_data.append([ 28 tweet.id, 29 tweet.full_text, 30 tweet.favorite_count, 31 tweet.retweet_count, 32 tweet.user.id, 33 tweet.user.screen_name, 34 tweet.user.name, 35 tweet.user.description, 36 tweet.user.friends_count, 37 tweet.user.followers_count, 38 tweet.user.following, 39 tweet.user.profile_image_url, 40 tweet.user.profile_background_image_url, 41 tweet.user.url 42 ]) 43 44#取り出したデータをpandasのDataFrameに変換 45#CSVファイルに出力するときの列の名前を定義 46labels=[ 47 'ツイートID', 48 'ツイート本文', 49 'いいね数', 50 'リツイート数', 51 'ID', 52 'ユーザー名', 53 'アカウント名', 54 '自己紹介文', 55 'フォロー数', 56 'フォロワー数', 57 '自分のフォロー状況', 58 'アイコン画像URL', 59 'ヘッダー画像URL', 60 'WEBサイト' 61 ] 62 63#tw_dataのリストをpandasのDataFrameに変換 64df = pd.DataFrame(tw_data,columns=labels) 65 66df1=df.iat[2,1] 67df2=df.iat[3,1] 68tw_text=df1 + df2 69f=open('text.txt','w',encoding='UTF-8') 70f.write(str(tw_text)) 71f.close 72 73#f= open("text.txt", 'r', encoding='UTF-8') 74#text=f.read() 75#f.close() 76text=tw_text 77tagger =MeCab.Tagger() 78tagger.parse('') 79node = tagger.parseToNode(text) 80 81word_list=[] 82while node: 83 word_type = node.feature.split(',')[0] 84 if word_type in ["名詞",'代名詞']: 85 word_list.append(node.surface) 86 node=node.next 87word_chain=' '.join(word_list) 88 89c=collections.Counter(word_list) 90font_path='C:/Windows/Fonts/yuminl.ttf' 91words = ['https','t','co','自民','し','w','そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる', 'なる', 'こと', 'もう', 'いい', 'ある', 'ゆく', 'れる', 'ん', 'の'] 92result = WordCloud(width=800, height=600, background_color='white', 93 font_path=font_path,regexp=r"[\w']+", 94 stopwords=words).generate(word_chain) 95result.to_file("./wordcloud_sample1.png") 96print(c.most_common(20)) 97fig = plt.subplots(figsize=(8, 10)) 98 99sns.set(font="Hiragino Maru Gothic Pro",context="talk",style="white") 100sns.countplot(y=word_list,order=[i[0] for i in c.most_common(20)],palette="Blues_r")
試したこと
エラーが表示されるたびにエラー行部分を修正したり削除したりしていましたが最終的に行き詰まってしまいました。
「ツイート時刻」と「アカウント作成日時」が足りないです。
エラーが出るたびに削除していたのでめちゃくちゃになってました。ありがとうございます。
プログラムとエラー文を最新の物に変更しました。すみません
文字列に変換すればよいのではないでしょうか。(変数名が適切ではない様に思えます)
f.write(str(tw_text))
都度修正していただきありがとうございます。
更新した後↑のようなエラー文に変化しました。ファイルが見つからないということは事前に作成しておくべきファイルなのでしょうか?
参考にしているプログラムコードをみると、
f= open("text.txt", 'r', encoding='UTF-8')
なのだと思います。ただ、直前で保存したファイルを何故に再度読み込んでいるのかは不明ですが。。。(変数 tw_text を使うとよいかと)
それから、先程気がついたのですが、
df1=df.iat[2,2]
df2=df.iat[3,2]
は、
df1=df.iat[2,1]
df2=df.iat[3,1]
に変更する必要があります。理由は「ツイート時刻」を削ったから、です。
df1,2の修正の件、了解しました。修正後もエラー文には変化ありませんでした。
73行目の
f= open("/text.txt", 'r', encoding='UTF-8')は
どのように変更すべきでしょうか?
『/』を削除するだけで大丈夫でしょうか
はい、/ を削除してみて下さい。
f= open("text.txt", 'r', encoding='UTF-8')
『/』削除してみたところ↑のようなエラーに変化しましたm(__)m
一旦、以下の行をコメントアウトして、
f= open("text.txt", 'r', encoding='UTF-8')
text=f.read()
f.close()
直後に以下を追加して試してみて下さい。
text = tw_text
変更しました。長いエラー文に変化しましたm(__)m
以下のエラーメッセージが表示されています。/System/Library/Fonts/ヒラギノ明朝 ProN.ttc ファイルが存在しないのでしょう。
No such file or directory: '/System/Library/Fonts/ヒラギノ明朝 ProN.ttc'
Cドライブのwindowsフォルダ内のfontsフォルダ内にあったArialで指定して実行しました。よくわからない文字が出力されました。そのため22行目の api.search_tweets(q="かきくけこ" の”"内の部分を変化させたら実行結果が変化しました。ちなみに””内を”あいうえお”としたときは [('あい', 1)] と表示されました。
なぜこんな文字が出力されるのか全然わかんないです...
ちなみに11行目のsns.set(font='Hiragino Sans')の部分もsns.set(font='Arial')に変更すべきでしょうか?
"あいうえお" や "かきくけこ" という様な、ツイート本文に含まれる可能性の低い語句ではなく、意味のありそうな語句を指定してみてはどうでしょうか。
"ゲーム"に指定したところエラー文が変化しました。
すみません。70行目のエラー解説お願いします……(T_T)
おそらく、encoding を指定する必要があります。
f=open('text.txt','w',encoding='utf-8')
f.write(str(tw_text))
ありがとうございます!それらしい結果に変化したのですが、ここからwordcloudに表示するためにはどのようにすればよいでしょうか?
プログラム実行後、フォルダにtext.txtというファイルが生成されていました。そのテキストにはエラー文の@ba0797naj 残念ながらはずれです…!
当たるまで毎日挑戦できます!と書かれていました。
度々すみません。↑2つのコメントは無視で大丈夫です。すみません。wordcloud_sample1.pngというファイルが生成されていました。これが完成形だと思います。ただ出現頻度の高い言葉が2,3個表示されているのですが、いろんな大きさの四角形がたくさんあってワードが全然表示されてないんですが何が原因でしょうか
日本語が表示されず、英単語しか表示されないです...。それと実行結果を見る限り複数のツイートから分析するのではなく最新の1ツイートだけ分析してるみたいです。
すみません!上のコメント全部無視で大丈夫です。日本語が表示されない問題はフォントをarial.ttfからyuminl.ttfに変更したところ解決しました。たくさんツイートを取得してその中から出現頻度の高い単語を表示したいのですが、今の実行結果を見る限りツイートを1件だけ取得してその中の単語を表示してるだけのプログラムになってしまっています。ちなみに22行目のツイート取得のプログラム内のcount=の部分を50にしましたが結果が変わりませんでした。お願いします。m(__)m
素人の意見ですが、22行目で複数のツイートを取得しても66行目から68行目の、取得したツイートをtext.textに書き込むプログラムが1回しか行われていないのが原因だと思うのですが、22行目で読みんだツイート分text.textに書き込むにはどのようなプログラムに編集すべきでしょうか?
あなたの回答
tips
プレビュー