OSDN Git Service

番組追跡の処理の効率化ほか
authorpeeweedee <peeweedee@users.sourceforge.jp>
Tue, 17 Dec 2013 01:06:32 +0000 (10:06 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Tue, 17 Dec 2013 01:06:32 +0000 (10:06 +0900)
TinyBannavi/src/statusView/Viewer.java
TinyBannavi/src/tainavi/AbsSettingView.java
TinyBannavi/src/tainavi/MarkedProgramList.java
TinyBannavi/src/tainavi/PassedProgram.java
TinyBannavi/src/tainavi/ProgDetailList.java
TinyBannavi/src/tainavi/Syobocal.java
TinyBannavi/src/tainavi/TVProgramUtils.java
TinyBannavi/src/tainavi/TraceKey.java
TinyBannavi/src/tainavi/TraceProgram.java
TinyBannavi/src/tainavi/VWTraceKeyDialog.java
TinyBannavi/src/tainavi/Viewer.java

index 4d8bfaa..b641c7d 100644 (file)
@@ -333,7 +333,7 @@ public class Viewer extends JFrame {
                        if ( r.getRecorderIPAddr().equals("") ) {\r
                                continue;\r
                        }\r
-               if ( r.getRecorderId().contains("RD-") || r.getRecorderId().contains("DBR-Z") ) {\r
+               if ( ! r.getRecorderId().contains("RD-") && ! r.getRecorderId().contains("DBR-Z") ) {\r
                        continue;\r
                }\r
                \r
index 59fdd22..ae29b2e 100644 (file)
@@ -395,6 +395,11 @@ public abstract class AbsSettingView extends JScrollPane {
                        CommonSwingUtils.putComponentOn(jPanel_setting, getNoticeMsg(" 閾値を大きくすると判定が厳しくなります。キーワードが短いためにヒットしまくりで検索ノイズが多くなった場合に、値を大きくしてみてください。"), DESCRIPTION_WIDTH, PARTS_HEIGHT, SEP_WIDTH*2, y);\r
                        \r
                        y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_traceOnlyTitle = new JCheckBoxPanel("タイトル中に含まれるサブタイトルは番組追跡の対象にしない",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
+                       jCBP_traceOnlyTitle.setSelected(env.getTraceOnlyTitle());\r
+                       jCBP_traceOnlyTitle.addItemListener(IL_RELOAD_PROG_NEEDED);\r
+               \r
+                       y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_syoboFilterByCenters = new JCheckBoxPanel("しょぼかるの検索結果も有効な放送局のみに絞る",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
                        jCBP_syoboFilterByCenters.setSelected(env.getSyoboFilterByCenters());\r
                        // RELOADリスナー不要\r
@@ -739,24 +744,11 @@ public abstract class AbsSettingView extends JScrollPane {
                        jCBP_autoEventIdComplete.setSelected(env.getAutoEventIdComplete());\r
                        // RELOADリスナー不要\r
 \r
-                       {\r
-                               y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_splitEpno = new JCheckBoxPanel("タイトルに話数が含まれる場合に以降を分離する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
-                               jCBP_splitEpno.setSelected( ! env.getSplitEpno());\r
-                               jCBP_splitEpno.addItemListener(IL_RELOAD_PROG_NEEDED);\r
-                               \r
-                               y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
-                               CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_traceOnlyTitle = new JCheckBoxPanel("┗ サブタイトルを番組追跡の対象から除外する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
-                               jCBP_traceOnlyTitle.setSelected(env.getTraceOnlyTitle());\r
-                               jCBP_traceOnlyTitle.addItemListener(IL_RELOAD_PROG_NEEDED);\r
+                       y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
+                       CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_splitEpno = new JCheckBoxPanel("タイトルに話数が含まれる場合に以降を分離する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
+                       jCBP_splitEpno.setSelected( ! env.getSplitEpno());\r
+                       jCBP_splitEpno.addItemListener(IL_RELOAD_PROG_NEEDED);\r
                                \r
-                               // 連動設定\r
-\r
-                               jCBP_splitEpno.addItemListener(al_splitepno);\r
-\r
-                               jCBP_splitEpno.setSelected( ! jCBP_splitEpno.isSelected());\r
-                       }\r
-                       \r
                        y+=(PARTS_HEIGHT+SEP_HEIGHT);\r
                        CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_fixTitle = new JCheckBoxPanel("タイトル先頭の「アニメ 」を削除(NHKのみ)",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
                        jCBP_fixTitle.setSelected(env.getFixTitle());\r
index 586ce22..0953e9c 100644 (file)
@@ -160,13 +160,14 @@ public class MarkedProgramList {
                                                        }\r
                                                        else {\r
                                                                //あいまい検索・正引き\r
-                                                               fazScore = TraceProgram.sumScore(tvd.SearchStrKeys,tKey._getTitlePop());\r
+                                                               String target = ProgDetailList.tracenOnlyTitle ?  tvd.splitted_titlePop : tvd.titlePop;\r
+                                                               fazScore = TraceProgram.sumScore(target, tKey._getTitlePop());\r
                                                                if (fazScore >= tKey.getFazzyThreshold()) {\r
                                                                        isFind = true;\r
                                                                }\r
                                                                else if ( ! this.disableFazzySearchReverse) {\r
                                                                        // 逆引き\r
-                                                                       fazScore = TraceProgram.sumScore(tKey._getSearchStrKeys(),tvd.titlePop);\r
+                                                                       fazScore = TraceProgram.sumScore(tKey._getTitlePop(), target);\r
                                                                        if (fazScore >= tKey.getFazzyThreshold()) {\r
                                                                                isFind = true;\r
                                                                        }\r
index 86d2f68..1573cf1 100644 (file)
@@ -354,7 +354,6 @@ public class PassedProgram extends TVProgramUtils implements TVProgram,Cloneable
                                // 検索用インデックスを生成\r
                                data.titlePop = TraceProgram.replacePop(data.title);\r
                                data.detailPop = TraceProgram.replacePop(data.detail);\r
-                               data.SearchStrKeys = TraceProgram.splitKeys(data.titlePop);\r
                                \r
                                // 終了時刻・実日付を生成\r
                                String[] Ahm = data.start.split(":",2);\r
index 13985e2..fdb98f6 100644 (file)
@@ -91,7 +91,7 @@ public class ProgDetailList implements Cloneable {
        // 検索高速化用のデータ\r
        \r
        /**\r
-        * キーワード検索で使うよ\r
+        * ã\82­ã\83¼ã\83¯ã\83¼ã\83\89æ¤\9cç´¢ã\83»ç\95ªçµ\84追跡ã\81§ä½¿ã\81\86ã\82\88\r
         */\r
        String titlePop = "";\r
        \r
@@ -103,7 +103,7 @@ public class ProgDetailList implements Cloneable {
        /**\r
         * 番組追跡で使うよ\r
         */\r
-       ArrayList<String> SearchStrKeys = null;\r
+       static boolean tracenOnlyTitle = false;\r
        \r
        /*******************************************************************************\r
         * NGワード処理\r
@@ -135,7 +135,6 @@ public class ProgDetailList implements Cloneable {
 \r
                titlePop = "";\r
                detailPop = "";\r
-               SearchStrKeys = new ArrayList<String>();\r
        }\r
        \r
        /*******************************************************************************\r
@@ -535,7 +534,6 @@ public class ProgDetailList implements Cloneable {
                        case TITLE:\r
                                this.title = body;\r
                                this.titlePop = TraceProgram.replacePop(this.title);\r
-                               this.SearchStrKeys = TraceProgram.splitKeys(this.titlePop);\r
                                break;\r
                        case DETAIL:\r
                                this.detail = body;\r
index 46db8f0..dd68858 100644 (file)
@@ -368,7 +368,6 @@ public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {
                                \r
                                // 詳細を登録する\r
                                pDetail.titlePop = TraceProgram.replacePop(pDetail.title);\r
-                               pDetail.SearchStrKeys = TraceProgram.splitKeys(pDetail.titlePop);\r
                                pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);\r
                                pDetail.length = Integer.valueOf(CommonUtils.getRecMin(pDetail.start.substring(0,2),pDetail.start.substring(3,5),pDetail.end.substring(0,2),pDetail.end.substring(3,5)));\r
                        }\r
index a28776c..4129062 100644 (file)
@@ -509,7 +509,8 @@ public class TVProgramUtils implements Cloneable {
                pdl.titlePop = TraceProgram.replacePop(key_title);\r
                pdl.detailPop = TraceProgram.replacePop(key_detail);\r
                \r
-               pdl.SearchStrKeys = TraceProgram.splitKeys(pdl.titlePop);\r
+               // 分離しない場合でも、番組追跡はサブタイトル抜きでの検索ができるようにしたい\r
+               pdl.splitted_titlePop = TraceProgram.replacePop(pdl.splitted_title);\r
        }\r
        \r
        /**\r
@@ -850,7 +851,6 @@ public class TVProgramUtils implements Cloneable {
                                                pd2.link = pd1.link;\r
                                                pd2.titlePop = pd1.titlePop;\r
                                                pd2.detailPop = pd1.detailPop;\r
-                                               pd2.SearchStrKeys = pd1.SearchStrKeys;\r
                                                pd2.nosyobo = pd1.nosyobo;\r
                                                pd2.extension = pd1.extension;\r
                                                pd2.flag = pd1.flag;\r
index 997a5a4..5f7b3ec 100644 (file)
@@ -13,7 +13,6 @@ public class TraceKey implements SearchItem {
        private String center = null;\r
        private int fazzyThreshold = 0;\r
        private String okiniiri = null;\r
-       private ArrayList<String> SearchStrKeys = null;\r
        private boolean disableRepeat = false;\r
        private boolean showLatestOnly = false;\r
 \r
@@ -37,8 +36,6 @@ public class TraceKey implements SearchItem {
        public String _getLabel() { return label; }\r
        public void setTitlePop(String s) { titlePop = s; }\r
        public String _getTitlePop() { return titlePop; }\r
-       public void setSearchStrKeys(ArrayList<String> sa) { SearchStrKeys = sa; }\r
-       public ArrayList<String> _getSearchStrKeys() { return SearchStrKeys; }\r
 \r
        // interface\r
        \r
index b369c33..fa9e2ad 100644 (file)
@@ -49,8 +49,6 @@ public class TraceProgram {
                \r
                tr.setTitlePop(replacePop(tr.getTitle()));\r
                \r
-               tr.setSearchStrKeys(splitKeys(tr._getTitlePop()));\r
-               \r
                tr.setLabel(getNewLabel(tr.getTitle(), tr.getCenter()));\r
                }\r
        }\r
@@ -104,55 +102,44 @@ public class TraceProgram {
                return(sb.toString());\r
        }\r
 \r
-       // あいまい検索用キー文字列群の生成\r
-       public static ArrayList<String> splitKeys(String s)\r
-       {\r
-               ArrayList<String> SearchStrKeys = new ArrayList<String>();\r
-           \r
-           int countStr=s.length();\r
-           if (countStr == 1) {\r
-               SearchStrKeys.add(s);\r
-           }\r
-           else {\r
-                   for (int i=1; i<countStr; i++) {\r
-                       SearchStrKeys.add(s.substring(i-1, i+1));\r
-                   }\r
-           }\r
-           \r
-           return(SearchStrKeys);\r
-       }\r
-       \r
-       // 2つの文字を比較してスコアを計算する(special thanks to ◆kzz0PzTAMM)\r
-       public static int sumScore(String SearchStr1, String SearchStr2)\r
-       {\r
-           // 検索ワードが空なら検索終了\r
-               if (SearchStr1.equals("") || SearchStr2.equals("")) {\r
-                       return 0;\r
-               }\r
-               \r
-           // 検索ワードを基準に検索する\r
-           return sumScore(splitKeys(SearchStr1), SearchStr2);\r
-       }\r
-       public static int sumScore(ArrayList<String> SearchStr1Keys, String SearchStr2)\r
+       // 最少比較単位は2文字(バイグラム)\r
+       private static final int COMPCHARLEN = 2;\r
+\r
+       /**\r
+        * 2つの文字を比較してスコアを計算する(special thanks to ◆kzz0PzTAMM)\r
+        * @param searchkey 番組追跡の検索キー\r
+        * @param target タイトル(中の文字がsearchkeyに何個含まれているかを確認する)\r
+        * @return\r
+        */\r
+       public static int sumScore(String searchkey, String target)\r
        {\r
        \r
            // 検索ワードが空なら検索終了\r
-               if (SearchStr1Keys.size() == 0 || "".equals(SearchStr2)) {\r
+               if (searchkey == null || target == null || "".equals(searchkey) || "".equals(target)) {\r
                        return 0;\r
                }\r
 \r
-           // 検索ワードを基準に検索する\r
-           int searchCount=0;\r
-           int score=0;\r
-           for (String key : SearchStr1Keys) {\r
-               if (SearchStr2.indexOf(key) >= 0) {\r
-                       score++;\r
-               }\r
-               searchCount++;\r
-           }\r
-\r
-           score=Math.round(score*100/searchCount);\r
-           return(score);\r
+               int searchCountMax = searchkey.length();\r
+               if ( searchCountMax > COMPCHARLEN ) {\r
+                       // 検索キーが最少比較単位より長い\r
+                       searchCountMax = searchCountMax - COMPCHARLEN + 1;\r
+                       int score = 0;\r
+                       int searchCount = 0;\r
+                       for ( ; searchCount < searchCountMax; searchCount++ ) {\r
+                               if ( target.indexOf(searchkey.substring(searchCount,searchCount+COMPCHARLEN)) != -1 ) {\r
+                                       score++;\r
+                               }\r
+                       }\r
+                       return Math.round(score * 100 / searchCount);\r
+               }\r
+               else {\r
+                       if ( target.indexOf(searchkey) != -1 ) {\r
+                               System.err.println("xxxx "+target+", "+searchkey);\r
+                               return 100;\r
+                       }\r
+               }\r
+               \r
+               return 0;\r
     }\r
        \r
        \r
index d792fce..930c5ad 100644 (file)
@@ -318,7 +318,6 @@ public class VWTraceKeyDialog extends JEscCancelDialog {
                xKey.setCenter(jTextField_channel.getText());\r
                xKey.setTitle(jTextField_title.getText().trim());\r
                xKey.setTitlePop(TraceProgram.replacePop(xKey.getTitle()));\r
-               xKey.setSearchStrKeys(TraceProgram.splitKeys(xKey._getTitlePop()));\r
                xKey.setFazzyThreshold(jSlider_fazzyThreshold.getValue());\r
                xKey.setOkiniiri((String) jComboBox_okiniiri.getSelectedItem());\r
                xKey.setDisableRepeat(jCheckBox_disableRepeat.isSelected());\r
index 2bf69ab..09d07d9 100644 (file)
@@ -3393,6 +3393,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
        \r
        // 番組タイトルを整形する\r
        private void fixTitle() {\r
+               // 番組追跡からサブタイトルを除外するかどうかのフラグ\r
+               ProgDetailList.tracenOnlyTitle = env.getFixTitle() && env.getTraceOnlyTitle();\r
                //\r
                if ( ! env.getFixTitle()) {\r
                        return;\r
@@ -3417,7 +3419,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                                                // NHK系で先頭が「アニメ 」ではじまるものから「アニメ 」を削除する\r
                                                                tvd.title = tvd.title.replaceFirst("^アニメ[  ・]+","");\r
                                                                tvd.titlePop = TraceProgram.replacePop(tvd.title);\r
-                                                               tvd.SearchStrKeys = TraceProgram.splitKeys(tvd.titlePop);\r
                                                        }\r
                                                        if ( tvd.title.contains("コメンタリ") || tvd.detail.contains("コメンタリ") ) {\r
                                                                // "コメンタリ"の記述のあるものは「副音声」扱いにする(副音声でなくても)\r
@@ -3443,11 +3444,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                                                        // ジャンル=映画でサブジャンルが複数ありアニメが優先されてないものはアニメを優先する\r
                                                        tvd.subgenre = ProgSubgenre.MOVIE_ANIME;\r
                                                }\r
-                                               \r
-                                               // サブタイトルを番組追跡の対象から外す\r
-                                               if ( env.getTraceOnlyTitle() && tvd.title != tvd.splitted_title ) {\r
-                                                       tvd.SearchStrKeys = TraceProgram.splitKeys(TraceProgram.replacePop(tvd.splitted_title));        // 番組追跡の検索用インデックスは、サブタイトルを削除したもので置き換える\r
-                                               }\r
                                        }\r
                                }\r
                        }\r