形態素解析とtfidf計算処理のjavaプログラム
二つのプログラムを作成しようと思っています。
1、一行に「単語<tab>数字列(132:1,83:2,........)」という形のデータが存在するファイルを読み込んで、単語の部分(殆ど名詞)だけ抽出し形態素解析(cmecabを使用)して名詞の何の種類かによって値を与え、一行に「単語<tab>値」という形でテキストファイルに出力するプログラム
値について
一般名詞、固有名詞の場合:2
形容動詞語幹の場合:1
サ変接続、副詞可能、ナイ形容詞語幹、接尾、非自立の場合:0.5
代名詞、数詞、その他(動詞や副詞、接頭詞)の場合:0
例:読み込むファイルの中身(単語<tab>文書番号:その文書での単語の出現回数,.........)
小学校 76:1,167:1,254:1,395:1,400:1,488:1
旦那 183:1
委員 275:1
最終 401:1
月曜日 376:1
以下のプログラムはCmecabでテキストファイルを読み込んで形態素解析し出力するプログラム。これを改造すればいけると思っています。
// 引数に解析したいファイルを指定
// 結果は"cmecab-output.txt"に出力
// コンパイル方法"javac -encoding utf8 cmecab.java"
// 入力ファイルの文字コードはUTF8で保存しておく
// 出力ファイルの文字コードもUTF8で出力されるので注意
// Mecabの辞書はUTF8でコンパイルしておくこと
import net.moraleboost.mecab.Tagger;
import net.moraleboost.mecab.impl.StandardTagger;
import net.moraleboost.mecab.Node;
import java.io.*;
import java.util.*;
import java.lang.*;
public class cmecab{
public static void main(String[] args) throws Exception{
// 引数が無い場合はヘルプを表示
if (args.length == 0) {
System.out.println("使用方法: java cmecab [入力テキストファイル名]");
return;
}
// バージョン文字列を取得
System.out.println("MeCab version: " + StandardTagger.version());
// 入出力ファイルの設定
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), "UTF-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("cmecab-output.txt"), "UTF-8"));
String text = "";
while((text = br.readLine()) != null){
// Taggerを構築。
// 第一引数には、MeCabの辞書の文字コードを与える。
// 第二引数には、MeCabのcreateTagger()関数に与える引数を与える。
Tagger tagger = new StandardTagger("UTF-8", "");
// tagger.parse()を呼び出して、文字列を形態素解析する。
// 返されるオブジェクトは、Iterator<String>を実装している。
Node node = tagger.parse(text);
// 一つずつ形態素をたどりながら、表層形と素性を出力
while (node.hasNext()) {
String surface = node.next();
String feature = node.feature();
bw.write(surface + "\t" + feature +"\n");
}
// taggerをクローズ
tagger.close();
}
br.close();
bw.close();
}
}
例:形態素解析して出力される形(「単語<tab>品詞,名詞の形」において「名詞の形」の部分を抽出して上記に書いた値に振り分けたいと思っている。)
70 名詞,数,*,*,*,*,*
: 名詞,サ変接続,*,*,*,*,*
1 名詞,数,*,*,*,*,*
何処 名詞,代名詞,一般,*,*,*,何処,ドコ,ドコ
2、1で読み込んだ「単語<tab>文書番号:その文書での単語の出現回数,.........」という形のファイルを読み込んでtfidf値を求め、一行に「単語<tab>tfidf値」という形でテキストファイルに出力していくプログラム
tfidfの定義
tf=文書番号Yにおける単語Xの出現確率(出現確率の分母はその文書における単語の合計数)
idf=log(文書の合計数/単語Xを含む文書数)
よろしくお願いいたします。
お礼
ありがとうございます。 実装をなるだけ複雑にしたくないこともありというのもあり シンプルなものを考えていました。 さすがに、完全な転置インデックスが(mecabが使えなくて)使えなくても 高速な検索をできるようにというのから、考えていました。