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

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

/**
* @author miyanishi
*
* TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
* ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
*/
public class Document {

/* フィールド群 */
private final static String HINSHI = "名詞";
private final static String EXCEPT = "<>/*-+.()&%$#=[]票";
private String document; //全てのドキュメントをまとめる名前(プロジェクト名)
private String[] files; //個々のファイル名

private Hashtable allhash;//全ての単語と登場回数を格納
private Vector allvector; //全ての単語を格納したベクトル

private int vectorsize; //全ての要素数
private int cntsentence;//全ての文章数(Nの計算に用いる)

private ArrayList[] cnt; //登場回数ごとに単語をカウント

//defaultコンストラクタ
private Document(){
	this("/misc/home/miyanishi/eclipse/workspace/KBSE07/test/"); //デフォルトの指定先
	//フォルダ名をフルパスで/misc/・・・・/test/ など
}

public Document(String path){
	this.document = path;
	setFolderFiles();
	
	/* ドキュメントの中にある単語と登場回数をカウントする処理 */
	allhash = new Hashtable();//全てのドキュメント内の単語を格納
	allvector = new Vector();//ベクトル名を付けて格納
	
	setAllvectorhash();//全てのドキュメント内で登場する単語を格納
	valueSort(); //単語の登場回数ごとに単語をArrayListに格納
	
}

/**
 * 引数としてテキスト番号,センテンス番号,登場回数,単語を保持クラスへ渡す
 * vectorのキー → hashのキーと照合して,単語回数をmax=tempとしてmaxとなる
 * キーとmaxを新しいhashとして保持しておく
 * 
 */
private void valueSort(){
	/*全単語の中から最も出現回数の多い単語を抽出*/
	int max = 0;
	//Hashtableに存在するキーとベクトルを使って値を抽出
	for(int i = 0 ; i < allvector.size() ; i ++){
		String vec = (String) allvector.get(i);
		//System.out.println(vec + ":" +allhash.get(vec));
		String v = allhash.get(vec).toString();
		int val = Integer.parseInt( v );
		if(val > max){
			max = val;
		}
	}
	//System.out.println("max = " + max);//最大登場回数を測定
	
	/* 登場回数ごとに単語を格納 */
	cnt = new ArrayList[max+1]; //cnt[i]はi回登場する単語をArrayListに格納
	for(int i = 0 ; i <= max ; i++){//個別のオブジェクト生成
		cnt[i] = new ArrayList(); //i回登場する単語を格納
	}
	
	for(int i = 0 ; i < allvector.size() ; i ++){
		String vec = (String) allvector.get(i);
		//System.out.println(vec + ":" +allhash.get(vec));//(単語,出現回数)ペア
		String v = allhash.get(vec).toString();
		int value = Integer.parseInt( v );
		//System.out.println("value = " + value);
		
		cnt[value].add(vec);//cnt[登場回数]=(単語,単語・・・)としてまとめる
	}
}

public ArrayList[] getFrequencyWord(){
	return cnt;
}

/**
 * @param bunsyocnt
 */
private void setCntsentence(int bunsyocnt) {
	this.cntsentence = bunsyocnt;
}

private int getCntsentence(){
	return cntsentence;
}

/**
 * ドキュメント(フォルダー)内にあるすべてのファイルの登録
 * 
 * @param name ファイル名
 * @param path ファイルパス
 */
private void setFolderFiles() {
	String name = "temp.txt"; //デフォルトではtxtファイルを取得する
	int position = name.indexOf(".");
	//拡張子を抽出する
	final String extension = name.substring(position + 1);
	
	File dir = new File(document);
	String[] tmpfiles = dir.list(new FilenameFilter() {
		public boolean accept(File dir, String name) {
			if(name.toString().indexOf(extension) > 0)
				return (new File(dir, name).isFile());
			else
				return false;
		}
	});
	//フィールドへの書き込み
	files = new String[tmpfiles.length];
	for(int i = 0 ; i < tmpfiles.length ; i++){
		files[i] = tmpfiles[i];
	}
}

/**
 * 解析するファイル群名の取得
 * 
 * @return files配列
 */
private String[] getFolderFiles(){
	return files;
}


/**
 * 品詞ごとにグルーピングする
 * 同時に,フィールド変数であるVectorに代入する
 */
private void setAllvectorhash(){
	String foldername[] = getFolderFiles();
	System.out.println(foldername.length);
	
	String operator = EXCEPT;
	
	for(int k = 0 ; k < foldername.length ; k++){
		String name = foldername[k];
		//System.out.println("name =" + name);
		ArrayList str = ReadLine(name);
		
		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{ //System.out.println("str[1] "+ str1[1]);
				try{
					String[] str2 = divComma( str1[1] );
					parse = str2[0];
				}catch(Exception e){
					System.err.println("品詞解読のエラー sentence = " + singleword );
				}
			}
			
			/* 記号扱い以外の単語を集約する(名詞,形容詞,助詞など) */
			if( parse.equals(HINSHI)){
				// step1未登録の単語を登録する
				if( !(allvector.contains(singleword)) ){//要素が入ってない場合
					allvector.add(singleword);
				}
				
				// step2登場する単語とその頻度を登録する
				Integer n = (Integer)allhash.get(singleword);
				//ハッシュテーブルにキーが入ってないときに値は1を格納 hm(word,cnt)
				/**
				 * @see http://www.wakhok.ac.jp/biblion/1996/JavaAppli/node27.html
				 * */
				if( !(allhash.containsKey(singleword)) ){
					allhash.put( singleword , new Integer(1) );
				}else{
					allhash.put( singleword ,new Integer((int)(n.intValue()+1)));
				}
			}
		}
	}
}

/**
 * Operationクラスに,すべての文章から作ったベクトル返すためのメソッド 
 */
public Vector getAllvector() {
	return allvector;
	
}

/**
 * Operationクラスに,全ての文章から付くったハッシュを返すためのメソッド
 */
public Hashtable getAllhash() {
	// TODO 自動生成されたメソッド・スタブ
	return allhash;
}




/**
 * [Mecab]ファイルから1行ずつ読み込む
 * 
 * @return s ArrayList
 */
private ArrayList ReadLine(String filename){
	String fullpath = document + filename;//フルパス名(ドキュメント名+ファイル名)
	ArrayList list = new ArrayList();
	try{
		BufferedReader br = new BufferedReader(new FileReader( fullpath ));
		/* 行単位で読み込む */
		String str;
		while( (str = br.readLine() ) != null ){
			//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[]){
	Document doc = new Document();
}*/
}
最終更新:2007年10月30日 02:06