自动识别文本中的公司名称

时间:2011-12-15 23:18:39

标签: java solr lucene full-text-search

问题 我有一个公司名称/股票代码列表,并希望在某些文本中识别它们。

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

在最简单的实现中,可以遍历所有公司名称并进行完全匹配,但这很慢(大型公司列表)并且对拼写变化不会很好。

可能的解决方案 我可以想到这样做的一种方法是将公司名称/股票代码列表提供给Lucene / Solr索引,并使用fullText作为查询。此查询的结果将是与fullText匹配的文档(公司)列表,以及相关性分数。可以定义阈值,因此只有具有高分的公司才会作为标签返回。可以定义自定义词干分析器和公司名称的同义词列表,以提高准确性。

质疑 当我过去使用Lucene / Solr时,搜索索引中的文档包含相对较长的文本(例如,文章集合),并且查询将相对较短。对于我现在要做的事情,情况正好相反。这会影响索引或相关性并使此方法不可靠吗?

问题

  1. 我的解决方案是解决此问题的好方法吗?
  2. 我可以使用classifier并使用公司列表作为培训数据来实现此目标吗?
  3. 关于如何有效且高精度地完成此任务的任何其他建议。

1 个答案:

答案 0 :(得分:3)

我最近遇到了类似的问题(最后),我最终遵循了KISS原则并使用Apache StringUtils library实现了搜索部分。您没有提供有关您的股票代码(如果它们的长度都相同)或全文文本有多大的详细信息......但您可以使用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));
}

以上示例不完整且未经测试 - 只是为了给您一个大致的想法。