Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby NLP:재미와 이익을 위한 N-gram 분석

많은 양의 텍스트가 주어지고 그로부터 의미를 추출하고 싶다면 어떻게 하시겠습니까?

좋은 시작은 텍스트를 n-gram으로 나누는 것입니다. .

설명입니다 :

<블록 인용>

계산 언어학 및 확률 분야에서 n-gram은 주어진 텍스트 시퀀스에서 n개 항목의 연속 시퀀스입니다. – 위키피디아

예를 들어 :

"안녕하세요, 안녕하십니까?" 유니그램(한 요소의 ngram)은 "Hello", "there", "how", "are", "you"가 됩니다. 및 bigrams(두 요소의 ngrams):["Hello", "there"], ["there", "how"], ["how", "are"], ["are", "you"] .

이미지로 더 잘 배우면 다음과 같은 사진이 있습니다.

Ruby NLP:재미와 이익을 위한 N-gram 분석

이제 Ruby에서 이것을 구현하는 방법을 살펴보겠습니다!

샘플 데이터 다운로드

손을 더럽히기 전에 샘플 데이터가 필요합니다.

함께 일할 사람이 없다면 몇 가지 Wikipedia나 블로그 기사를 다운로드할 수 있습니다. 이 특별한 경우 #ruby freenode의 채널에서 일부 IRC 로그를 다운로드하기로 결정했습니다.

로그는 여기에서 찾을 수 있습니다. :

irclog.whitequark.org/ruby

데이터 형식에 대한 참고사항 :

분석하려는 리소스의 일반 텍스트 버전을 사용할 수 없는 경우 Nokogiri를 사용하여 페이지를 구문 분석하고 데이터를 추출할 수 있습니다.

irc 로그는 .txt를 추가하여 일반 텍스트로 사용할 수 있습니다. 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-그램 분석을 가지고 놀기 시작합니다. 작동 중인 n-gram을 보는 또 다른 방법은 Google Ngram 뷰어입니다.

<블록 인용>

자연어 처리(NLP)는 매혹적인 주제가 될 수 있습니다. Wikipedia는 주제에 대한 좋은 개요를 제공합니다.

이 게시물의 전체 코드는 https://github.com/matugm/ngram-analysis/blob/master/irc_histogram.rb

에서 찾을 수 있습니다.