2012-04-21 5 views
14

Pracuję nad problemem klasyfikacji, aby klasyfikować recenzje produktów jako pozytywne, negatywne lub neutralne, jak w danych szkoleniowych za pomocą Lucene API.Lucene: wyjątek - analizator składni zapytań napotkał <EOF> po "jakimś słowie"

Używam obiektów ArrayList of Review - "reviewList", która przechowuje atrybuty każdej recenzji podczas przeszukiwania stron internetowych.

Atrybuty oceny, które zawierają "polaryzację" & "treść recenzji", są następnie indeksowane za pomocą indeksu. Następnie, w oparciu o obiekty indeksów, muszę sklasyfikować pozostałe obiekty przeglądu. Ale robiąc to, istnieje obiekt recenzji, dla którego analizator składni zapytań napotyka znak EOF w "treści recenzji", a zatem kończy.

spowodowanie błędu linia została odpowiednio skomentowane -

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; 

Mam analizowany tekst ręcznie, aby usunąć znaki, które są przyczyną błędu, oprócz sprawdzenia czy następny łańcuch jest pusty ... ale błąd nadal występuje.

Jest to błąd stosu ślad -

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 

Proszę mi pomóc rozwiązać ten problem ... zostały walić głową z tym przez kilka godzin teraz!

Odpowiedz

28

Należy uciec podwójny cudzysłów i innych znaków specjalnych poprzez

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

Jak QueryParser.escape Javadoc zasugerował,

Zwraca String gdzie te znaki, które QueryParser spodziewa się uciekł są uciekł poprzedzający "\".

+1

Dzięki za tonę! To było na miejscu ..: D – Reema

+1

Dla tych, którzy używają nowszych wydań (Lucene 4.6 dla mnie), funkcja 'escape' została przeniesiona do klasy' QueryParserUtil'. –

+1

Chcę zrobić to za pomocą biblioteki Solr zamiast biblioteki Lucene, jakiś pomysł? –

2

Rozpoznaję ten problem.

Zgłoszenie GROUP BY przed zgłoszeniem WHERE działa poprawnie w trybie Teradata, ale generuje błąd podczas analizy. Aby poprawić, przenieś deklarację GROUP BY po deklaracji WHERE.

Powiązane problemy