18

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

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

4

2 に答える 2

36

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

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

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

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

于 2012-04-21T14:45:53.590 に答える
2

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

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

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

于 2017-06-05T12:17:30.643 に答える