2011-12-15 126 views
1

問題 我有一個公司名稱/股票代碼列表,並希望在某些文本中識別它們。自動識別文本中的公司名稱

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

在最簡單的實現,它可以遍歷所有的公司名稱,做一個精確匹配,但這種既慢(公司的大名單),並且不會對英語拼寫變異做的非常好。

可能的解決方案 一個我能想到這樣做的方式是向公司名稱/股票代號Lucene的/ Solr的索引列表,並使用全文作爲查詢。此查詢的結果將是與全文相匹配的文檔(公司)列表,以及相關性分數。可以定義閾值,只有高分的公司纔會被作爲標籤返回。可以定義自定義詞幹和公司名稱的同義詞列表以提高準確性。

當我在過去使用的Lucene/Solr的,在搜索索引文件包含比較長的文字(例如,文章的集合),並且查詢會相對較短。對於我現在要做的事情,情況是相反的。這會影響索引或相關性並使這種方法不可靠嗎?

問題

  1. 是我的解決方案來解決這個問題的好辦法?
  2. 我可以使用classifier並使用公司列表作爲培訓數據來實現此目的嗎?
  3. 任何其他建議如何有效和高準確度地做到這一點。
+0

不要爲了這類任務而拖延使用SOLR。在最近的3.5公告中,他們將SOLR描述爲「變身爲NoSQL數據存儲」。 – nickdos 2011-12-16 21:45:10

+1

Solr可以使用,但很多選擇。搜索'命名實體提取'。這是你要求的正式名稱 – 2011-12-17 00:46:04

回答

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)); 
} 

上面的例子是不完整的和未經考驗的 - 它只是給你一個總體思路。