2

データベースのテーブルに生のテキストのコレクションがあります。このコレクションのいくつかの単語を、単語のセットを使用して置き換える必要があります。置換するすべての用語とその置換を以下のようにテキストファイルに入れます

min=admin
lelet=lambat
lemot=lambat
nii=nih
ntu=itu

等々。用語とその代替のコレクションを読み取るために、ファイルとスキャナーのバリアベルを正常に開始しました。

すべてのデータセットをループし、同じループ内の文字列に生のテキストを保存しますすべての用語コレクションをループし、その行を文字列名「pattern」に保存し、パターンを「term」と「replacer」という名前の2つの文字列に分割しますこのループでは、新しい文字列を開始します。その値は、用語コレクションのreplaceAll(term、replacer)終了ループによって変更されたデータセットの文字列です。次に、データセットのデータベース終了ループの別のテーブルに新しい文字列を挿入します。

私は以下のように手動でそれを行いますreplaceAll( "min"、 "admin")とその動作ですが、実際には、ほぼ2000の用語でそれを置き換えるために手動でコーディングするものです。

誰もがこの種の本当に何かに直面したことがあります..私は本当に今必死に助けが必要です:(

 package sentimenrepo;
    import javax.swing.*;
    import java.sql.*;
    import java.io.*;
    //import java.util.HashMap;
    import java.util.Scanner;
    //import java.util.Map;
    /**
     *
     * @author herman
     */
    public class synonimReplaceV2 extends SwingWorker {
        protected Object doInBackground() throws Exception {
                 new skripsisentimen.sentimenttwitter().setVisible(true);

                  Integer row = 0;
                  File synonimV2 = new File("synV2/catatan_kata_sinonim.txt");
                  String newTweet = "";
                DB db = new DB();
            Connection conn = db.dbConnect("jdbc:mysql://localhost:3306/tweet", "root", "");
            try{
              Statement select = conn.createStatement();
              select.executeQuery("select * from synonimtweet");
              ResultSet RS = select.getResultSet();
              Scanner scSynV2 = new Scanner(synonimV2);
              while(RS.next()){
                   row++;

                       String no = RS.getString("no");
                  String tweet = " "+ RS.getString("tweet");
                  String published = RS.getString("published");
                  String label = RS.getString("label");
                  clean2 cleanv2 = new clean2();

                  newTweet = cleanv2.cleanTweet(tweet);
                    try{
                         Statement insert = conn.createStatement();
                         insert.executeUpdate("INSERT INTO synonimtweet_v2(no,tweet,published,label) values('"
                                 +no+"','"+newTweet+"','"+published+"','"+label+"')");
                        String current = skripsisentimen.sentimenttwitter.txtAreaResult.getText();
                  skripsisentimen.sentimenttwitter.txtAreaResult.setText(current+"\n"+row+"original : "+tweet+"\n"+newTweet+"\n______________________\n");
                  skripsisentimen.sentimenttwitter.lblStat.setText(row+" tweet read");
                  skripsisentimen.sentimenttwitter.txtAreaResult.setCaretPosition(skripsisentimen.sentimenttwitter.txtAreaResult.getText().length() - 1);

                    }catch(Exception e){
                         skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());

                    }

                 skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());

              }
            }catch(Exception e){
                skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());

            }
           return row;
        }
        class clean2{

            public clean2(){}

            public String cleanTweet(String tweet){
               File synonimV2 = new File("synV2/catatan_kata_sinonim.txt");

                String pattern = "";
              String term = "";
              String replacer = "";
              String newTweet="";
             try{
                Scanner scSynV2 = new Scanner(synonimV2);
                 while(scSynV2.hasNext()){
                  pattern = scSynV2.next();
                  term = pattern.split("=")[0];
                  replacer = pattern.split("=")[1];
                  newTweet = tweet.replace(term, replacer);
                 }
             }catch(Exception e){
                 e.printStackTrace();
             }

                System.out.println(newTweet+"\n"+tweet);
              return newTweet;

            }
        }

    }

アップデート


iveは、コードが実際に機能することを認識していますが、データベースの最初の行、2番目の行などは静止しています。これが私が構築した最新のコードを更新することです

public class synonimReplaceV2 extends SwingWorker {

    protected Object doInBackground() throws Exception {
             new skripsisentimen.sentimenttwitter().setVisible(true);

              Integer row = 0;

              String newTweet = "";
            DB db = new DB();
        Connection conn = db.dbConnect("jdbc:mysql://localhost:3306/tweet", "root", "");
        try{
          Statement select = conn.createStatement();
          select.executeQuery("select * from synonimtweet limit 2,10");
          ResultSet RS = select.getResultSet();
          FileReader readSyn = new FileReader("synV2/catatan_kata_sinonim.txt");
          BufferedReader buffSyn = new BufferedReader(readSyn);
          while(RS.next()){
               row++;
                   String no = RS.getString("no");
              String tweet = " "+ RS.getString("tweet");
              String published = RS.getString("published");
              String label = RS.getString("label");
              String pattern = "";
             while((pattern=buffSyn.readLine())!=null){
                 String patternTerm = pattern.split("=")[0];
                 String patternSubs = pattern.split("=")[1];
                 tweet = tweet.replaceAll("\\s"+patternTerm, patternSubs);
             }

                try{
                     Statement insert = conn.createStatement();
                     insert.executeUpdate("INSERT INTO synonimtweet_v2(no,tweet,published,label) values('"
                             +no+"','"+tweet+"','"+published+"','"+label+"')");
                    String current = skripsisentimen.sentimenttwitter.txtAreaResult.getText();
              skripsisentimen.sentimenttwitter.txtAreaResult.setText(current+"\n"+row+"original : "+tweet+"\n"+newTweet+"\n______________________\n");
              skripsisentimen.sentimenttwitter.lblStat.setText(row+" tweet read");
              skripsisentimen.sentimenttwitter.txtAreaResult.setCaretPosition(skripsisentimen.sentimenttwitter.txtAreaResult.getText().length() - 1);

                }catch(Exception e){
                     skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());
                }


          }
        }catch(Exception e){
            skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());
           // System.out.println(e.getMessage());
        }
        Thread.sleep(100);
       return row;
    }
}
4

4 に答える 4

2

シノニム ファイルを開いて、すべての行に対して 2,000 行以上繰り返すのResultSetは少し無駄です。

シノニムをメモリ内マップに一度ロードし、固有のスペルミス用語をキーにして、結果セットのすべての行をマップ上でルックアップし、必要に応じて置き換えます。

于 2012-06-11T16:36:48.727 に答える
1

両方のソリューションを使用して、単一のソリューションを構築しましょう。

まず、すべてのキーを使用して HashMap を作成します。

public static HashMap<String, String> getMap() {
        //your version would read from the file
        HashMap<String,String> myMap=new HashMap<String,String>();
        myMap.put("min", "admin");
        myMap.put("lelet", "lambat");
        myMap.put("lemot", "lambat");
        myMap.put("nii", "nih");
        myMap.put("ntu", "itu");
        return(myMap);
    }

次に、ハッシュマップにすべてのキーを含むパターンを作成します。

public static String getPattern(HashMap<String,String> mapReplacement) {
        String pattern="";
        for (String s : mapReplacement.keySet()) {
            if (!pattern.isEmpty()) {
                pattern=pattern+"|";
            }
            pattern=pattern+s;
        }        
        return(pattern);
    }

次に、作成した両方の構造を使用する cleanTweet メソッドを作成できます。

public static String cleanTweet(String tweet, Pattern pattern,HashMap<String, String> myMap) {
        String newTweet=tweet;
        Matcher matcher = pattern.matcher(newTweet);
        int start=0;
        while (matcher.find()) {
            String key=matcher.group();
            String replacement=myMap.get(key);
            if (replacement!=null) {
                newTweet=newTweet.replace(key, replacement );
            }            
        }
        return(newTweet);
    }

これには、完全に調整する必要があるかもしれません (私はいくつかのケースをテストしただけです)。

お役に立てば幸いです。

于 2012-06-11T18:03:21.010 に答える
0

コードが機能しない理由の答えを見つけた人々に感謝します、

プログラムがデータベースから行を読み取るたびに、用語とその代替を含むtxtファイルを開始する必要があります。

コードは次のようになります

public class synonimReplaceV2 extends SwingWorker {

    protected Object doInBackground() throws Exception {
             new skripsisentimen.sentimenttwitter().setVisible(true);

              Integer row = 0;

              String newTweet = "";
            DB db = new DB();
        Connection conn = db.dbConnect("jdbc:mysql://localhost:3306/tweet", "root", "");
        try{
          Statement select = conn.createStatement();
          select.executeQuery("select * from synonimtweet limit 2,10");
          ResultSet RS = select.getResultSet();

          while(RS.next()){
               row++;


          FileReader readSyn = new FileReader("synV2/catatan_kata_sinonim.txt");
          BufferedReader buffSyn = new BufferedReader(readSyn);

                   String no = RS.getString("no");
              String tweet = " "+ RS.getString("tweet");
              String published = RS.getString("published");
              String label = RS.getString("label");
              String pattern = "";
             while((pattern=buffSyn.readLine())!=null){
                 String patternTerm = pattern.split("=")[0];
                 String patternSubs = pattern.split("=")[1];
                 tweet = tweet.replaceAll("\\s"+patternTerm, patternSubs);
             }

                try{
                     Statement insert = conn.createStatement();
                     insert.executeUpdate("INSERT INTO synonimtweet_v2(no,tweet,published,label) values('"
                             +no+"','"+tweet+"','"+published+"','"+label+"')");
                    String current = skripsisentimen.sentimenttwitter.txtAreaResult.getText();
              skripsisentimen.sentimenttwitter.txtAreaResult.setText(current+"\n"+row+"original : "+tweet+"\n"+newTweet+"\n______________________\n");
              skripsisentimen.sentimenttwitter.lblStat.setText(row+" tweet read");
              skripsisentimen.sentimenttwitter.txtAreaResult.setCaretPosition(skripsisentimen.sentimenttwitter.txtAreaResult.getText().length() - 1);

                }catch(Exception e){
                     skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());
                }


          }
        }catch(Exception e){
            skripsisentimen.sentimenttwitter.lblStat.setText(e.getMessage());
           // System.out.println(e.getMessage());
        }
        Thread.sleep(100);
       return row;
    }
}

しかし、私は実際にrlindenが上記で作成したコードを適用したいのですが、cleanTweet関数を呼び出す方法を理解できません。

于 2012-06-13T11:15:53.583 に答える
0

私は試していませんが、ほとんど理解しているように思えます-次の行を置き換えるだけです:

newTweet = tweet.replace(term, replacer);

これとともに:

tweet = tweet.replaceAll(term, replacer);

もう使用していないので、次newTweetを返しtweetます。

return tweet;

newTweet宣言も削除する必要があります。

また、Scanner行を読むために読むべきではありません。FileReader代わりに使用してください。

于 2012-06-11T16:31:19.197 に答える