アットウィキロゴ
 
/*
* 作成日: 2007/06/02
*
* TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
* ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
*/
package shimane;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Vector;

/**
* @author miyanishi
*
* ひとつの文章の集合であるテキストクラス.
* 
* ある一つのテキストファイル(hoge.txt)に含まれる文(Sentence)を切り離す
* ※Sentenceインスタンスは含まれる文の数だけ作る
*/
public class Text{
private final static String HINSHI = "名詞";
private final static String EXCEPT = "<>/*-+.()&%$#=[]票";
private String tfilename; //文章(ファイル名)	

/*1つのテキスト中に含まれる単語と回数*/
private Hashtable textwordhash;
private Vector textvector;

/* ある1文中に登場する単語とその頻度 */
private Hashtable shash;
private ArrayList storeshash;

private Vector svector;
private ArrayList storesvector;

/* 単語を格納 */
private ArrayList tword;

private static int tcount = 0;
/*private ArrayList noun, verb, adjective, abverb,
				  auxiliary_verb,particle;*/
/*public Text(){
	//テキスト名が指定されていない場合に指定
	this("/misc/home/miyanishi/eclipse/workspace/KBSE07/test/[[1.txt]]");
}*/

public Text(String _filename){
	tfilename = _filename;
	System.out.println("================================================-");
	System.out.println("ファイル名" + getFilename() + "\n");
	
	textwordhash = new Hashtable();//テキストファイル中の単語の頻度
	textvector = new Vector();//テキストファイル中の単語のベクトル
	
	setTextwordhash();//テキストの全単語の出現回数をカウント(センテンス無視)

	divSentence();
}

public void divSentence(){
	
	storeshash = new ArrayList();
	storesvector = new ArrayList();
	
	setTextwordhash(); //与えられた1つのテキスト内の全ての(単語,登場回数)
	setSentencewordhash();//1文ごとに分割して格納!
	
	printSentence(); //1文ごとにセンテンスを表示
	tcount++; //ファイル番号格納(static)
}

private void setFilename(String _name){
	this.tfilename = _name;
}

private String getFilename(){
	return tfilename;
}

/**
 * 品詞ごとにグルーピングする
 * 同時に,フィールド変数であるHashTableに代入する
 */
private void setTextwordhash(){
	String filename = getFilename();
	ArrayList str = ReadLine(filename);
	String operator = EXCEPT;
	for(int i = 0 ; i < str.size() ; i++ ){
		String[] str1 = divTAB( (String)str.get(i) ); //ArrayList→Stringへ
		String singleword = str1[0];
		//System.out.println(i + "]" + singleword);
		String parse = "";
		if(singleword.equals("EOS")){
			parse = "記号";
		}
		else if(operator.indexOf(singleword) >= 0)
			parse = "記号";
		else{
			try{
				String[] str2 = divComma( str1[1] );
				parse = str2[0];
			}catch(Exception e){
				System.err.println(filename + " 品詞解読エラー = " + singleword);
			}
		}
		
		if(parse.equals(HINSHI)){
			Integer n = (Integer)textwordhash.get(singleword);
			//ハッシュテーブルにキーが入ってないときに値は1を格納 hm(word,cnt)
			/**
			 * @see http://www.wakhok.ac.jp/biblion/1996/JavaAppli/node27.html
			 * */
			//単語が1つも登録されていない場合は新規に(単語,1)を割り当てる
			if( !(textwordhash.containsKey(singleword)) ){
				textwordhash.put( singleword , new Integer(1) );
			}
			//単語が登録されている場合は(単語,cnt+1)とする
			else{
				textwordhash.put( singleword ,new Integer((int)(n.intValue() + 1) ));
			}
			//単語が登録したかどうかを確認するベクトル
			if( !(textvector.contains(singleword)) )//要素が入ってない場合
				textvector.add(singleword);
		}
	}
}

/**
 * 品詞ごとにグルーピングする
 * 同時に,フィールド変数であるHashTableに代入する
 */
public void setSentencewordhash(){
	String filename = getFilename();
	ArrayList str = ReadLine(filename);
	String operator = EXCEPT ;
	int scnt = 0; //文数のカウントflag
	
	for(int i = 0 ; i < str.size() ; i++ ){
		String[] str1 = divTAB( (String)str.get(i) ); //ArrayList→Stringへ
		String singleword = str1[0];
		//System.out.println(i + "]" + singleword);
		String parse = "";
		if(singleword.equals("EOS")){
			parse = "記号";
		}
		else if(operator.indexOf(singleword) >= 0)
			parse = "記号";
		else{
			try{
				String[] str2 = divComma( str1[1] );
				parse = str2[0];
			}catch(Exception e){
				System.err.println(filename + " Sentence品詞解読エラー = " + singleword);
			}
		}
			
		if(scnt == 0 ){
			shash = new Hashtable();
			String vectorkey = String.valueOf(scnt);
			svector = new Vector();//Stringでベクトル生成に注意
			scnt++;
		}
		
		if( parse.equals(HINSHI)){
			//tword.add(singleword);
			Integer n = (Integer)shash.get(singleword);
			//ハッシュテーブルにキーが入ってないときに値は1を格納 hm(word,cnt)
			/**
			 * @see http://www.wakhok.ac.jp/biblion/1996/JavaAppli/node27.html
			 * */
			if( !(shash.containsKey(singleword)) ){
				shash.put( singleword , new Integer(1) );
			}
			else{
				shash.put( singleword ,new Integer((int)(n.intValue() + 1) ));
			}
			if( !(svector.contains(singleword)) ){//要素が入ってない場合,単語を追加
				svector.add(singleword);
				//System.out.println("test]]" + singleword);
			}
		}
		/**
		 * ここについてはもう少し考える必要あり.
		 * ◯で終わる場合だけなのか?EOSの場合はどうするのか?? 
		 * 
		 * 文が終わる場合にはどうするのか?常に最後のonesentenceは空白になってしまうのか?
		 */
		
		if(singleword.equals("。") || singleword.equals(".")|| singleword.equals("票") ){
			storeshash.add(shash);
				//文末(。)のときにHashtableをArrayListに格納
			storesvector.add(svector);
				//1文が抽出できたらセンテンスクラスで処理を行う
			if( i != str.size() ){
				shash = new Hashtable();
				String vectorkey = String.valueOf(scnt);
				svector = new Vector();//Stringでベクトル生成に注意
				scnt++;
			}
		}
	}
}

public ArrayList getStoreonesentence(){
	return storeshash;
}

/**
 * 文数ごとに単語数と出現数を表示する
 *  →ゆくゆくはこれからtf-idfを算出
 *
 */
private void printSentence(){
	int scnt = storesvector.size(); //フィードから文数を代入
	
	/*ArrayListからHashtableを抽出*/
	for(int i = 0 ; i < scnt ; i++ ){
		System.out.println(tcount + " "+ i +"]" + storeshash.get(i));//文章ごとに抽出
	}
	/*ArrayListからベクトルを抽出*/
	for(int i = 0 ; i < storesvector.size() ; i++){ 
		Vector tmp0 = (Vector) storesvector.get(i);//ベクトル抽出
		for(int j = 0 ; j < tmp0.size() ; j++){//ベクトルから値抽出
			//System.out.println( tmp0.getVector(j) );//ベクトルを切り離して抽出
		}
	}
	/*Hashtableに存在するキーとベクトルを使って値を抽出*/
	for(int i = 0 ; i < storeshash.size() ; i ++){
		Hashtable ht = (Hashtable)storeshash.get(i);
		//System.out.println("Hash>" + ht);
		
		Vector vec = (Vector)storesvector.get(i);
		//System.out.println("Vector>"+ vec.getVector(i));	
		for(int j = 0 ; j < ht.size() ; j++){
			if( ht.containsKey(vec.get(j) )){
				//System.out.print(i +" ");
				//System.out.print(vec.getVector(j)+ " ");
				//System.out.println(ht.get(vec.getVector(j)));
			}
		}
	}
}

/**
 * [Mecab]ファイルから1行ずつ読み込む
 * 
 * @return s ArrayList
 */
private ArrayList ReadLine(String filename){
	ArrayList list = new ArrayList();
	try{
		BufferedReader br = new BufferedReader(new FileReader( filename ));
		/* 行単位で読み込む */
		String str;
		while( (str = br.readLine() ) != null ){
			//System.out.println(str);
			//if(str.equals("ENDOFDOC")) //終端文字は解析対象外
			//	break;
			
			//else if( !(str.equals(" ") || str.equals("EOS")))
				list.add( str );
		}
	}catch(Exception e){
		System.err.println("error>" + e.getMessage() );
	}
	return list;
}

/**
 * Mecabで分けられてたクラスを[TAB]キーで分割
 * 
 * @param str
 * @return div[] String
 */
private String[] divTAB(String str){
	String[] div = str.split("\t");
	return div;
}

/**
 * Mecabで表示された文字を[,]で分割
 * 
 * @param str
 * @return div[] String
 */
private String[] divComma(String str){
	String[] div = str.split(",");
	return div;
}

/*public static void main(String args[]){
	Text text = new Text();
}*/
}
最終更新:2007年10月30日 02:08