0

HashMap <String,ArrayList<String>>単語とその同義語を保持するためにを使用してシソーラスを構築しています(このデータ構造が必要です)。

割り当ての目的上、同義関係は推移的と見なされます。(シソーラスをグラフとして想像することができます)。私が達成しようとしているのは、このグラフをテキストファイルに印刷し、各行にコンポーネントを接続することです。つまり、同義語として一緒にプールできるすべての単語は1行にまとめる必要があります。

public void save() {
    try {
        FileWriter fw = new FileWriter(defaultDefinitionFile);
        BufferedWriter out = new BufferedWriter(fw);
        Set<String> keys = thesaurus.keySet();
        Iterator<String> ite = keys.iterator();
        while (ite.hasNext()) {
            String key = ite.next();
            out.write(key);
            ArrayList<String> synonyms = thesaurus.get(key);
            Iterator<String> i = synonyms.iterator();
            while (i.hasNext()) {
                String syn = i.next();
                out.write(","+syn);
                keys.remove(syn);
            }
            out.write("\r\n");
        }
        out.close();
        fw.close();
    }
    catch (Exception e) {
        System.out.println("Error writing to file");
        e.printStackTrace();
    }
}

これは私がそれが起こることをどのように描いたかです:

各同義語と一緒に単語を印刷してから、それらの同義語をデータ構造から削除して、重複する行がないようにします。

もちろん問題は、ハッシュマップの内容を繰り返し処理している間は何も削除できないことです。

私が見逃している代替アプローチはありますか?

PS私は、タイトルが雄弁で簡潔である必要があるという理由だけで、「グラフ」のメタファーをずっと維持しています。私は、この比喩の有用性が限られていることを理解しています。

4

3 に答える 3

2

セットに印刷された単語を保存して、まだセットに含まれていない単語のみを処理できます。

補足:これはグラフの問題と考えることができるのは事実ですが、コードはこれをそのように扱いません。これをグラフの問題として扱う場合、各単語のすべての同義語が対応するArrayListにリストされているとは想定しないため、対称閉包と推移閉包の計算が必要になります。そうして初めて、同値類を抽出します。

(実際には、同義語の関係は推移的ではありません。)

于 2009-05-18T22:40:51.327 に答える
0

「同義性」は推移的なプロパティではないため、これ(あなたの一般的な考え)は機能しません。

それ自体が同義語ではない同義語を持つ単語はたくさんあります。

于 2009-05-18T22:41:05.177 に答える
0

アイテムを削除する代わりに、無視するアイテムのリストに追加します。

于 2009-05-18T22:41:18.860 に答える