| | 143 | * 修改中文分詞錯誤 |
| | 144 | |
| | 145 | 問題描述: |
| | 146 | |
| | 147 | 由於Nutch不是原生支持中文的,開發者沒有考慮到中文的分詞會存在token的交叉重疊的情況,導致在根據用戶輸入查詢串的token獲取頁面summary時出現:StringIndexOutOfBoundsException的異常。比如:「教育方針」可能出現這樣的分詞「教育方針」、「教育」、「方針」,這幾個token就交叉重疊了。 |
| | 148 | |
| | 149 | 錯誤重現: |
| | 150 | |
| | 151 | java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.StringIndexOutOfBoundsException: String index out of range: -4 at org.apache.nutch.searcher.FetchedSegments.getSummary(FetchedSegments.java:316) |
| | 152 | |
| | 153 | |
| | 154 | 修改: |
| | 155 | |
| | 156 | nutch/src/plugin/summary-basic/src/java/org/apache/nutch/summary/basic/BasicSummarizer.java |
| | 157 | |
| | 158 | {{{ |
| | 159 | #!java |
| | 160 | ...(no. 181)... |
| | 161 | |
| | 162 | // fix begin |
| | 163 | Token t = tokens[j]; |
| | 164 | if (highlight.contains(t.term())) { |
| | 165 | excerpt.addToken(t.term()); |
| | 166 | if( offset < t.startOffset() ){ |
| | 167 | excerpt.add(new Fragment(text.substring(offset, t.startOffset()))); |
| | 168 | excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset()))); |
| | 169 | } |
| | 170 | if( offset >= t.startOffset() ){ |
| | 171 | if( offset < t.endOffset() ){ |
| | 172 | excerpt.add(new Highlight(text.substring(offset,t.endOffset()))); |
| | 173 | } |
| | 174 | } |
| | 175 | offset = Math.max(offset, t.endOffset()); |
| | 176 | endToken = Math.min(j + sumContext, tokens.length); |
| | 177 | } |
| | 178 | j++; |
| | 179 | } //while |
| | 180 | // fix over |
| | 181 | |
| | 182 | |
| | 183 | }}} |
| | 184 | |
| | 185 | {{{ |
| | 186 | #!java |
| | 187 | ...(no. 181)... |
| | 188 | |
| | 189 | if(j<tokens.length){ |
| | 190 | |
| | 191 | if(offset< tokens[j].endOffset()){ |
| | 192 | |
| | 193 | excerpt.add(new Fragment(text.substring(offset,tokens[j].endOffset()))); |
| | 194 | |
| | 195 | } |
| | 196 | |
| | 197 | } |
| | 198 | }}} |
| | 199 | |
| | 200 | |