Lucene: exception - парсер запросов столкнулся с <EOF> после слова "some word"
Я работаю над проблемой классификации, чтобы классифицировать обзоры продуктов как положительные, отрицательные или нейтральные в соответствии с данными обучения с использованием API Lucene.
Я использую объекты 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
Пожалуйста, помогите мне решить эту проблему... уже несколько часов стучали головой об этом!
Ответы
Ответ 1
Вам следует избегать двойной кавычки и других специальных символов через
Query query = parser.parse(QueryParser.escape(parsedReview));
Как QueryParser.escape, предложенный Javadoc,
Возвращает строку, в которой те символы, которые QueryParser ожидает escaped экранируются предыдущим "\".
Ответ 2
Я понимаю эту проблему.
Объявление GROUP BY
перед объявлением WHERE
отлично работает в Teradata, но генерирует ошибку при разборе.
Чтобы исправить, переместите объявление GROUP BY
после объявления WHERE
.