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

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

対象のpdfは以下の4つです。
[2018年9月期本決算](https://lifull.com/wp-content/uploads/2018/10/presentation_181022-1.pdf)

[2018年9月期3Q](https://lifull.com/wp-content/uploads/2018/07/presentation_20180726_3Q.pdf)

[2018年9月期2Q](https://lifull.com/wp-content/uploads/2018/05/presentation_20180514.pdf)

[2018年9月期1Q](https://lifull.com/wp-content/uploads/2018/02/presentation_20180213.pdf)　

### pdfからテキストを抽出する
[pdfcandy](https://pdfcandy.com/jp/)
というサービスを使って、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(加盟店あたりの売り上げ)の向上に注力する、
ということが改めて読み取れたかと思います。

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