/Users/washida/Project/Robot/MakeKnowledge/MakeProlog/src/makeprolog/Prolog.java |
package makeprolog;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
ファイルは1行に1文章ずつ入っていると想定する
@author
public final class Prolog {
List<String> dataLines;
Cabocha cabocha;
Parser parser;
List<String> particles;
List<Phrase> phrases;
int NON = 0;
int LEFT = 1;
int RIGHT = 2;
class Phrase{
String connective = "";
String conjunction = "";
String nounverb = "";
String original = "";
}
Prolog(){
dataLines = new ArrayList();
cabocha = new Cabocha();
this.parser = cabocha.parser;
particles = new ArrayList<>();
setPParticle();
phrases = new ArrayList<>();
}
void setPhrases(){
phrases.clear();
List<String> adjectives = new ArrayList<>();
for(int i=0;i<parser.size();i++){
List<Part> parts = parser.getPartsOFPhraseNo(i);
boolean adex = false;
Phrase ph = new Phrase();
for (Part part : parts) {
switch (part.part1) {
case "名詞":
ph.nounverb += part.surface;
break;
case "動詞":
if(part.part2.equals("非自立")){
ph.connective += part.surface;
}else{
ph.nounverb += part.surface;
ph.original = part.base;
}
break;
case "助詞":
case "助動詞":
ph.connective += part.surface;
break;
case "形容詞":
case "連体詞":
adjectives.add(part.surface);
adex = true;
break;
case "接続詞":
ph.conjunction = part.surface;
break;
default:
System.out.println("組み込めなかった語 = " + part.surface + "(" + part.part1 + ")");
}
if(adex){
break;
}
}
if(adex){
continue;
}
if(!ph.nounverb.isEmpty() && ph.connective.isEmpty() && ph.conjunction.isEmpty()){
ph.connective = "[ところの,という]";
}
if(!adjectives.isEmpty()){
String list = "[[";
for(int j=0;j<adjectives.size();j++){
String adj = adjectives.get(j);
if(j != 0) list +=", ";
list += adj;
}
ph.nounverb = list + "], " + ph.nounverb +"]";
}
phrases.add(ph);
adjectives.clear();
}
printPhrases();
}
void printPhrases(){
for(Phrase phrase:phrases){
System.out.println(phrase.connective+",\t"+phrase.nounverb+",\t"+phrase.conjunction+",\t"+phrase.original);
}
}
lineに与えられた文章をprolog化するメイン関数
@param line
void mkprolog(String line){
cabocha.execCabocha(line);
setPhrases();
int rootno = getRoot();
if(rootno < 0){
System.out.println("ルートフレーズを決定できません = "+line);
return;
}
String clauses = "";
int depth = 0;
clauses = makeNode(rootno, clauses, depth, NON);
System.out.println("%%--------------------------------");
System.out.println("%% 「"+line+"」のprolog化");
System.out.println("%% ルート句: No."+rootno
+" 助詞/動詞:"+phrases.get(rootno).connective
+" 語:"+phrases.get(rootno).nounverb
+" 接続詞:"+phrases.get(rootno).conjunction
+" 原型:"+phrases.get(rootno).original);
System.out.println("%%--------------------------------");
System.out.println("pl0000(");
System.out.print(clauses);
System.out.println(").");
System.out.println();
}
prolog化されたテキスト作成メソッド
再帰的に自分自身を呼び出す
@param phraseNo
@param clauses
@param depth
@param from
@return
String makeNode(int phraseNo, String clauses, int depth, int from){
String tab = " ";
for(int i=0;i<depth*4;i++) tab += " ";
Phrase phrase = phrases.get(phraseNo);
if(phraseNo == 0){
if(from != NON){
if (!phrase.connective.isEmpty()) {
clauses += tab + "node(" + phrase.connective + ",\n";
clauses += tab + " " + phrase.nounverb + ",\n";
clauses += tab + " " + phrases.get(1).nounverb + "\n";
clauses += tab+"),\n";
} else if (!phrase.conjunction.isEmpty()) {
clauses += tab + "node(" + phrase.conjunction + ",\n";
clauses += tab + " " + phrase.nounverb + ",\n";
clauses += tab + " " + phrases.get(1).nounverb + "\n";
clauses += tab+"),\n";
} else {
System.out.println("このフレーズには、助詞、助動詞、接続詞のいずれもがありませんでした");
return clauses;
}
}else{
if (!phrase.connective.isEmpty()) {
clauses += tab + "node(" + phrase.connective + ",\n";
clauses += tab + " " + phrase.nounverb + ",\n";
if(phrases.size() > 0){
clauses = makeNode(1,clauses,1,LEFT);
}else{
clauses += tab + " " + phrases.get(1).nounverb + "\n";
}
clauses += tab+")\n";
} else if (!phrase.conjunction.isEmpty()) {
clauses += tab + "node(" + phrase.conjunction + ",\n";
clauses += tab + " " + phrase.nounverb + ",\n";
if(phrases.size() > 0){
clauses = makeNode(1,clauses,1,LEFT);
}else{
clauses += tab + " " + phrases.get(1).nounverb + "\n";
}
clauses += tab+")\n";
} else {
System.out.println("このフレーズには、助詞、助動詞、接続詞のいずれもがありませんでした");
return clauses;
}
}
}else if(phraseNo == phrases.size()-1){
if(phrase.connective.isEmpty()){
String str = parser.makePhraseString(phraseNo);
clauses += tab + str + "\n";
}else{
clauses += tab + "node(" + phrase.connective + ",\n";
clauses += tab + " " + phrase.nounverb + ",\n";
clauses += tab+"[]\n";
clauses += tab+")\n";
}
}else{
if(!phrase.connective.isEmpty()){
clauses += tab + "node(" + phrase.connective + ",\n";
}else if(!phrase.conjunction.isEmpty()){
clauses += tab + "node(" + phrase.conjunction + ",\n";
}else{
clauses += tab + "node([NA],\n";
}
if(from == NON){
clauses = makeNode(phraseNo-1,clauses,depth+1,RIGHT);
clauses = makeNode(phraseNo+1,clauses,depth+1,LEFT);
clauses += tab+")\n";
}else if(from == RIGHT || from == NON){
clauses = makeNode(phraseNo-1,clauses,depth+1,RIGHT);
clauses += tab + " " + phrases.get(phraseNo+1).nounverb + "\n";
clauses += tab+"),\n";
}else{
clauses += tab + " " + phrase.nounverb + ",\n";
clauses = makeNode(phraseNo+1,clauses,depth+1,LEFT);
clauses += tab+")\n";
}
}
return clauses;
}
ルートノード番号(句番号)を取得する
@return
int getRoot(){
int priority = 9000;
int phraseno = -1;
for(int i=0;i<phrases.size();i++){
Phrase phrase = phrases.get(i);
if (!phrase.connective.isEmpty()) {
int idx = particles.indexOf(phrase.connective);
if (idx >= 0) {
if (idx < priority) {
priority = idx;
phraseno = i;
}
}
}
}
return phraseno;
}
ファイルからテキストを読み込む、使っていない
@param path
void readData(String path){
File file = new File(path);
System.out.println("データを読み込みます = "+file.getName());
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.isEmpty()) {
continue;
}
dataLines.add(line);
}
br.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Prolog.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Prolog.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("データを読み取り終えました = "+dataLines.size());
}
void setPParticle(){
String [] parts = pparticle.split(",");
for(String part:parts){
particles.add(part.trim());
}
}
final String pparticle = "を, に, が, は, と, で, た, な, から, や, も, て, である, として, ている, には, では, ていた, によって, であり, により, であった, による, へ, でも, との, という, まで, への, にも, ない, での, たが, だった, など, ており, だ, ず, などの, より, とは, において, たと, からの, における, について, ば, たり, に対して, なかった, はと, としては, か, に対する, であると, としての, うと, とも, とともに, ていたが, だが, などを, までの, ながら, と共に, へと, に関する, だと, よりも, であるが, などが, ではなく, については, であったが, ているが, にて, てきた, でいる, からは, ても, ていない, などで, に対し, といった, だったが, をと, ていく, などに, ていると, てしまう, までに, にと, においては, でいた, ずに, のみ, なく, たものの, にかけて, の";
args に読み込みファイルを指定する
@param args
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
Prolog prolog = new Prolog();
Main main = new Main(prolog);
main.setLocation(500,300);
main.setVisible(true);
}
}