Help us understand the problem. What is going on with this article?

決算説明資料の頻出単語を出してみる

More than 1 year has passed since last update.

2018年の決算説明資料を形態素解析して頻出単語
を出してみたいと思います。

対象のpdfは以下の4つです。
2018年9月期本決算

2018年9月期3Q

2018年9月期2Q

2018年9月期1Q 

pdfからテキストを抽出する

pdfcandy
というサービスを使って、pdfから.txtファイルに変換を行いました。

形態素解析する

変換したテキストを(手動で)一つのテキストファイルにして、
mecabとrubyを使って、形態素解析を行います。

module My                                                                                       
  class WordCounter                                                              
    MECAB = '/usr/local/bin/mecab'                                               
    NECESSARY_FEATURE = %w/名詞,固有名詞 名詞,一般 名詞,副詞可能 名詞/           
    UNNECESSARY_FEATURE = %w/数 名詞,接尾,記号/                                  

    def initialize                                                               
      @result = Hash.new(0)                                                      
    end                                                                          

    attr_reader :result                                                          

    # mainループ                                                                 
    def count(text)                                                              
      words = split_to_words(text)                                               
      count_up_result(words)                                                     
      self                                                                       
    end                                                                          

    # Mecabで単語に分割し,必要な品詞のみ抽出する                                
    def split_to_words(text)                                                     
      results = IO.popen(MECAB, 'r+') { |mecab|                                  
        mecab.puts(text) 
        mecab.close_write                                                        
        mecab.readlines                                                          
      }                                                                          
      results.map { |result| necessary?(result) ? result.split.first : nil }.compact
    end                                                                          

    # 単語として使うする属性を判断する                                           
    def necessary?(feature)                                                      
      case feature                                                               
      when Regexp.new(NECESSARY_FEATURE.join('|'))                               
        true                                                                     
      when Regexp.new(UNNECESSARY_FEATURE.join('|'))                             
        false                                                                    
      when /名詞/                                                                
        warn feature                                                             
        false                                                                    
      else                                                                       
        false                                                                    
      end                                                                        
    end                                                                          

    # 単語数をカウント                                                           
    def count_up_result(words)                                                   
      words.each do |word|                                                       
        @result[word] += 1                                                       
      end                                                                        
    end                                                                          
  end 

target = File.open("ir_text.txt")                                                    
target_string = target.read                                                      
target.close                                                                     

counter = My::WordCounter.new                                                    
counter.count(target_string)                                                     

result = counter.result.sort_by{ |word,count| -count }                           

result.each { |word,count| puts "#{word} => #{count}" }                                    

(対象外にする品詞のフィルタリングがうまくいかなかったので後日検証します…)

結果

LIFULL => 395
事業 => 186
不動産 => 118
情報 => 102
サービス => 88
売上 => 79
Trovit => 71
Mitula => 68
株 => 66
万 => 66
物件 => 65
サイト => 65
顧客 => 63
株式会社 => 60
運営 => 59
利益 => 57
その他 => 57
海外 => 56
収益 => 53
億 => 52
変更 => 49
会社 => 48
当期 => 47
ARPA => 47
関連 => 46
費 => 46
子会社 => 46
セグメント => 46

この中で社名や「不動産情報サービス」「株式会社」などの
頻出してある種当然の単語を抜くと、

Trovit => 71
Mitula => 68
サイト => 65
顧客 => 63
利益 => 57
海外 => 56
変更 => 49
当期 => 47
ARPA => 47
子会社 => 46

海外事業やARPA(加盟店あたりの売り上げ)の向上に注力する、
ということが改めて読み取れたかと思います。

本来なら時系列での比較や同業他社の比較が
面白い結果が出るはずなのですが
今回はここまでで、また別の機会に試してみたいと思います。

lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away