package ruc.irm.similarity.sentence;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
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 org.ansj.domain.Term;
import org.ansj.recognition.NatureRecognition;
import org.ansj.splitWord.analysis.ToAnalysis;
/**
* 对词法分析程序的封装代理,目前内部封装了对Ictclas4j(夏天改进版)的调用<br/>
* 为方便演示程序快速启动,对Segment的调用采用了单例模式,实现需要时的延迟加载。
*
* @CHANGE 2014/04/04 采用Ansj词法分析器取代Ictclas4j-summer version
*
* @author <a href="mailto:iamxiatian@gmail.com">夏天</a>
* @organization 中国人民大学信息资源管理学院 知识工程实验室
*/
public class SegmentProxy {
public static class Word {
/**
* 词语内容
*/
private String word;
/**
* 词语词性代号
*/
private String pos;
public Word(String word, String pos) {
this.word = word;
this.pos = pos;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getPos() {
return pos;
}
public void setPos(String pos) {
this.pos = pos;
}
}
public static List<Word> segment(String sentence) {
List<Word> results = new ArrayList<Word>();
List<Term> terms = ToAnalysis.parse(sentence);
new NatureRecognition(terms).recognition();
for (Term term : terms) {
results.add(new Word(term.getName(), term.getNatrue().natureStr));
}
return results;
}
public static String getSegmentedString(String sentence) {
List<Word> words = segment(sentence);
StringBuilder sb = new StringBuilder();
for (Word word : words) {
sb.append(word.getWord() + "/" + word.getPos()).append(" ");
}
return sb.toString();
}
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 senField = new JTextField("什么是计算机病毒");
senField.setColumns(50);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(2, 1));
JPanel linePanel = new JPanel();
linePanel.add(new JLabel("句子:"));
linePanel.add(senField);
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 sentence = senField.getText();
String text = "[" + sentence + "]的词法分析结果为:";
text = text + "\n" + getSegmentedString(sentence);
text = text + "\n________________________________\n" + result.getText();
result.setText(text);
}
});
mainPanel.setBorder(BorderFactory.createEtchedBorder());
northPanel.add(mainPanel);
return fullPanel;
}
}