/*
* 作成日: 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