require 'bundler/setup'
require 'mecab'
require 'mini_magick'

# テキストファイルのパス
text_file_path = 'all_text.txt'

# テキストファイルの読み込み
all_text = File.read(text_file_path)

# 改行、スペースを除く
cleaned_text = all_text.gsub(/\s+/, '')

# all_textをファイルに保存
File.write('cleaned_text.txt', cleaned_text)

# MeCabを使って日本語テキストの分かち書き
mecab = MeCab::Tagger.new
words = []

# テキストをチャンクに分割して処理
chunk_size = 1000 # 解析するテキストのチャンクサイズ(適宜調整してください)
cleaned_text.scan(/.{1,#{chunk_size}}/m).each do |chunk|
  parsed = mecab.parse(chunk)
  if parsed
    parsed.split("\n").each do |line|
      columns = line.split("\t")
      word = columns.first
      # 一文字のアルファベット、一文字のひらがな、一文字の記号を除外
      next if word =~ /^[a-zA-Z]$/ || word =~ /^[ぁ-ゔ]$/ || word =~ /^[^\w\s]$/
      # 2文字以上の単語のみを追加
      words << word if word.length > 1 unless columns.empty? || word == 'EOS'
    end
  else
    puts "MeCab parse returned nil for chunk"
  end
end

# 単語の頻度を計算
word_frequency = words.each_with_object(Hash.new(0)) { |word, hash| hash[word] += 1 }

# nil値を除外
word_frequency.delete(nil)

# しきい値を設定して単語をフィルタリング
threshold = 50 # しきい値(適宜調整してください)
filtered_words = word_frequency.select { |word, frequency| frequency >= threshold }

p cloud_words = filtered_words.map { |word, frequency| [word, frequency.to_f] }
p cloud_words.size

# MiniMagickで画像を作成
image_width = 800
image_height = 600
background_color = 'white'

image = MiniMagick::Image.open('base.png') do |img|
  img.size "#{image_width}x#{image_height}"
  img.gravity 'Center'
  img.canvas background_color
end



filtered_words.each do |word, frequency|
  # テキストを画像に追加
  image.combine_options do |img|
    img.font "/Users/masumi/Library/Fonts/SFMonoSquare-Regular.otf"
    img.pointsize frequency / 10
    img.fill ['black', 'blue', 'red', 'green', 'yellow', 'purple', 'orange', 'pink', 'brown', 'gray'].sample
    img.draw "text #{rand(image_width)}, #{rand(image_height)} '#{word}'" # テキストの内容を指定(改行を含む)
  end
end

# 画像を保存
image.write('wordcloud.png')

puts 'Word Cloud generated as wordcloud.png'
[["RubyKaigi", 2179.0], ["2024", 2619.0], ["那覇", 156.0], ["文化", 60.0], ["Matz", 81.0], ["株式会社", 353.0], ["協賛", 254.0], ["ブース", 308.0], ["企画", 58.0], ["興味", 78.0], ["いただき", 217.0], ["ありがとう", 73.0], ["ござい", 110.0], ["ます", 2824.0], ["として", 654.0], ["応募", 53.0], ["作成", 56.0], ["する", 1463.0], ["あり", 465.0], ["募集", 147.0], ["について", 587.0], ["可能", 95.0], ["ください", 508.0], ["当日", 75.0], ["弊社", 95.0], ["にて", 85.0], ["ので", 737.0], ["この", 416.0], ["登録", 110.0], ["よう", 555.0], ["いる", 954.0], ["こと", 1278.0], ["場合", 114.0], ["使用", 82.0], ["使う", 62.0], ["ため", 486.0], ["必要", 145.0], ["など", 363.0], ["ない", 740.0], ["ポリシー", 87.0], ["また", 188.0], ["プロダクト", 162.0], ["開発", 728.0], ["関連", 168.0], ["内容", 214.0], ["配信", 54.0], ["予定", 129.0], ["いただける", 53.0], ["嬉しい", 50.0], ["です", 2239.0], ["会社", 228.0], ["による", 164.0], ["技術", 284.0], ["カンファレンス", 244.0], ["主催", 62.0], ["登壇", 316.0], ["に関する", 78.0], ["報告", 83.0], ["提供", 161.0], ["新着", 54.0], ["情報", 422.0], ["採用", 265.0], ["まし", 1702.0], ["事前", 116.0], ["勉強", 223.0], ["connpass", 84.0], ["イベント", 539.0], ["ログイン", 226.0], ["お知らせ", 62.0], ["ある", 575.0], ["データ", 89.0], ["API", 67.0], ["方法", 108.0], ["23", 71.0], ["より", 242.0], ["企業", 161.0], ["コミュニティ", 173.0], ["個人", 128.0], ["向け", 149.0], ["開始", 56.0], ["いたし", 73.0], ["利用", 315.0], ["詳細", 67.0], ["ページ", 89.0], ["確認", 63.0], ["25", 85.0], ["参加", 1114.0], ["これ", 227.0], ["SmartHR", 108.0], ["rubykaigi", 197.0], ["無料", 116.0], ["LT", 171.0], ["一覧", 183.0], ["見る", 189.0], ["開催", 429.0], ["04", 148.0], ["19", 193.0], ["00", 215.0], ["21", 91.0], ["30", 129.0], ["Google", 52.0], ["ファイル", 105.0], ["期間", 55.0], ["09", 61.0], ["11", 119.0], ["まで", 273.0], ["会場", 222.0], ["東京", 79.0], ["時間", 188.0], ["から", 823.0], ["終了", 61.0], ["のみ", 50.0], ["公開", 253.0], ["説明", 83.0], ["概要", 116.0], ["なる", 617.0], ["昨年", 59.0], ["社内", 56.0], ["行っ", 103.0], ["今年", 183.0], ["スポンサー", 250.0], ["さん", 845.0], ["運営", 160.0], ["初心者", 52.0], ["予習", 70.0], ["タイム", 52.0], ["セッション", 401.0], ["懇親", 56.0], ["ドリンク", 60.0], ["アップ", 75.0], ["楽しみ", 163.0], ["楽しむ", 56.0], ["Ruby", 1449.0], ["知識", 67.0], ["Web", 94.0], ["サービス", 258.0], ["普段", 56.0], ["という", 675.0], ["パーサー", 72.0], ["処理", 126.0], ["メモリ", 60.0], ["管理", 100.0], ["発表", 332.0], ["理解", 117.0], ["pndcat", 51.0], ["沖縄", 464.0], ["Rubyist", 112.0], ["osyoyu", 52.0], ["18", 112.0], ["受付", 53.0], ["場所", 70.0], ["https", 271.0], ["://", 316.0], ["note", 61.0], ["com", 276.0], ["co", 99.0], ["スピーカー", 53.0], ["05", 460.0], ["10", 279.0], ["紹介", 401.0], ["20", 199.0], ["15", 240.0], ["2022", 140.0], ["12", 195.0], ["入社", 89.0], ["好き", 68.0], ["2023", 314.0], ["基本", 62.0], ["機能", 207.0], ["やっ", 140.0], ["アプリ", 67.0], ["最近", 52.0], ["たり", 239.0], ["GitHub", 51.0], ["CRuby", 53.0], ["新しい", 61.0], ["作っ", 118.0], ["仕事", 52.0], ["43", 50.0], ["エンド", 68.0], ["なく", 179.0], ["れる", 302.0], ["お願い", 80.0], ["様子", 60.0], ["申し込み", 155.0], ["いただい", 78.0], ["チーム", 208.0], ["プライバシー", 84.0], ["課題", 82.0], ["その", 244.0], ["実現", 73.0], ["活用", 69.0], ["組織", 66.0], ["支援", 98.0], ["マネジメント", 61.0], ["向上", 51.0], ["やすい", 52.0], ["環境", 72.0], ["貢献", 71.0], ["思う", 72.0], ["もの", 250.0], ["なっ", 320.0], ["エンジニア", 459.0], ["コミッター", 72.0], ["rb", 144.0], ["それ", 119.0], ["でき", 578.0], ["資料", 140.0], ["もっと", 130.0], ["14", 132.0], ["08", 52.0], ["メンバー", 142.0], ["オンライン", 85.0], ["ませ", 390.0], ["問い合わせ", 140.0], ["16", 134.0], ["プラットフォーム", 66.0], ["よく", 103.0], ["質問", 67.0], ["規約", 89.0], ["表示", 91.0], ["システム", 122.0], ["フロント", 52.0], ["今回", 216.0], ["つつ", 51.0], ["ところ", 120.0], ["話し", 57.0], ["いく", 97.0], ["歓迎", 58.0], ["以下", 100.0], ["最新", 156.0], ["ながら", 95.0], ["じゃ", 51.0], ["13", 108.0], ["ましょ", 104.0], ["org", 102.0], ["考え", 96.0], ["プログラミング", 180.0], ["持っ", 59.0], ["たい", 439.0], ["サイト", 90.0], ["てる", 147.0], ["交流", 68.0], ["できる", 289.0], ["スマート", 73.0], ["バンク", 71.0], ["自分", 199.0], ["トーク", 113.0], ["ここ", 88.0], ["聞い", 116.0], ["思い", 247.0], ["限定", 109.0], ["なり", 261.0], ["準備", 76.0], ["活動", 53.0], ["ruby", 150.0], ["ソフトウェア", 54.0], ["書く", 113.0], ["現在", 64.0], ["改善", 72.0], ["2020", 51.0], ["行う", 52.0], ["アプリケーション", 53.0], ["プログラム", 62.0], ["関係", 51.0], ["あれ", 60.0], ["でも", 153.0], ["タイトル", 54.0], ["たち", 115.0], ["本当に", 56.0], ["使っ", 195.0], ["2021", 50.0], ["リリース", 112.0], ["一緒", 94.0], ["公式", 82.0], ["ブログ", 529.0], ["いい", 159.0], ["事業", 153.0], ["20242024", 58.0], ["22", 66.0], ["今後", 74.0], ["英語", 62.0], ["twitter", 70.0], ["用意", 58.0], ["おり", 241.0], ["こちら", 110.0], ["食べ", 93.0], ["会い", 56.0], ["初めて", 75.0], ["わから", 77.0], ["たら", 216.0], ["ぜひ", 148.0], ["皆さん", 54.0], ["チェック", 54.0], ["jp", 140.0], ["閉じる", 267.0], ["写真", 60.0], ["聞き", 56.0], ["Day", 345.0], ["Rails", 150.0], ["なら", 106.0], ["STORES", 215.0], ["03", 84.0], ["動画", 51.0], ["様々", 58.0], ["対応", 81.0], ["決済", 52.0], ["言語", 193.0], ["機会", 59.0], ["しよ", 59.0], ["ツール", 72.0], ["だけ", 130.0], ["たくさん", 79.0], ["国際", 80.0], ["通り", 70.0], ["17", 209.0], ["日本", 60.0], ["どの", 66.0], ["かも", 82.0], ["感想", 80.0], ["導入", 58.0], ["CTO", 51.0], ["コード", 358.0], ["実装", 197.0], ["あなた", 50.0], ["世界", 75.0], ["2018", 51.0], ["によって", 62.0], ["サポート", 93.0], ["いき", 101.0], ["けど", 124.0], ["あっ", 165.0], ["みたい", 61.0], ["リンク", 81.0], ["ピクシブ", 52.0], ["02", 61.0], ["現地", 61.0], ["以上", 61.0], ["多く", 141.0], ["問題", 68.0], ["思っ", 173.0], ["解決", 81.0], ["そして", 73.0], ["実行", 132.0], ["レポート", 109.0], ["られる", 60.0], ["だっ", 146.0], ["あと", 64.0], ["Namespace", 141.0], ["06", 81.0], ["01", 76.0], ["みる", 54.0], ["参考", 110.0], ["って", 116.0], ["なかっ", 143.0], ["読者", 657.0], ["メソッド", 68.0], ["お話", 107.0], ["体験", 79.0], ["られ", 119.0], ["藤村", 56.0], ["書い", 128.0], ["まとめ", 101.0], ["ydah", 57.0], ["ライブラリ", 119.0], ["講演", 54.0], ["OSS", 54.0], ["特に", 66.0], ["最高", 51.0], ["こんにちは", 179.0], ["大変", 52.0], ["そんな", 57.0], ["まだ", 69.0], ["くれ", 63.0], ["でし", 344.0], ["良い", 121.0], ["そう", 266.0], ["いう", 51.0], ["同じ", 59.0], ["ちょっと", 60.0], ["記事", 553.0], ["しれ", 50.0], ["でしょ", 94.0], ["まず", 107.0], ["くらい", 58.0], ["フレーバー", 66.0], ["はじめ", 116.0], ["実際", 65.0], ["とか", 118.0], ["読む", 59.0], ["コメント", 94.0], ["プロフィール", 64.0], ["id", 61.0], ["月別", 57.0], ["アーカイブ", 61.0], ["▼▶", 409.0], ["52024", 58.0], ["20232023", 53.0], ["20212021", 50.0], ["はてな", 279.0], ["はじめる", 52.0], ["引用", 345.0], ["ストック", 247.0], ["再度", 88.0], ["試し", 108.0], ["やめる", 146.0], ["少し", 53.0], ["どう", 109.0], ["わかり", 56.0], ["感じ", 194.0], ["とき", 77.0], ["多い", 69.0], ["検索", 99.0], ["デザイン", 58.0], ["テスト", 103.0], ["RBS", 75.0], ["hsbt", 72.0], ["解説", 97.0], ["聞く", 52.0], ["動く", 57.0], ["状態", 81.0], ["最後", 88.0], ["パーサ", 84.0], ["文法", 77.0], ["定義", 66.0], ["結果", 63.0], ["スライド", 54.0], ["gem", 74.0], ["::", 61.0], ["使わ", 54.0], ["部分", 54.0], ["とても", 96.0], ["フォロー", 59.0], ["YJIT", 57.0], ["(@", 193.0], ["構文", 53.0], ["解析", 69.0], ["生成", 73.0], ["ノベルティ", 58.0], ["dev", 57.0], ["Lrama", 79.0], ["日間", 54.0], ["プレス", 55.0], ["\u008B\u0088", 84.0], ["\u0095\u0098", 56.0], ["\u0097\u0090", 82.0], ["\u008A\u0094", 69.0], ["\u0083\u0088", 52.0], ["\u0081\u0084", 52.0], ["フィヨルドブートキャンプ", 53.0], ["mase", 55.0]]
451