Автоматически распознавать названия компаний в тексте - PullRequest
1 голос
/ 16 декабря 2011

Проблема У меня есть список названий компаний / биржевых символов, и я хотел бы распознать их в некотором тексте.

public interface AutoTaggingService () {
    public List<Tags> getTags(String fullText);
}

В простейшем варианте реализации можно циклически перебирать все названия компаний и делать точное совпадение, но это медленный процесс (большой список компаний) и не очень хорошо справляется с изменением орфографии.

Возможное решение Один из способов, которым я могу думать об этом, состоит в том, чтобы передать список названий компаний / биржевых символов в индекс Lucene / Solr и использовать полный текст в качестве запроса.Результатом этого запроса будет список документов (компании), который соответствует полному тексту, с оценками релевантности.Пороговое значение может быть определено так, что только компании с высоким баллом будут возвращены в качестве тегов.Для повышения точности можно определить пользовательский составной список и список синонимов названий компаний.

Сомнения Когда в прошлом я использовал Lucene / Solr, документ в поисковом индексе содержал относительно длинныйтекст (например, сборники статей), а запрос будет относительно коротким.То, что я сейчас хочу сделать, ситуация обратная.Повлияет ли это на индекс или релевантность и сделает этот метод ненадежным?

Вопрос

  1. Являются ли мои решения хорошим способом решения этой проблемы?
  2. Могу ли я использовать классификатор и использовать список компаний в качестве обучающих данных для достижения этой цели?
  3. Любые другие предложения о том, как это можно сделать эффективно и с высокой точностью.

1 Ответ

3 голосов
/ 16 декабря 2011

У меня недавно была похожая проблема (вроде), и я в конечном итоге следовал принципу KISS и реализовал часть поиска с библиотекой Apache StringUtils . Вы не предоставили подробной информации ни о ваших биржевых кодах (если они все одинаковой длины), ни о том, насколько велик полнотекстовый текст ... Но вы могли бы использовать indexOfAny (CharSequence str, CharSequence ... searchStrs ) метод. Вот немного псевдо-Java ...

private String[] codes; // e.g. ["ABC",DEF","GHI"]
List<Tags> tagList;
int i = StringUtils.indexOfAny(fulltext, codes);

if (i >= 0) {
    // there's a match
    String code = fullText.substring(i, i + 3);
    tagList.add(doLookup(code)); // lookup util for code -> Tags
    // recursively search again with the substring remainder of the fullText
    callMyself(fullText.substring(i + 3));
}

Приведенный выше пример неполон и непроверен - просто для того, чтобы дать вам общее представление.

...