Я ищу решение для извлечения списка концепций, о которых идет речь в текстовом (или html) документе. Я бы хотел, чтобы концепции были темами викиданных (или freebase или DBpedia).
Например, «Bad — это песня Микаэля Джексона» должен вернуть Майкла Джексона (исполнитель, викиданные Q2831) и Bad (песня, викиданные Q275422). Как показывает этот пример, система должна быть устойчива к орфографическим ошибкам (Микаэль) и двусмысленности (Плохо).
В идеале система должна работать на нескольких языках, она должна работать как с короткими, так и с длинными текстами, а когда она не уверена, она должна возвращать несколько тем (например, Плохая песня + Плохой альбом). Кроме того, в идеале он должен быть с открытым исходным кодом и иметь API Python.
Да, это звучит как список для Деда Мороза. Любые идеи?
Изменить
Я проверил несколько решений, но пока не нашел серебряной пули.
- NLTK анализирует текст и извлекает «именованные сущности» (AFAIU, часть предложения, относящаяся к имени), но возвращает не темы Викиданных, а только обычный текст. Это означает, что он, скорее всего, не поймет, что «Я застрелил шерифа» — это название песни Боба Марли, а вместо этого воспримет это как предложение.
- OpenNLP делает примерно то же самое.
- В Викиданных есть поисковый API, но это всего лишь один термин за раз, и он не поддерживает устранение неоднозначности.
- Есть несколько коммерческих сервисов (OpenCalais, AlchemyAPI, CogitoAPI...), но ни один из них не блещет, ИМХО.