web-dev-qa-db-ja.com

Lucene:例外-クエリパーサーが「someWord」の後に<EOF>を検出しました

Lucene APIを使用したトレーニングデータに従って、製品レビューをポジティブ、ネガティブ、またはニュートラルとして分類するための分類問題に取り組んでいます。

レビューオブジェクトのArrayList(Webページのクロール中に各レビューの属性を格納する「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;

次の文字列がnullかどうかを確認する以外に、テキストを手動で解析してエラーの原因となっている文字を削除しましたが、エラーは解決しません。

これはエラースタックトレースです-

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

この問題を解決するのを手伝ってください...これで何時間も頭を叩いています!

18
Reema

二重引用符やその他の特殊文字は、

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

QueryParser.escape Javadocが提案したように、

QueryParserがエスケープすることを期待する文字が、先行する「\」によってエスケープされる文字列を返します。

33
Pau Kiat Wee

私はこの問題を認識しています。

WHERE宣言の前にGROUP BYを宣言すると、Teradataでは正常に機能しますが、解析中にエラーがスローされます。

修正するには、WHERE宣言の後にGROUP BY宣言を移動します。

2
Rishabh Sharma