| 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 | |