やりたいこと
・yahooの記事をスクレイピングし、形態素解析する
・上位20件の単語と件数を表示したい。その結果をmatplotlibで横棒グラフで示したい。(ここができない)
エラーメッセージ
/usr/local/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py:211: RuntimeWarning: Glyph 30452 missing from current font.
font.set_text(s, 0.0, flags=flags)
/usr/local/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py:176: RuntimeWarning: Glyph 30452 missing from current font.
font.load_char(ord(s), flags=flags)
zsh: segmentation fault python3 a.py
ソースコード
import requests,bs4,re
import MeCab
import unidic
import matplotlib.pyplot as plt
URL = str(input('URL '))
#例https://news.yahoo.co.jp/articles/2dcc7a8bc191252476cdaa14e1cd51cc58ebcfcd
res = requests.get(URL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")#テキストを取得
#検索
pre_text = soup.find(class_="sc-iqzUVk")#htmlのidかclassかで探す。サイトによってidかclassの文字を変える
text = re.sub('[a-z]|[A-Z]', '', str(pre_text))#英字を削除、正規化
tagger = MeCab.Tagger()
word_count = {}
for line in tagger.parse(text).splitlines():#解析した単語と瀕死を一行ずつ読み取る
spl = line.split(',')
if '名詞'in spl[0]:
words = spl[0].split('\t')#単語と「名詞」に分ける
for word in words:
if word in word_count:#同じ単語を調べる
word_count[word] += 1
else:
word_count[word] = 1
term_list =['']*20
count_list = [0]*20
集計した単語の,出現回数を出力
print('[単語 出現回数]','\n')
for term, count in sorted(word_count.items(),key=lambda x:x[1], reverse=True):#降順にソート
if(term != '名詞'):#結果に「名詞」が出てこないようにする
print(term,'\t',count)
for i in range(20):#上位20件の単語と件数を表示したい
term_list[i]= term
count_list[i] = count
plt.barh(term_list,count_list) # 横棒の棒グラフ
plt.show()
回答1件
あなたの回答
tips
プレビュー