Как извлечь семантическую родственность из текстового корпуса
Цель состоит в том, чтобы оценить семантическую взаимосвязь между терминами в большом текстовом корпусе, например, "полиция" и "преступление" должны иметь более сильную семантическую взаимосвязь, чем "полиция" и "гора", так как они имеют тенденцию сосуществовать в одном и том же контексте.
Простейший подход, о котором я читал, состоит в извлечении информации IF-IDF из корпуса.
Многие люди используют скрытый семантический анализ, чтобы найти семантические корреляции.
Я наткнулся на поисковую систему Lucene: http://lucene.apache.org/
Как вы думаете, это подходит для извлечения IF-IDF?
Что бы вы порекомендовали сделать, что я пытаюсь сделать, как с точки зрения техники, так и с точки зрения программного обеспечения (с предпочтением Java)?
Заранее спасибо!
Mulone
2 ответа
Это очень легко, если у вас есть индекс Lucene. Например, чтобы получить корреляцию, вы можете использовать простую формулу count(term1 и term2)/ count(term1)* count(term2). Где количество хитов из результатов поиска. Более того, вы можете легко вычислить другие показатели семнтики, такие как chi^2, информационный прирост. Все, что вам нужно, это получить формулу и преобразовать ее в условия count
от Query
Да, Lucene получает данные TF-IDF. Алгоритм Carrot^2 является примером программы семантического извлечения, построенной на Lucene. Я упоминаю об этом, поскольку в качестве первого шага они создают корреляционную матрицу. Конечно, вы, вероятно, можете легко построить эту матрицу самостоятельно.
Если вы имеете дело с кучей данных, вы можете использовать Mahout для сложных частей линейной алгебры.