Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动识别文本中的公司名称_Java_Solr_Lucene_Full Text Search - Fatal编程技术网

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进行命名实体提取取得了一些成功,他们称之为“基于词典的近似分块”。。