2012-04-21 24 views
14

我正在處理分類問題,根據使用Lucene API的培訓數據將產品評論歸類爲正面,負面或中性。Lucene:異常 - 遇到查詢解析器<EOF>「某個單詞」後

我正在使用ReviewList對象的ArrayList - 「reviewList」,它在檢索網頁時存儲每個評論的屬性。

然後使用索引器對包括「極性」&「評論內容」的評論屬性編索引。此後,根據索引對象,我需要對剩餘的審閱對象進行分類。但是,這樣做時,查詢解析器在「審閱內容」中遇到EOF字符並因此終止。

線造成的錯誤進行了相應的評論 -

IndexReader reader = IndexReader.open(FSDirectory.open(new File("index"))); 
    IndexSearcher searcher = new IndexSearcher(reader); 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31); 
    QueryParser parser = new QueryParser(Version.LUCENE_31, "Review", analyzer); 

    int length = Crawler.reviewList.size(); 
    for (int i = 200; i < length; i++) { 
     String true_class; 
     double r_stars = Crawler.reviewList.get(i).getStars(); 

     if (r_stars < 2.0) { 
      true_class = "-1"; 
     } else if (r_stars > 3.0) { 
      true_class = "1"; 
     } else { 
      true_class = "0"; 
     } 

     String[] reviewTokens = Crawler.reviewList.get(i).getReview().split(" "); 
     String parsedReview = ""; 

     int j; 

     for (j = 0; j < reviewTokens.length; j++) { 
      if (reviewTokens[j] != null) { 
       if (!((reviewTokens[j].contains("-")) || (reviewTokens[j].contains("!")))) { 
        parsedReview += reviewTokens[j] + " "; 
       } 
      } else { 
       break; 
      } 
     } 

     Query query = parser.parse(parsedReview); // CAUSING ERROR!! 

     TopScoreDocCollector results = TopScoreDocCollector.create(5, true); 
     searcher.search(query, results); 
     ScoreDoc[] hits = results.topDocs().scoreDocs; 

我解析手動文本刪除導致錯誤,除了檢查,如果接下來的字符串是空的人物......但錯誤仍然存​​在。

這是錯誤的堆棧跟蹤 -

Exception in thread "main" org.apache.lucene.queryParser.ParseException: Cannot parse 'I made the choice ... be all "thumbs ': Lexical error at line 1, column 938. Encountered: <EOF> after : "\"thumbs " 
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:216) 
at Sentiment_Analysis.Classification.classify(Classification.java:58) 
at Sentiment_Analysis.Main.main(Main.java:17) 
Caused by: org.apache.lucene.queryParser.TokenMgrError: Lexical error at line 1, column 938. Encountered: <EOF> after : "\"thumbs " 
at org.apache.lucene.queryParser.QueryParserTokenManager.getNextToken(QueryParserTokenManager.java:1229) 
at org.apache.lucene.queryParser.QueryParser.jj_scan_token(QueryParser.java:1709) 
at org.apache.lucene.queryParser.QueryParser.jj_3R_2(QueryParser.java:1598) 
at org.apache.lucene.queryParser.QueryParser.jj_3_1(QueryParser.java:1605) 
at org.apache.lucene.queryParser.QueryParser.jj_2_1(QueryParser.java:1585) 
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1280) 
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1266) 
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1313) 
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1266) 
at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1226) 
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206) 
... 2 more 
Java Result: 1 

請幫我解決這個問題......已經被敲打,現在我的頭,這幾個小時!

回答

28

你應該逃脫通過

Query query = parser.parse(QueryParser.escape(parsedReview)); 

由於QueryParser.escape的Javadoc建議雙引號和其他特殊字符,

返回一個字符串,其中該QueryParser的預計這些字符是 逃脫被轉義前面的'\'。

+1

謝謝!它是現貨..:D – Reema 2012-04-21 16:01:34

+1

對於那些使用更新版本的人(Lucene 4.6對我來說),'escape'函數已經被移動到'QueryParserUtil'類。 – 2014-01-24 11:32:58

+1

我想使用solr庫而不是lucene庫,任何想法? – 2015-04-02 06:00:42

2

我認識到這個問題。

WHERE聲明在Teradata中正常工作之前聲明GROUP BY,但在解析時拋出錯誤。

要修復,請在WHERE聲明後移動GROUP BY聲明。