Java 自动识别文本中的公司名称
问题 我有一个公司名称/股票符号列表,希望在一些文本中识别它们Java 自动识别文本中的公司名称,java,solr,lucene,full-text-search,Java,Solr,Lucene,Full Text Search,问题 我有一个公司名称/股票符号列表,希望在一些文本中识别它们 public interface AutoTaggingService () { public List<Tags> getTags(String fullText); } 公共接口自动标记服务(){ 公共列表getTags(字符串全文); } 在最简单的实现中,可以循环所有公司名称并进行精确匹配,但这既慢(大量公司列表),也不能很好地防止拼写变化 可能的解决方案 我可以想到的一种方法是将公司名称/股票符号列
public interface AutoTaggingService () {
public List<Tags> getTags(String fullText);
}
公共接口自动标记服务(){
公共列表getTags(字符串全文);
}
在最简单的实现中,可以循环所有公司名称并进行精确匹配,但这既慢(大量公司列表),也不能很好地防止拼写变化
可能的解决方案
我可以想到的一种方法是将公司名称/股票符号列表提供给Lucene/Solr索引,并使用全文作为查询。此查询的结果将是一个与全文匹配的文档(公司)列表,并带有相关性分数。可以定义一个阈值,这样只有得分高的公司才会作为标签返回。可以定义自定义词干分析器和公司名称的同义词列表以提高准确性
怀疑
当我在过去使用Lucene/Solr时,搜索索引中的文档包含相对较长的文本(例如,文章集合),而查询将相对较短。就我现在想做的事情而言,情况正好相反。这会影响索引或相关性,并使此方法不可靠吗
问题
我最近遇到了一个类似的问题(有点),我最终遵循了KISS原则,并用实现了搜索部分。您没有提供关于您的股票代码(如果它们都是相同长度)或全文有多大的详细信息。。。但是你可以用这个方法。这里有一些伪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));
}
私有字符串[]代码;//e、 g.[ABC、DEF、GHI”]
列表标记列表;
int i=StringUtils.indexOfAny(全文,代码);
如果(i>=0){
//有一场比赛
字符串代码=全文。子字符串(i,i+3);
tagList.add(doLookup(code));//查找代码的util->Tags
//使用全文的子字符串剩余部分再次递归搜索
调用我自己(fullText.substring(i+3));
}
以上示例不完整且未经测试-只是给您一个大致的想法。谢谢您的回答。不幸的是,我正在尝试匹配可能出现在文本中的公司名称,即(苹果电脑、苹果公司或苹果公司)。好的,我错过了这个细节,抱歉。我同意您关于查看SOLR(或Lucene)的建议-我曾多次在小型作业中使用embedded SOLR。您可能能够利用查询突出显示输出来获取匹配的公司名称。我认为您可以使用debugQuery=true查看与给定文档匹配的术语列表,这可能有助于模糊匹配(假设您使用它)在最近的3.5发布中,他们将SOLR描述为“演变成NoSQL数据存储”“.Solr可以使用,但有很多选择。搜索“命名实体提取”。这是你要问的问题的正式名称谢谢@Geert-Jan。在你的建议出现后,我使用Lingpipe进行命名实体提取取得了一些成功,他们称之为“基于词典的近似分块”。。