From 24e296e97c32fdf6c3b7fd5ecb5596165d4dad14 Mon Sep 17 00:00:00 2001
From: Patrick Simianer
Date: Sat, 7 Jun 2014 11:44:02 +0200
Subject: better json format, class hierarchy untangled
---
hg.rb | 78 +++++++++++++++++++++++++++----------------------------------------
1 file changed, 31 insertions(+), 47 deletions(-)
(limited to 'hg.rb')
diff --git a/hg.rb b/hg.rb
index f6af75d..43dbf79 100644
--- a/hg.rb
+++ b/hg.rb
@@ -8,17 +8,20 @@ module HG
class HG::Node
- attr_accessor :id, :outgoing, :incoming, :score
+ attr_accessor :id, :symbol, :left, :right, :outgoing, :incoming, :score
- def initialize id=nil, cat=nil, outgoing=[], incoming=[], score=nil
- @id = id
+ def initialize id=nil, symbol='', span=[-1,-1], outgoing=[], incoming=[], score=nil
+ @id = id
+ @symbol = symbol
+ @left = span[0]
+ @right = span[1]
@outgoing = outgoing
@incoming = incoming
- @score = nil
+ @score = score
end
def to_s
- "Node"
+ "Node"
end
end
@@ -41,20 +44,20 @@ class HG::Hypergraph
end
def to_s
- "Hypergraph"
+ "Hypergraph"
end
end
class HG::Hyperedge
attr_accessor :head, :tails, :score, :f, :mark, :rule
- def initialize head=nil, tails=[], score=0.0, f=SparseVector.new, rule=nil
+ def initialize head=Node.new, tails=[], score=0.0, f=SparseVector.new, rule=nil
@head = head
@tails = tails
@score = score
@f = f
@mark = 0
- @rule = (rule ? Grammar::Rule.from_s(rule) : nil)
+ @rule = (rule.class==String ? Grammar::Rule.from_s(rule) : rule)
end
def arity
@@ -66,7 +69,7 @@ class HG::Hyperedge
end
def to_s
- "Hyperedge"
+ "Hyperedge"
end
end
@@ -124,27 +127,6 @@ def HG::viterbi_path hypergraph, root, semiring=ViterbiSemiring.new
return best_path, toposorted.last.score
end
-def HG::viterbi_string hypergraph, root, semiring=ViterbiSemiring.new
- toposorted = topological_sort hypergraph.nodes
- init toposorted, semiring, root
- s = ''
- toposorted.each { |n|
- best_s = nil
- n.incoming.each { |e|
- s = semiring.one
- e.tails.each { |m|
- s = semiring.multiply.call(s, m.score)
- }
- if n.score < semiring.multiply.call(s, e.score) # ViterbiSemiring add
- best_s = e.e
- end
- n.score = semiring.add.call(n.score, semiring.multiply.call(s, e.score))
- }
- s += best_s if best_s
- }
- return s, toposorted.last.score
-end
-
def HG::all_paths hypergraph, root
toposorted = topological_sort hypergraph.nodes
paths = [[]]
@@ -162,6 +144,22 @@ def HG::all_paths hypergraph, root
return paths
end
+def HG::derive path, cur, carry
+ edge = path.select { |e| e.head.symbol==cur.symbol \
+ && e.head.left==cur.left \
+ && e.head.right==cur.right }.first
+ j = 0
+ edge.rule.target.each { |i|
+ if i.class == Grammar::NT
+ derive path, edge.tails[j], carry
+ j += 1
+ else
+ carry << i
+ end
+ }
+ return carry
+end
+
def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=false
nodes = []
edges = []
@@ -169,7 +167,7 @@ def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=fal
h = JSON.parse File.new(fn).read
w = SparseVector.from_h h['weights']
h['nodes'].each { |x|
- n = Node.new x['id']
+ n = Node.new x['id'], x['symbol'], x['span']
nodes << n
nodes_by_id[n.id] = n
}
@@ -181,9 +179,9 @@ def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=fal
x['rule'])
if x['f']
if log_weights
- e.weight = Math.exp(w.dot(e.f))
+ e.score = Math.exp(w.dot(e.f))
else
- e.weight = w.dot(e.f)
+ e.score = w.dot(e.f)
end
end
e.tails.each { |m|
@@ -195,20 +193,6 @@ def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=fal
return Hypergraph.new(nodes, edges), nodes_by_id
end
-def HG::derive path, cur, carry
- edge = path.select { |e| e.rule.lhs.symbol==cur.symbol \
- && e.rule.lhs.left==cur.left \
- && e.rule.lhs.right==cur.right }.first
- edge.rule.target.each { |i|
- if i.class == Grammar::NT
- derive path, i, carry
- else
- carry << i
- end
- }
- return carry
-end
-
end #module
--
cgit v1.2.3