動かざることバグの如し

近づきたいよ 君の理想に

TF-IDF法で「アナタにピッタリの企業」とやらを探してみる

どの企業も「システム構築」「ノンストップ」「設計開発」で似たり寄ったりなのでいっそTF-IDFすれば単純に面白い特徴的な企業が見つかるかもと思った

対象企業

リクナビ2016における「ソフトウェア・情報処理」のジャンル全企業対象(1000社)

結果

例えば株式会社ティージー情報ネットワークと社名だけだとなんの会社か分からないけど、

東京ガス:0.1346153846153846
ティージー:0.057692307692307696
チューター:0.04761100955284588

からなんとなくわかるように東京ガスグループのSI企業である。

株式会社NTTデータCCS

科学:0.03964422374698337
JX:0.03669724770642202
資源:0.03580816501827472

当社は地図事業分野、資源・エネルギー分野、地球科学分野など、他社にない科学ソリューション技術も提供しています。

おおっ

日本コンピュータ・ダイナミクス株式会社

パーキングシステム:0.02768166089965398
育児:0.02431580637531702
システム:0.02422145328719723

駅前や近くのスーパーなど、自転車に乗る人なら一度は目にしたことがあるだろう、時間貸し駐輪場の「EcoStation21」。 当社では、このシステムの開発、運用を手がけています。

株式会社プライオリティ

彼女:0.053168969562359544
Win:0.049826867859078965
アナログ:0.03447535447683008

株式会社オーネスト

面接:0.05525826736724972
クラブ:0.04663632571778326
携帯:0.03866274024920881

「20分間スピーチ」があります。「20分かけて、自己PRをして下さい」という質問ですが、最初は多くの方が面食らいます。

株式会社アゴラ

娘:0.060836501901140684
挨拶:0.0588766162168832
LINE:0.056258098925262644

バック転は中学のときに体育館で一人で練習して覚えました。コミュニケーションは苦手ですが、試行錯誤が好きなのでルービックキューブも得意です。去年、自己中の外注さんと仕事をしたときはうつ病になりそうでしたが、PMさんが彼を解雇したので今は仕事を楽しんでます。今年になってLINEで日報を書くので人間関係のトラブルは小さいうちに解決できてます。先日LINEの日報に「娘のバレエ教室の最終日で娘が「挨拶をするのが恥ずかしい」といったので「この先、体操を頑張るならコーチや友達との挨拶が大事だ」と叱った」と書き、この写真を添付したら求人広告に・・・。娘には仲間と一緒に練習することでコミュニケーション力もつけて欲しい!

おソース

require 'bundler'
Bundler.require

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)
class It < ActiveRecord::Base
end

#「リンゴとレモンとレモン」を[{"リンゴ"=>1, "レモン"=>2}]へ
def create_hash(text)
    nm = Natto::MeCab.new
    hash = {}
    nm.parse(text) do |n|
        if n.feature.split(',')[0] == '名詞'
            hash[n.surface] ||= 0
            hash[n.surface] += 1
        end
    end
    hash
end

def calc_tf(hash)
    total = hash.values.inject(:+)#valueの合計値を計算
    tf = {}
    hash.each do |key, value|
        tf[key] = value / total.to_f
    end
    tf
end

def calc_idf(hash, df, n)
    idf = {}
    hash.each do |key, value|
        idf[key] = (Math.log10(n / df[key]) + 1)
    end
    idf
end

nm = Natto::MeCab.new
word_map = []
corp_name = []
It.all.each do |c|
    corp_name << c.name
    word_map << create_hash(c.description)
end

#全文章の単語出現回数を求める
df = {} #ex. {"リンゴ"=>2, "レモン"=>1, "ミカン"=>1}
word_map.each do |hash|
    hash.each do |key, value|
        df[key] ||= 0
        df[key] += 1
    end
end

word_map.each_with_index do |hash, i|
    tf = calc_tf(hash)
    idf = calc_idf(hash, df, word_map.size)
    tf_idf = {}
    hash.each do |key, value|
        tf_idf[key] = tf[key] * idf[key]
    end
    puts corp_name[i]
    tf_idf.sort_by{|k, v| -v}[0..2].each do |key, value|
        puts "#{key}:#{value}"
    end
    puts ''
end

会社名が上位に来たり「⇒」が入ったりノイズ取り除く作業はもう少し必要だけどそれなりの成果はあるんじゃ?