Система запросов QA на корпусе
У нас есть вопрос - ответьте корпус, как показано ниже
Q: Why did Lincoln issue the Emancipation Proclamation?
A: The goal was to weaken the rebellion, which was led and controlled by slave owners.
Q: Who is most noted for his contributions to the theory of molarity and molecular weight?
A: Amedeo Avogadro
Q: When did he drop John from his name?
A: upon graduating from college
Q: What do beetles eat?
A: Some are generalists, eating both plants and animals. Other beetles are highly specialised in their diet.
Рассматривайте вопрос как запросы, а ответы как документы.
Мы должны построить систему, которая для данного запроса (семантически похожая на один из вопросов в корпусе вопросов) могла бы получить правильный документ (ответы в корпусе ответов)
Может кто-нибудь предложить какой-либо алгоритм или хороший способ приступить к его созданию.
2 ответа
Ваш вопрос слишком широк, и задача, которую вы пытаетесь сделать, является сложной. Тем не менее, я предлагаю вам прочитать об основанном на ИК факторе. В этом документе есть ссылки на многие современные методы. Чтение этого документа должно привести вас к нескольким идеям.
Обратите внимание, что вам нужно следовать другому подходу для ИК-анализа Factoid QA и QA. Сначала определите, какой тип системы обеспечения качества вы хотите построить.
Наконец, я считаю, что простой метод сопоставления документов для обеспечения качества будет недостаточно. Но вы можете попробовать простой подход, используя Lucene
@Debasis предложил и посмотреть, хорошо ли это.
Рассмотрите вопрос и его ответ (при условии, что есть только один) как один единственный документ в Lucene. Lucene поддерживает вид полей документов; поэтому при создании документа поставьте вопрос в поле поиска. После того, как вы получите вопросы с самым высоким рейтингом по заданному вопросу, используйте метод get класса Document для возврата ответов.
Скелет кода (заполните это самостоятельно):
//Index
IndexWriterConfig iwcfg = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(...);
....
Document doc = new Document();
doc.add(new Field("FIELD_QUESTION", questionBody, Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("FIELD_ANSWER", answerBody, Field.Store.YES, Field.Index.ANALYZED));
...
...
// Search
IndexReader reader = new IndexReader(..);
IndexSearcher searcher = new IndexSearcher(reader);
...
...
QueryParser parser = new QueryParser("FIELD_QUESTION", new StandardAnalyzer());
Query q = parser.parse(queryQuestion);
...
...
TopDocs topDocs = searcher.search(q, 10); // top-10 retrieved
// Accumulate the answers from the retrieved questions which
// are similar to the query (new) question.
StringBuffer buff = new StringBuffer();
for (ScoreDoc sd : topDocs.scoreDocs) {
Document retrievedDoc = reader.document(sd.doc);
buff.append(retrievedDoc.get("FIELD_ANSWER")).append("\n");
}
System.out.println("Generated answer: " + buff.toString());