【问题标题】:Automatically recognize company names in text自动识别文本中的公司名称
【发布时间】:2011-12-15 23:18:39
【问题描述】:

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

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

在最简单的实现中,可以遍历所有公司名称并进行精确匹配,但这既慢(公司列表很大),也不能很好地应对拼写变化。

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

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

问题

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

【问题讨论】:

  • 不要推迟使用 SOLR 来完成此类任务。在最近的 3.5 公告中,他们将 SOLR 描述为“转变为 NoSQL 数据存储”。
  • 可以使用 Solr,但有很多选择。搜索“命名实体提取”。这就是你要问的正式名称
  • 感谢@Geert-Jan。根据您的建议,我使用 Lingpipe 进行命名实体提取取得了一些成功
  • 确实是“基于字典的近似分块”,正如他们所说的那样......

标签: java solr lucene full-text-search


【解决方案1】:

我最近遇到了类似的问题(有点),我最终遵循了 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));
}

上面的例子是不完整且未经测试的——它只是为了给你一个大致的想法。

【讨论】:

  • 感谢您的回答。不幸的是,我正在尝试匹配可能出现在文本中的公司名称,即(Apple Computers、Apple Inc. 或 Apple Incorporated)。
  • 好的,我错过了那个细节,抱歉。我同意您关于查看 SOLR(或 Lucene)的建议——我曾多次使用嵌入式 SOLR 来完成小型工作。您也许可以利用查询突出显示输出来获取匹配的公司名称。我认为您可以使用 debugQuery=true 查看与给定文档匹配的术语列表,这可能有助于模糊匹配(假设您使用它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多