问题 我有一个公司名称/股票代码列表,并希望在某些文本中识别它们。
public interface AutoTaggingService () {
public List<Tags> getTags(String fullText);
}
在最简单的实现中,可以遍历所有公司名称并进行完全匹配,但这很慢(大型公司列表)并且对拼写变化不会很好。
可能的解决方案 我可以想到这样做的一种方法是将公司名称/股票代码列表提供给Lucene / Solr索引,并使用fullText作为查询。此查询的结果将是与fullText匹配的文档(公司)列表,以及相关性分数。可以定义阈值,因此只有具有高分的公司才会作为标签返回。可以定义自定义词干分析器和公司名称的同义词列表,以提高准确性。
质疑 当我过去使用Lucene / Solr时,搜索索引中的文档包含相对较长的文本(例如,文章集合),并且查询将相对较短。对于我现在要做的事情,情况正好相反。这会影响索引或相关性并使此方法不可靠吗?
问题
答案 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));
}
以上示例不完整且未经测试 - 只是为了给您一个大致的想法。