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
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
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
}\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
// 検索用インデックスを生成\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
// 検索高速化用のデータ\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
/**\r
* 番組追跡で使うよ\r
*/\r
- ArrayList<String> SearchStrKeys = null;\r
+ static boolean tracenOnlyTitle = false;\r
\r
/*******************************************************************************\r
* NGワード処理\r
\r
titlePop = "";\r
detailPop = "";\r
- SearchStrKeys = new ArrayList<String>();\r
}\r
\r
/*******************************************************************************\r
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
\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
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
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
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
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
\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
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
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
\r
// 番組タイトルを整形する\r
private void fixTitle() {\r
+ // 番組追跡からサブタイトルを除外するかどうかのフラグ\r
+ ProgDetailList.tracenOnlyTitle = env.getFixTitle() && env.getTraceOnlyTitle();\r
//\r
if ( ! env.getFixTitle()) {\r
return;\r
// 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
// ジャンル=映画でサブジャンルが複数ありアニメが優先されてないものはアニメを優先する\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