Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby NLP:楽しさと利益のためのNグラム分析

大量のテキストのコレクションが与えられ、そこから何らかの意味を抽出したい場合はどうしますか?

良いスタートは、テキストをn-gramsに分割することです。 。

ここに説明があります

計算言語学と確率の分野では、n-gramは、テキストの特定のシーケンスからのn個のアイテムの連続したシーケンスです。 –ウィキペディア

「こんにちは、お元気ですか?」というフレーズをとると、その場合、ユニグラム(1つの要素のngram)は次のようになります:"Hello", "there", "how", "are", "you" 、およびバイグラム(2つの要素のngram):["Hello", "there"], ["there", "how"], ["how", "are"], ["are", "you"]

あなたが画像でよりよく学ぶならば、ここにその写真があります:

Ruby NLP:楽しさと利益のためのNグラム分析

では、これをRubyで実装する方法を見てみましょう!

サンプルデータのダウンロード

手を汚す前に、いくつかのサンプルデータが必要になります。

作業するものがない場合は、ウィキペディアまたはブログの記事をいくつかダウンロードできます。この特定のケースでは、#rubyfreenodeのチャネルからいくつかのIRCログをダウンロードすることにしました。

ログはここにあります

irclog.whitequark.org/ruby

データ形式に関する注意

分析するリソースのプレーンテキストバージョンが利用できない場合は、Nokogiriを使用してページを解析し、データを抽出できます。

.txtを追加すると、ircログをプレーンテキストで利用できます。 URLの最後にあるので、それを利用します。

このクラスは、データをダウンロードして保存します:

require 'restclient'

class LogParser
  LOG_DIR  = 'irc_logs'

  def initialize(date)
    @date = date
    @log_name = "#{LOG_DIR}/irc-log-#{@date}.txt"
  end

  def download_page(url)
    return log_contents if File.exist? @log_name
    RestClient.get(url).body
  end

  def save_page(page)
    File.open(@log_name, "w+") { |f| f.puts page }
  end

  def log_contents
    File.readlines(@log_name).join
  end

  def get_messages
    page = download_page("https://irclog.whitequark.org/ruby/#{@date}.txt")
    save_page(page)
    page
  end
end

log = LogParser.new("2015-04-15")
msg = log.get_messages

これは非常に単純なクラスです。

RestClientをHTTPクライアントとして使用し、結果をファイルに保存するので、プログラムに変更を加えるときに何度もリクエストする必要がありません。

データの分析

データができたので、分析できます。

これが単純なNgramクラスです。

このクラスでは、ngramを生成するArray#each_consメソッドを使用します。

このメソッドはEnumeratorを返すためです to_aを呼び出す必要があります その上にArrayを取得します 。

class Ngram
  def initialize(input)
    @input = input
  end

  def ngrams(n)
    @input.split.each_cons(n).to_a
  end
end

次に、ループHash#merge!を使用してすべてをまとめます。 &Enumerable#sort_by

このように

# Filter words that appear less times than this
MIN_REPETITIONS = 20

total = {}

# Get the logs for the first 15 days of the month and return the bigrams
(1..15).each do |n|
  day = '%02d' % [n]
  total.merge!(get_trigrams_for_date "2015-04-#{day}") { |k, old, new| old + new }
end

# Sort in descending order
total = total.sort_by { |k, v| -v }.reject { |k, v| v < MIN_REPETITIONS }

total.each { |k, v| puts "#{v} => #{k}" }

注:get_trigrams_for_date メソッドは簡潔にするためにここにはありませんが、githubで見つけることができます。

出力は次のようになります

112 => i want to
83  => link for more
82  => is there a
71  => you want to
66  => i don't know
66  => i have a
65  => i need to

ご覧のとおり、#ruby🙂

では物事をやりたいことが非常に人気があります

結論

今度はあなたの番です!

エディターを開いて、n-gram分析を試してみてください。 n-gramの動作を確認するもう1つの方法は、GoogleNgramViewerです。

自然言語処理(NLP)は魅力的なテーマになる可能性があり、ウィキペディアにはトピックの概要が記載されています。

この投稿の完全なコードは、https://github.com/matugm/ngram-analysis/blob/master/irc_histogram.rb

にあります。
  1. Excel で分析用のデータを入力する方法 (2 つの簡単な方法)

    どのビジネスにおいても、データを分析してビジネスの状態を評価することは非常に緊急です。リスクを特定し、損失を減らすための適切な措置を講じるのに役立ちます。 Excelでは、いくつかの方法を使用して簡単に行うことができます。今日のこの記事では、シャープな方法と鮮やかなイラストを使用して、Excel にデータを入力して分析するための 2 つの簡単な方法を紹介します。 ここから無料の Excel ワークブックをダウンロードして、個別に練習できます。 分析用データを入力する 2 つの方法 エクセル メソッドを調べるために使用するデータセットを紹介しましょう。これは、さまざまな地域での年間売上高と

  2. データ分析のための 5 つの驚くほど実用的なツール

    データは、私たちが想像もできなかった速度と寛大さで継続的に出現しています。データは石油よりも価値があると言われていますが、データがあなたの車を動かせないことはわかっています。それにもかかわらず、機密の財務情報やビジネス情報が含まれているため、データは企業や業界の大御所にとって最大の商品となっています.このデータを構造化された形式で管理および操作するには、データ分析ツールが不可欠です。 データ分析は、アナリストがレコードや構造化された形式でデータを維持するのに役立つ予測モデリング アルゴリズムで動作します。分析は、コスト削減だけでなく、より適切で迅速な意思決定にも重要です。したがって、ここでは