forked from hankcs/HanLP
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraph.java
More file actions
142 lines (125 loc) · 3.34 KB
/
Graph.java
File metadata and controls
142 lines (125 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* <summary></summary>
* <author>He Han</author>
* <email>hankcs.cn@gmail.com</email>
* <create-date>2014/05/2014/5/21 18:05</create-date>
*
* <copyright file="Graph.java" company="上海林原信息科技有限公司">
* Copyright (c) 2003-2014, 上海林原信息科技有限公司. All Right Reserved, http://www.linrunsoft.com/
* This source is subject to the LinrunSpace License. Please contact 上海林原信息科技有限公司 to get more information.
* </copyright>
*/
package com.hankcs.hanlp.seg.common;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* @author hankcs
*/
public class Graph
{
/**
* 顶点
*/
public Vertex[] vertexes;
/**
* 边,到达下标i
*/
public List<EdgeFrom>[] edgesTo;
/**
* 将一个词网转为词图
* @param vertexes 顶点数组
*/
public Graph(Vertex[] vertexes)
{
int size = vertexes.length;
this.vertexes = vertexes;
edgesTo = new List[size];
for (int i = 0; i < size; ++i)
{
edgesTo[i] = new LinkedList<EdgeFrom>();
}
}
/**
* 连接两个节点
* @param from 起点
* @param to 终点
* @param weight 花费
*/
public void connect(int from, int to, double weight)
{
edgesTo[to].add(new EdgeFrom(from, weight, vertexes[from].word + '@' + vertexes[to].word));
}
/**
* 获取到达顶点to的边列表
* @param to 到达顶点to
* @return 到达顶点to的边列表
*/
public List<EdgeFrom> getEdgeListTo(int to)
{
return edgesTo[to];
}
@Override
public String toString()
{
return "Graph{" +
"vertexes=" + Arrays.toString(vertexes) +
", edgesTo=" + Arrays.toString(edgesTo) +
'}';
}
public String printByTo()
{
StringBuffer sb = new StringBuffer();
sb.append("========按终点打印========\n");
for (int to = 0; to < edgesTo.length; ++to)
{
List<EdgeFrom> edgeFromList = edgesTo[to];
for (EdgeFrom edgeFrom : edgeFromList)
{
sb.append(String.format("to:%3d, from:%3d, weight:%05.2f, word:%s\n", to, edgeFrom.from, edgeFrom.weight, edgeFrom.name));
}
}
return sb.toString();
}
/**
* 根据节点下标数组解释出对应的路径
* @param path
* @return
*/
public List<Vertex> parsePath(int[] path)
{
List<Vertex> vertexList = new LinkedList<Vertex>();
for (int i : path)
{
vertexList.add(vertexes[i]);
}
return vertexList;
}
/**
* 从一个路径中转换出空格隔开的结果
* @param path
* @return
*/
public static String parseResult(List<Vertex> path)
{
if (path.size() < 2)
{
throw new RuntimeException("路径节点数小于2:" + path);
}
StringBuffer sb = new StringBuffer();
for (int i = 1; i < path.size() - 1; ++i)
{
Vertex v = path.get(i);
sb.append(v.getRealWord() + " ");
}
return sb.toString();
}
public Vertex[] getVertexes()
{
return vertexes;
}
public List<EdgeFrom>[] getEdgesTo()
{
return edgesTo;
}
}