package ruc.irm.ui;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import ruc.irm.similarity.sentence.editdistance.CharEditUnit;
import ruc.irm.similarity.sentence.editdistance.EditDistance;
import ruc.irm.similarity.sentence.editdistance.GregorEditDistance;
import ruc.irm.similarity.sentence.editdistance.StandardEditDistance;
import ruc.irm.similarity.sentence.editdistance.SuperString;
import ruc.irm.similarity.sentence.editdistance.XiatianEditDistance;
import ruc.irm.similarity.sentence.morphology.MorphoSimilarity;
public class SentenceSimilarityUI {
/**
* 句子相似度的演示面板
* @return
*/
public static JPanel createPanel(){
//声明总的大面板, fullPanel包括一个NorthPanel和一个centerPanel
JPanel fullPanel = new JPanel();
fullPanel.setLayout(new BorderLayout());
JPanel northPanel = new JPanel();
fullPanel.add(northPanel, "North");
//centerPanel包括了一个文本框
JPanel centerPanel = new JPanel();
fullPanel.add(centerPanel, "Center");
centerPanel.setLayout(new BorderLayout());
final JTextArea result = new JTextArea();
//result.setFont(new Font("宋体", Font.PLAIN, 16));
result.setLineWrap(true);
JScrollPane centerScrollPane = new JScrollPane(result);
centerPanel.add(centerScrollPane, "Center");
northPanel.setLayout(new GridLayout(1, 1));
//以下加入northPanel中的第一个面板
// final JTextField senField1 = new JTextField("什么是计算机病毒");
// final JTextField senField2 = new JTextField("电脑病毒是什么");
final JTextField senField1 = new JTextField("什么是计算机病毒");
final JTextField senField2 = new JTextField("电脑病毒会传染给人吗?");
senField1.setColumns(50);
senField2.setColumns(50);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(4, 1));
JPanel linePanel = new JPanel();
linePanel.add(new JLabel("交换代价:"));
final JTextField swapField = new JTextField("0.5");
swapField.setColumns(20);
linePanel.add(swapField);
JButton button = new JButton("设置");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
double cost = Double.parseDouble(swapField.getText());
XiatianEditDistance.swapCost = cost;
GregorEditDistance.swapCost = cost;
}
});
linePanel.add(button);
mainPanel.add(linePanel);
linePanel = new JPanel();
linePanel.add(new JLabel("句子1:"));
linePanel.add(senField1);
mainPanel.add(linePanel);
linePanel = new JPanel();
linePanel.add(new JLabel("句子2:"));
linePanel.add(senField2);
mainPanel.add(linePanel);
linePanel = new JPanel();
JButton goButton = new JButton("计算句子相似度");
linePanel.add(goButton);
mainPanel.add(linePanel);
goButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String sentence1 = senField1.getText();
String sentence2 = senField2.getText();
long time = 0;
String text = "[" + sentence1 + "]与[" + sentence2 + "]的编辑距离为:" ;
MorphoSimilarity similarity = MorphoSimilarity.getInstance();
text = text + "\n词形和词序结合法结果:";
text = text + "\n" + similarity.getSimilarity(sentence1, sentence2);
System.out.println(text);
EditDistance ed = new StandardEditDistance();
text = text + "\n标准编辑距离算法结果:";
time = System.currentTimeMillis();
text = text + "\n词语处理:" + ed.getSimilarity(sentence1, sentence2);
text = text + "(时间:" + time + ")";
System.out.println(text);
ed = new GregorEditDistance();
text = text + "\nGregor编辑距离算法结果:";
time = System.currentTimeMillis();
text = text + "\n词语处理:" + ed.getSimilarity(sentence1, sentence2);
text = text + "(时间:" + time + ")";
System.out.println(text);
ed = new XiatianEditDistance();
text = text + "\n夏氏编辑距离算法结果:";
time = System.currentTimeMillis();
text = text + "\n词语处理:" + ed.getSimilarity(sentence1, sentence2);
text = text + "(时间:" + time + ")";
System.out.println(text);
// EditDistance ed = new StandardEditDistance();
// text = text + "\n标准编辑距离算法结果:";
// time = System.currentTimeMillis();
// text = text + "\n字符串处理:" + ed.getEditDistance(SuperString.createCharSuperString(sentence1), SuperString.createCharSuperString(sentence2));
// time = System.currentTimeMillis() - time;
// text = text + "(时间:" + time + ")";
// time = System.currentTimeMillis();
// text = text + "\n词语处理:" + ed.getEditDistance(SuperString.createWordSuperString(sentence1), SuperString.createWordSuperString(sentence2));
// text = text + "(时间:" + time + ")";
//
// ed = new GregorEditDistance();
// text = text + "\nGregor编辑距离算法结果:";
// time = System.currentTimeMillis();
// text = text + "\n字符串处理:" + ed.getEditDistance(SuperString.createCharSuperString(sentence1), SuperString.createCharSuperString(sentence2));
// time = System.currentTimeMillis() - time;
// text = text + "(时间:" + time + ")";
// time = System.currentTimeMillis();
// text = text + "\n词语处理:" + ed.getEditDistance(SuperString.createWordSuperString(sentence1), SuperString.createWordSuperString(sentence2));
// text = text + "(时间:" + time + ")";
//
// ed = new XiatianEditDistance();
// text = text + "\n夏氏编辑距离算法结果:";
// time = System.currentTimeMillis();
// text = text + "\n字符串处理:" + ed.getEditDistance(SuperString.createCharSuperString(sentence1), SuperString.createCharSuperString(sentence2));
// time = System.currentTimeMillis() - time;
// text = text + "(时间:" + time + ")";
// time = System.currentTimeMillis();
// text = text + "\n词语处理:" + ed.getEditDistance(SuperString.createWordSuperString(sentence1), SuperString.createWordSuperString(sentence2));
// text = text + "(时间:" + time + ")";
//
// ed = new XiatianEditDistance2();
// text = text + "\n夏氏编辑距离算法结果2:";
// time = System.currentTimeMillis();
// text = text + "\n字符串处理:" + ed.getEditDistance(SuperString.createCharSuperString(sentence1), SuperString.createCharSuperString(sentence2));
// time = System.currentTimeMillis() - time;
// text = text + "(时间:" + time + ")";
// time = System.currentTimeMillis();
// text = text + "\n词语处理:" + ed.getEditDistance(SuperString.createWordSuperString(sentence1), SuperString.createWordSuperString(sentence2));
// text = text + "(时间:" + time + ")";
text = text + "\n________________________________\n" + result.getText();
result.setText(text);
}
});
mainPanel.setBorder(BorderFactory.createEtchedBorder());
northPanel.add(mainPanel);
return fullPanel;
}
public static void main(String[] args) {
EditDistance ed1 = new StandardEditDistance();
EditDistance ed2 = new GregorEditDistance();
EditDistance ed3 = new XiatianEditDistance();
SuperString<CharEditUnit> s1 = SuperString.createCharSuperString("abcdefghijkl");
SuperString<CharEditUnit> s2 = SuperString.createCharSuperString("qwerabcjkls1");
long time = new Date().getTime();
for(int i=0; i<100; i++){
ed1.getEditDistance(s1, s2);
}
System.out.println((new Date().getTime()-time));
time = new Date().getTime();
for(int i=0; i<100; i++){
ed2.getEditDistance(s1, s2);
}
System.out.println((new Date().getTime()-time));
time = new Date().getTime();
for(int i=0; i<100; i++){
ed3.getEditDistance(s1, s2);
}
System.out.println((new Date().getTime()-time));
}
}