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
この問題を解決するのを手伝ってください...これで何時間も頭を叩いています!
二重引用符やその他の特殊文字は、
Query query = parser.parse(QueryParser.escape(parsedReview));
QueryParser.escape Javadocが提案したように、
QueryParserがエスケープすることを期待する文字が、先行する「\」によってエスケープされる文字列を返します。
私はこの問題を認識しています。
WHERE
宣言の前にGROUP BY
を宣言すると、Teradataでは正常に機能しますが、解析中にエラーがスローされます。
修正するには、WHERE
宣言の後にGROUP BY
宣言を移動します。