많은 양의 텍스트가 주어지고 그로부터 의미를 추출하고 싶다면 어떻게 하시겠습니까?
좋은 시작은 텍스트를 n-gram으로 나누는 것입니다. .
설명입니다 :
<블록 인용>계산 언어학 및 확률 분야에서 n-gram은 주어진 텍스트 시퀀스에서 n개 항목의 연속 시퀀스입니다. – 위키피디아
예를 들어 :
"안녕하세요, 안녕하십니까?" 유니그램(한 요소의 ngram)은 "Hello", "there", "how", "are", "you"
가 됩니다. 및 bigrams(두 요소의 ngrams):["Hello", "there"], ["there", "how"], ["how", "are"], ["are", "you"]
.
이미지로 더 잘 배우면 다음과 같은 사진이 있습니다.
이제 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
에서 찾을 수 있습니다.