KazuminEngine

プログラマーの日記

普通の日記(進捗)

最近、ブログ書けないのは取り組んでいることが自分にとって難しいので、進捗がない。

グノシーとnewspicksとかの内容が同じような記事を教えてくれるプログラム書いてる。

人工知能クラスタとか使うのかな。わかんない。(pydata行きたい)

とりあえず、書く。

いろんな人に助けてもらいながらも、少しずつ進捗がある。

感謝!

以下のコードは、グノシーの目次のキーワードの名刺を木の中に入れるプログラム。

タイトル一つに一つのurl。

なので、初めは木のラベル名をurlにしようとしたが、後々めんどいので断念。

で、oneとかtwoとかにしてる。

コード汚いし、アーキテクチャーってなんだろう。

Rubyで書いてる。

privateとかpublic、do endのスコープとかに悩まされてる。

require 'pp'
require 'open-uri'
require 'nokogiri'
require 'natto'

url = 'https://gunosy.com/categories/7'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)



# 二分探索木
class Tree
  # 節の定義
  class Node
    def initialize(key, data)
      @key = key
      @data = data
      @left = nil
      @right = nil
    end
    attr_accessor :key, :data, :left, :right
  end

  def initialize
    @root = nil
  end

  # 操作関数
  private

  # 探索
  def search(node, key)
    while node
      if key == node.key
        return node
      elsif key < node.key
        node = node.left
      else
        node = node.right
      end
    end
  end

  # 挿入
  def insert!(node, key, data)
    if node == nil
      return Node.new(key, data)
    elsif key == node.key
      node.data = data
    elsif key < node.key
      node.left = insert!(node.left, key, data)
    else
      node.right = insert!(node.right, key, data)
    end
    node
  end

  # 最小値を探す
  def search_min(node)
    node = node.left while node.left
    node
  end

  # 最大値を探す
  def search_max(node)
    node = node.right while node.right
    node
  end

  # 最小値を削除する
  def delete_min!(node)
    return node.right unless node.left
    node.left = delete_min!(node.left)
    node
  end

  # 削除
  def delete!(node, key)
    data = nil
    if node
      if key == node.key
        data = node.data
        if node.left == nil
          return node.right, data
        elsif node.right == nil
          return node.left, data
        else
          min_node = search_min(node.right)
          node.key = min_node.key
          node.data = min_node.data
          node.right = delete_min!(node.right)
        end
      elsif key < node.key
        node.left, data = delete!(node.left, key)
      else
        node.right, data = delete!(node.right, key)
      end
    end
    return node, data
  end

  # 巡回
  def traverse(node, &func)
    if node
      traverse(node.left, &func)
      func.call(node.key, node.data)
      traverse(node.right, &func)
    end
  end

  # 公開メソッド
  public

  # 探索
  def [](key)
    node = search(@root, key)
    if node
      node.data
    end
  end

  # 挿入 (更新)
  def []=(key, value)
    @root = insert!(@root, key, value)
    value
  end

  # 削除
  def delete_key(key)
    @root, data = delete!(@root, key)
    data
  end

  # 最小値を求める
  def min
    if @root
      node = search_min(@root)
      if node
        return node.key, node.data
      end
    end
  end

  # 最大値を求める
  def max
    if @root
      node = search_max(@root)
      if node
        return node.key, node.data
      end
    end
  end

  # 巡回
  def each(&func)
    traverse(@root, &func)
  end

  def inspect
    sprintf("#", self.object_id)
  end
end

array = []
natto = Natto::MeCab.new
keywords = %w( @zero @one @two @three @four @five @six @seven @eight @nine @ten @eleven @tweleve @thirteen @fourteen @fifteen @sixteen @seventeen @eighteen @nineteen )

doc.xpath('html/body/div/div/div/div/ul/li/div/dl/dt/a').each do |node|
#  text = "@" + node[:href].split("/")[-1]
  natto.parse(node.text) do |n|
    if n.feature.split(',')[0] == "名詞"
      array.push "#{n.surface}"
      #print "#{n.surface}"
    end
  end

  #部分木insert
  20.times do |i|
    eval("#{keywords[i]} = Tree.new")
    (array.length-1).times do |x|
      eval("#{keywords[i]}[array[x]] = x")
      #a[array[x]] = x
    end
  end

  #部分木出力
  instance_variable_get(keywords[0]).each do |k, v|
    print k, " ", v
  end
  array = []
  puts
end

以上、かずみんでした。