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