[PYTHON] Arbeitsprotokoll beim Schaben und Anwenden von LDA

Überblick

Ich habe einige URLs in Ruby entfernt und Themen mit LDA in Python extrahiert.

  1. Schaben
  2. Morphologische Analyse
  3. Originalwörterbuch
  4. Datenformung
  5. LDA-Ausführung

1. Schaben

Verwendung von Mechanize

gem install

$ bundle init
$ vim Gemfile
gem 'mechanize'
$ bundle install

Verwendung von mechanisieren

Es ist in Ordnung, wenn es mit der folgenden Beispieldatei funktioniert.

sample.rb


require 'mechanize'

agent = Mechanize.new
search_page = agent.get('Passende URL')

search_page.search('body p').each do |y|
  p y.text
end

2. Morphologische Analyse

Installieren Sie Mecab auf einem Mac

$ brew search mecab
mecab mecab-ipadic

$ brew install mecab mecab-ipadic
$ mecab

OK, wenn das Mecab startet

Verwendung von Natto

Natto ist ein Juwel, das Mecab auf Ihrem System installiert.

gem install

$ bundle init
$ vim Gemfile
gem 'natto'
$ bundle install

Angabe von MECAB_PATH

Um natto verwenden zu können, müssen Sie eine Umgebungsvariable namens MECAB_PATH angeben.

$ find /usr/ -name "*mecab*" | grep dylib 
$ export MECAB_PATH=/usr//local/Cellar/mecab/0.996/lib/libmecab.dylib

http://yatta47.hateblo.jp/entry/2015/12/13/150525 https://github.com/buruzaemon/natto

Verwendung von Mecab

Es ist in Ordnung, wenn es mit der folgenden Beispieldatei funktioniert.

sample.rb


require 'natto'
text = 'Von den Oberschenkeln und Oberschenkeln'
nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}\t#{n.feature}"
end

http://qiita.com/shizuma/items/d04facaa732f606f00ff http://d.hatena.ne.jp/otn/20090509

3. Originalwörterbuch

Es sollte ursprünglich gemacht werden, aber diesmal weggelassen.

Diesmal schließen wir jedoch Nomenklatur, allgemeine Synonyme und Nichtunabhängigkeit aus.

cond1 = features.include?('Substantiv')
cond2 = features.include?('Allgemeines')
cond3 = !features.include?('Gleichbedeutend')
cond4 = !features.include?('Nicht unabhängig')
if cond1 && cond2 && cond3 && cond4
  #Erforderliche Verarbeitung
end

4. Quellcode vom Scraping bis zur Datenformatierung

Zweck

Der Datenaustausch zwischen Python und Ruby erfolgt mit json. Bereiten Sie insbesondere eine CSV vor, die die URL der Zielseite wie unten gezeigt zusammenfasst, und führen Sie von dort aus ein Scraping durch, um sie in die für LDA erforderliche Datenstruktur zu konvertieren.

url
URL1
URL2
...
URLN

Schließlich wird das folgende Array mit Wörtern, die für jedes Dokument angeordnet sind, generiert und als json ausgegeben.

[
  ['human', 'interface', 'computer'],
  ['survey', 'user', 'computer', 'system', 'response', 'time'],
  ['eps', 'user', 'interface', 'system'],
  ['system', 'human', 'system', 'eps'],
  ['user', 'response', 'time'],
  ['trees'],
  ['graph', 'trees'],
  ['graph', 'minors', 'trees'],
  ['graph', 'minors', 'survey']
]

http://tohka383.hatenablog.jp/entry/20111205/1323071336 http://peaceandhilightandpython.hatenablog.com/entry/2013/12/06/082106

Tatsächlicher Quellcode

gem 'mechanize'
gem 'natto'
#Eine Klasse, die aus csv ein Array von URLs generiert
class UrlGetService
  require 'csv'

  def initialize(csv_path)
    @csv_path = csv_path
  end

  def web_urls
    @web_urls ||= -> do
      rows = []
      csv_file.each_with_index do |row, index|
        unless index == 0
          rows << row[0]
        end
      end
      rows
    end.call
  end

  private

    attr_reader :csv_path

    def csv_file
      @csv_file ||= -> do
        csv_text = File.read(csv_path)
        CSV.parse(csv_text)
      end.call
    end
end

#Eine Klasse, die eine bestimmte URL kratzt
class WebScrapingService
  require 'mechanize'

  def initialize(url)
    @url = url
  end

  def texts
    @texts ||= -> do
      texts = ''
      page_contents.each do |content|
        texts += content.text
      end
      texts
    end.call
  end

  private

    attr_reader :url

    def page_contents
      @page_contents ||= scraping_agent.get(url).search('body p')
    end

    def scraping_agent
      @scraping_agent ||= Mechanize.new
    end
end

#Eine Klasse, die das Scraping-Ergebnis morphologisch analysiert und eine Wortfolge erstellt
class MorphologicalAnalysisService
  require 'natto'
  `export MECAB_PATH=/usr//local/Cellar/mecab/0.996/lib/libmecab.dylib`

  def initialize(texts)
    @texts = texts
  end

  def words
    words = []
    morphological_analysis_agent.parse(texts) do |word|
      features = word.feature.split(/,/)
      cond1 = features.include?('Substantiv')
      cond2 = features.include?('Allgemeines')
      cond3 = !features.include?('Gleichbedeutend')
      cond4 = !features.include?('Nicht unabhängig')
      if cond1 && cond2 && cond3 && cond4
        words << word.surface
      end
    end
    words
  end

  private

    attr_reader :texts

    def morphological_analysis_agent
      @morphological_analysis_agent ||= Natto::MeCab.new
    end
end

#Klasse, die JSON mit 3 Klassen ausgibt
class DictionaryOutputService
  require 'json'

  def initialize(csv_path)
    @csv_path = csv_path
  end

  def output_json
    open('sample.json', 'w') do |f|
      JSON.dump(words_array, f)
    end
  end

  private

    attr_reader :csv_path

    def words_array
      @words_array ||= -> do
        web_urls.each_with_object([]) do |url, arr|
          texts = WebScrapingService.new(url).texts
          words = MorphologicalAnalysisService.new(texts).words
          white_lists =  words.inject(Hash.new(0)) { |h, a| h[a] += 1; h }.select { |_, c| c > 1 }.map { |w, _| w }
          arr << words.select { |w| white_lists.include?(w) }
        end
      end.call
    end

    def web_urls
      UrlGetService.new(csv_path).web_urls
    end
end

#Führen Sie wie folgt aus
csv_path = "YOUR_CSV_PATH/file_name.csv"
DictionaryOutputService.new(csv_path).output_json

5. LDA-Ausführung

Versionsverwaltung von pyenv

Verwenden Sie anstelle der aktuellen Systempython die installierte und versionierte Python.

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

~/.bashrc


export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

Wenn es sich um eine 3.5-Serie handelt, können Sie durch die Installation von gensim nicht fallen.

sourve ~/.bashrc
pyenv install 3.5.0
pyenv shell 3.5.0

http://qiita.com/Kodaira_/items/feadfef9add468e3a85b

gensim Installation

Verwenden Sie ein Modul namens gensim, um LDA mit Python durchzuführen. Setup-Tools für die Installation von Gensim erforderlich

sudo easy_install -U setuptools

Installieren Sie gensim. Aktualisieren Sie auch abhängige Tools wie numpy.

sudo -H pip install gensim -U

Quellcode

lda.py


from gensim import models, corpora

if __name__ == '__main__':
    #Ursprünglich liest dieser Text JSON-Dateien usw.
    texts = [['human', 'interface', 'computer'],
             ['survey', 'user', 'computer', 'system', 'response', 'time'],
             ['eps', 'user', 'interface', 'system'],
             ['system', 'human', 'system', 'eps'],
             ['user', 'response', 'time'],
             ['trees'],
             ['graph', 'trees'],
             ['graph', 'minors', 'trees'],
             ['graph', 'minors', 'survey']]

    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]

    lda = models.ldamodel.LdaModel(corpus=corpus, num_topics=20, id2word=dictionary)

    # Topics
    for topic in lda.show_topics(-1):
        print('topic')
        print(topic)

    # Topic of each document
    for topics_per_document in lda[corpus]:
            print('topic of ecah document')
            print(topics_per_document)

https://radimrehurek.com/gensim/tut1.html#corpus-formats https://openbook4.me/projects/193/sections/1154 http://sucrose.hatenablog.com/entry/2013/10/29/001041

Referenz: Führen Sie LDA auf R aus

#Erforderliches Paket Armee
install.packages("lda")
install.packages("ggplot2")
install.packages("reshape2")

#Kostenlose Daten
data(cora.documents)
data(cora.vocab)

##Anzahl der Themen
K <- 10

#Funktionsausführung
result <- lda.collapsed.gibbs.sampler(cora.documents,
                                      K, #Anzahl der Themen
                                      cora.vocab,
                                      25, #Anzahl der Probenahmen
                                      0.1, #Hyperparameter α
                                      0.1, #Hyperparameter β
                                      compute.log.likelihood=TRUE) 


#Top 5 häufige Wörter nach Thema
top.words <- top.topic.words(result$topics, 5, by.score=TRUE)

Recommended Posts

Arbeitsprotokoll beim Schaben und Anwenden von LDA
Die Installation von Zsh und Prezto wird auf dem Mac protokolliert
Wenn send_keys nicht funktioniert
Wenn dropbox-sdk-python nicht funktioniert