Ich habe einige URLs in Ruby entfernt und Themen mit LDA in Python extrahiert.
gem install
$ bundle init
$ vim Gemfile
gem 'mechanize'
$ bundle install
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
$ brew search mecab
mecab mecab-ipadic
$ brew install mecab mecab-ipadic
$ mecab
OK, wenn das Mecab startet
Natto ist ein Juwel, das Mecab auf Ihrem System installiert.
gem install
$ bundle init
$ vim Gemfile
gem 'natto'
$ bundle install
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
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
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
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
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
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
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
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
#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)