見出し画像

pythonを使って、3秒でPDFからワードクラウドを作成する

ワードクラウドを作りたいな。
ちょっとした資料のタイトルにワードクラウドの画像を配置したいな。
そんなことを考えたので、備忘として記事にします。


今回対処としたPDFファイルは、日銀の価格マークアップに関する資料です。2024年8月28日日付の日銀資料。総ページ数:32。
【わが国企業における価格マークアップの決定要因と生産性への含意】

chatPDFで要約してもらいました。

要約はchatPDFにやってもらいました。chatPDFについては、こちらを参照下さい。


価格マークアップとは、企業が製品やサービスの販売価格を設定する際に、限界費用(追加的な生産コスト)に対してどれだけの上乗せを行うかを示す指標です。具体的には、販売価格と限界費用の差を指します。価格マークアップが高いほど、企業は製品やサービスに対して高い利益を得ることができます。

価格マークアップの意義

  1. 利益の確保: 価格マークアップは、企業が利益を確保するための重要な要素です。高いマークアップは、企業がコストをカバーし、利益を上げるために必要です。

  2. 市場競争力: 競争環境によって価格マークアップは変動します。競争が激しい市場では、企業は価格を下げざるを得ず、マークアップが縮小することがあります。

  3. 経済的な示唆: 価格マークアップの変動は、経済全体の健康状態や企業の競争力を反映する指標ともなります。例えば、マークアップが持続的に低下している場合、企業の収益性が低下している可能性があります。

このように、価格マークアップは企業の経済活動や市場の動向を理解する上で重要な概念です。



pythonコード

では、早速pythonでコードを書いていきます。

PDFからテキストを抽出して、テキストファイルへ出力

import PyPDF2

filename = 'wp24j11.pdf'  #任意で変更
# PDFファイルを開く
pdf_file = open(filename, 'rb')

# PDFリーダーオブジェクトを作成
pdf_reader = PyPDF2.PdfReader(pdf_file)

# ページを繰り返し処理し、テキストを取得
text = ''
for page_num in range(len(pdf_reader.pages)):
    page = pdf_reader.pages[page_num]
    text += page.extract_text()

# テキストを出力
print(text)
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(text)
# ファイルを閉じる
pdf_file.close()

実行すると、下記のように表示され、output.txtのテキストファイルが作成されます。

jupyterの画面

形態素解析

import MeCab

f = open("output.txt",encoding="utf-8")
text = f.read()
f.close()

m = MeCab.Tagger()
node = m.parseToNode(text)

meishi_list = []
doshi_list = []
keiyoshi_list = []

while node:
    if node.feature.split(",")[0] == "名詞":
        meishi_list.append(node.surface)
    elif node.feature.split(",")[0] == "動詞":
        doshi_list.append(node.feature.split(",")[6])
    elif node.feature.split(",")[0] == "形容詞":
        keiyoshi_list.append(node.feature.split(",")[6])

    node = node.next
meishi_list

実行結果
名詞が抽出されています。

頻出単語の抽出

import collections
c = collections.Counter(meishi_list)
c.most_common(30)

頻出順に単語が並びます。

マークとアップが別々の単語として認識されてしまっています。
import japanize_matplotlib
japanize_matplotlib.japanize()
import seaborn as sns
import matplotlib.pyplot as plt
fig = plt.subplots(figsize=(8, 8))
sns.countplot(y=meishi_list,order=[i[0] for i in c.most_common(30)])
可視化

ワードクラウドの作成

from wordcloud import WordCloud
import matplotlib.pyplot as plt
wordcloud = WordCloud(font_path="‪C:\Windows\Fonts\BIZ-UDMinchoM.ttc",
                     background_color = "white",
                     width = 600,
                     height = 400,
                     min_font_size = 10,
                     prefer_horizontal = 1.0)
wordcloud.generate(" ".join(meishi_list))

plt.figure(figsize = (12,8))
plt.imshow(wordcloud)
plt.axis("off")

出来ました。
マークばっかりですww
先ほど可視化したグラフ通りの頻度毎に単語が表示されています。

ちょこっとワードクラウドを使いたいときに便利なので、記事にしました。

以上です。

一括コード

import PyPDF2

filename = 'wp24j11.pdf'  #任意で変更
# PDFファイルを開く
pdf_file = open(filename, 'rb')

# PDFリーダーオブジェクトを作成
pdf_reader = PyPDF2.PdfReader(pdf_file)

# ページを繰り返し処理し、テキストを取得
text = ''
for page_num in range(len(pdf_reader.pages)):
    page = pdf_reader.pages[page_num]
    text += page.extract_text()

# テキストを出力
print(text)
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(text)
# ファイルを閉じる
pdf_file.close()

import MeCab


f = open("output.txt",encoding="utf-8")
text = f.read()
f.close()

m = MeCab.Tagger()
node = m.parseToNode(text)

meishi_list = []
doshi_list = []
keiyoshi_list = []

while node:
    if node.feature.split(",")[0] == "名詞":
        meishi_list.append(node.surface)
    elif node.feature.split(",")[0] == "動詞":
        doshi_list.append(node.feature.split(",")[6])
    elif node.feature.split(",")[0] == "形容詞":
        keiyoshi_list.append(node.feature.split(",")[6])

    node = node.next

import collections
c = collections.Counter(meishi_list)
c.most_common(30)

import japanize_matplotlib
japanize_matplotlib.japanize()
import seaborn as sns
import matplotlib.pyplot as plt
fig = plt.subplots(figsize=(8, 8))
sns.countplot(y=meishi_list,order=[i[0] for i in c.most_common(30)])

from wordcloud import WordCloud
import matplotlib.pyplot as plt

wordcloud = WordCloud(font_path="‪C:\Windows\Fonts\BIZ-UDMinchoM.ttc",
                     background_color = "white",
                     width = 600,
                     height = 400,
                     min_font_size = 10,
                     prefer_horizontal = 1.0)
wordcloud.generate(" ".join(meishi_list))

plt.figure(figsize = (12,8))
plt.imshow(wordcloud)
plt.axis("off")



いいなと思ったら応援しよう!

Mini統計沖縄【It from bit】
メールやTwitterでもお仕事依頼を受け付けています。 どなたでもお気軽にお問い合わせください。