package paper.pattern;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.ictclas4j.segment.Segment;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
public class PaperPatternUI {
private JFrame frame;
private JTextField paperLocation;
private JButton choosePaperLocation;
private JTextArea text;
private JScrollPane textSP;
private JCheckBox[] boxes;
private JTextArea docList;
private JScrollPane docListSP;
private JFileChooser paperFc;
private Segment seg;
private ArrayList<String> locationPattern1;
private ArrayList<String> locationPattern2;
private ArrayList<String> salaryPattern;
private ArrayList<String> overtimePattern;
private ArrayList<String> enviornmentPattern1;
private ArrayList<String> enviornmentPattern2;
private OntModel model;
private String prefix;
public PaperPatternUI() {
// ��ʼ������
initFrame();
// ��ʼ����ʾ����
initContentPane();
// ��ʼ����ť
initActions();
// ��ʼ���ļ�ѡ����
initFc();
initOntology();
initPatterns();
seg = new Segment(1);
frame.setVisible(true);
}
private void initOntology() {
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
try {
model.read(new FileInputStream(new File("work.owl")), null);
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(frame, "�����ر���⣬��ȷ��qa.owl������ڵ�ǰĿ¼�¡�",
"Error!", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
System.exit(0);
}
prefix = "http://www.work.com/work.owl#";
}
private void initPatterns() {
locationPattern1 = new ArrayList<String>();
locationPattern1.add("ns");
locationPattern1.add("����");
locationPattern1.add("ns");
locationPattern1.add("���");
locationPattern2 = new ArrayList<String>();
locationPattern2.add("���");
locationPattern2.add("����");
locationPattern2.add("ns");
salaryPattern = new ArrayList<String>();
salaryPattern.add("�");
salaryPattern.add("���ݴ�");
overtimePattern = new ArrayList<String>();
overtimePattern.add("����");
overtimePattern.add("����");
overtimePattern.add("����");
enviornmentPattern1 = new ArrayList<String>();
enviornmentPattern1.add("����");
enviornmentPattern1.add("���ݴ�");
enviornmentPattern2 = new ArrayList<String>();
enviornmentPattern2.add("����");
enviornmentPattern2.add("����");
enviornmentPattern2.add("����");
}
// ��ʼ������
private void initFrame() {
frame = new JFrame("PaperPattern");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation((int) (width - frame.getWidth()) / 2,
(int) (height - frame.getHeight()) / 2);
frame.setResizable(false);
}
private boolean match(Sentence sentence, ArrayList<String> pattern)
throws Exception {
int predicateIndex = -1;
for (int i = 0; i < pattern.size(); i++) {
if (pattern.get(i).equals("����") || pattern.get(i).equals("���ݴ�")) {
predicateIndex = i;
break;
}
}
OntProperty predicate = model.getOntProperty(prefix
+ pattern.get(predicateIndex));
ExtendedIterator<? extends OntProperty> subPredicates = predicate
.listSubProperties();
boolean match = false;
while (subPredicates.hasNext()) {
String subPredicate = subPredicates.next().getLocalName();
int predicateTokenIndex = -1;
for (int i = 0; i < sentence.getTokens().size(); i++) {
if (sentence.getTokens().get(i).getText().equals(subPredicate)) {
predicateTokenIndex = i;
break;
}
}
if (predicateTokenIndex >= 0) {
HashSet<String> ns = new HashSet<String>();
boolean preMatch = match(0, predicateTokenIndex, sentence, 0,
predicateIndex, pattern, ns);
boolean postMatch = match(predicateTokenIndex + 1, sentence
.getTokens().size() - 1, sentence, predicateIndex + 1,
pattern.size() - 1, pattern, ns);
if (preMatch && postMatch) {
match = true;
break;
}
}
}
return match;
}
private boolean match(int start, int end, Sentence sentence,
int patternStart, int patternEnd, ArrayList<String> pattern,
HashSet<String> ns) {
if (patternStart >= patternEnd) {
return true;
}
int newStart = -1;
out: for (int i = start; i < end; i++) {
if (sentence.getTokens().get(i).getPOS().equals(
pattern.get(patternStart))) {
boolean notAlreadyExist = ns.add(sentence.getTokens().get(i)
.getText());
if (notAlreadyExist) {
newStart = i + 1;
}
break;
} else {
OntClass nounClass = model.getOntClass(prefix
+ pattern.get(patternStart));
if (nounClass != null) {
if (sentence.getTokens().get(i).getText().equals(
nounClass.getLocalName())) {
newStart = i + 1;
break out;
}
ExtendedIterator<? extends OntResource> instances = nounClass
.listInstances();
while (instances.hasNext()) {
String nounInstance = instances.next().getLocalName();
if (sentence.getTokens().get(i).getText().equals(
nounInstance)) {
newStart = i + 1;
break out;
}
}
}
}
}
if (newStart >= 0 && newStart <= end) {
return match(newStart, end, sentence, patternStart + 1, patternEnd,
pattern, ns);
} else {
return false;
}
}
// ��ʼ����ť
private void initActions() {
choosePaperLocation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int returnVal = paperFc.showOpenDialog(frame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
String company = "";
if (paperFc.getSelectedFile().getName().equals("��Զ��˾.txt")
|| paperFc.getSelectedFile().getName().equals(
"Զ��˾.txt")) {
company = "���ʹ�˾";
} else if (paperFc.getSelectedFile().getName().equals(
"���﹫˾.txt")
|| paperFc.getSelectedFile().getName().equals(
"���չ�˾.txt")) {
company = "���ʹ�˾";
}
if (company.equals("")) {
JOptionPane.showMessageDialog(frame, "��˾���ƴ���",
"Error!", JOptionPane.ERROR_MESSAGE);
return;
}
String location = paperFc.getSelectedFile()
.getAbsolutePath();
paperLocation.setText(location);
text.setText("");
docList.setText("");
String lines = "";
try {
BufferedReader fr = new BufferedReader(new FileReader(
new File(location)));
String line = null;
while (true) {
line = fr.readLine();
if (line == null) {
break;
}
lines += line;
}
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(frame, ex.getMessage(),
"Error!", JOptionPane.ERROR_MESSAGE);
}
text.setText(seg.split(lines).getFinalResult());
ArrayList<Sentence> sentences = Sentence
.parseSentences(text.getText());
HashMap<String, String> score = new HashMap<String, String>();
try {
if (company.equals("���ʹ�˾")) {
score.put(boxes[0].getText(), "0");
score.put(boxes[1].getText(), "0");
for (int i = 0; i < sentences.size(); i++) {
Sentence sentence = sentences.get(i);
if (match(sentence, locationPattern1)
|| match(sentence, locationPattern2)) {
score.put(boxes[0].getText(), "70");
boxes[0].setSelected(true);
}
if (match(sentence, salaryPattern)) {
score.put(boxes[1].getText(), "30");
boxes[1].setSelected(true);
}
}
} else if (company.equals("���ʹ�˾")) {
score.put(boxes[2].getText(), "0");
score.put(boxes[3].getText(), "0");
for (int i = 0; i < sentences.size(); i++) {
Sentence sentence = sentences.get(i);
if (match(sentence, overtimePattern)) {
score.put(boxes[2].getText(), "50");
boxes[2].setSelected(true);
}
if (match(sentence, enviornmentPattern1)
|| match(sentence, enviornmentPattern2)) {
score.put(boxes[3].getText(), "50");
boxes[3].setSelected(true);
}
}
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame,
"������鿴error.log�ļ���", "Error!",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
return;
}
docList.setText("");
Iterator<String> scoreIt = score.keySet().iterator();
int totalScore = 0;
while (scoreIt.hasNext()) {
String key = scoreIt.next();
String value = score.get(key);
totalScore += Integer.parseInt(value);
docList.append(key + "\t" + "�÷�" + "\t" + value + "\n");
}
docList
.append("------------------------------------------------------------\n");
docList.append("�����Ļش�" + "\t" + "�÷�" + "\t" + totalScore
+ "\n");
}
}
});
}
// ��ʼ����ʾ����
private void initContentPane() {
JPanel north = new JPanel();
paperLocation = new JTextField(25);
paperLocation.setEditable(false);
choosePaperLocation = new JButton("ѡ����...");
north.add(new JLabel("����ַ��"));
north.add(paperLocation);
north.add(choosePaperLocation);
JPanel center = new JPanel();
text = new JTextArea(7, 40);
text.setEditable(false);
textSP = new JScrollPane(text);
center.add(textSP);
JPanel n = new JPanel();
boxes = new JCheckBox[4];
boxes[0] = new JCheckBox("���������");
boxes[1] = new JCheckBox("�");
boxes[2] = new JCheckBox("�Ӱ�");
boxes[3] = new JCheckBox("��������");
n.add(new JLabel("���ʹ�˾��"));
for (int i = 0; i < 2; i++) {
boxes[i].setEnabled(false);
n.add(boxes[i]);
}
n.add(new JLabel("���ʹ�˾��"));
for (int i = 2; i < boxes.length; i++) {
boxes[i].setEnabled(false);
n.add(boxes[i]);
}
center.add(n);
JPanel south = new JPanel();
docList = new JTextArea(8, 40);
docList.setEditable(false);
docListSP = new JScrollPane(docList);
south.add(docListSP);
frame.getContentPane().add(north, BorderLayout.NORTH);
frame.getContentPane().add(center, BorderLayout.CENTER);
frame.getContentPane().add(south, BorderLayout.SOUTH);
}
// ��ʼ���ļ�ѡ����
private void initFc() {
paperFc = new JFileChooser();
CustomFileFilter filter = new CustomFileFilter();
filter.addExtension("txt");
filter.setDescription("plain text file");
paperFc.setFileFilter(filter);
}
public static void main(String[] args) {
new PaperPatternUI();
}
}