2012-09-13 375 views
1

我需要實現一個過程,其中上傳大約50/150kb的文本文件,並與大量短語(〜10k)進行匹配。匹配大量的字符串/短語

我需要知道哪些短語具體匹配。

一個短語可能是「等等等等」或只是「等等」 - 這意味着我需要考慮字邊界,因爲我不希望包含中綴匹配。

我第一次嘗試是剛剛創建的樣子@"\b{0}\b"正則表達式的大量預編譯的列表(如10K的短語是不變的 - 我可以緩存&再利用對多個文檔此相同的列表);

在我全新的&非常快的電腦 - 這匹配需要10秒+,我希望能夠減少很多。

任何意見我如何能夠實現這一點將不勝感激!

乾杯,戴夫

+0

在SQL服務器中實現自己的二叉樹或平衡樹(頁),如索引 – opewix

+0

@JesseJames對不起 - 您將不得不向我多解釋一下這一個! –

+0

這是一個很好的例子,甚至準備使用http://www.codeproject.com/Articles/18976/A-simple-Binary-Search-Tree-written-in-C – opewix

回答

1

只要您不介意限制可能的單詞數量,可以使用Lucene.NET和Shingle Filter

public class MyAnalyzer : Analyzer 
{ 
    public override TokenStream TokenStream(string fieldName, TextReader reader) 
    {  
     return new ShingleFilter(new LowerCaseFilter(new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_29, reader)), 6); 
    } 
} 

您可以使用此實用程序方法運行分析儀。

public static IEnumerable<string> GetTerms(Analyzer analyzer, string keywords) 
{ 
    var tokenStream = analyzer.TokenStream("content", new StringReader(keywords)); 
    var termAttribute = tokenStream.AddAttribute<ITermAttribute>(); 

    var terms = new HashSet<string>(); 

    while (tokenStream.IncrementToken()) 
    { 
     var term = termAttribute.Term; 
     if (!terms.Contains(term)) 
     { 
      terms.Add(term); 
     } 
    } 

    return terms; 
} 

一旦檢索到所有條件,請與您的單詞列表相交。

var matchingShingles = GetTerms(new MyAnalyzer(), "Here's my stuff I want to match"); 

var matchingPhrases = phrasesToMatch.Intersect(matchingShingles, StringComparer.OrdinalIgnoreCase); 

我想你會發現這種方法比正則表達式匹配和尊重字邊界快得多。

+0

這個工作非常好 - 謝謝! –

1

您可以使用Lucene.Net

這將創建一個文本的inedx,這樣就可以防止它使真正快速查詢。這是一個「全文索引」。

這篇文章解釋了它的全部:

Lucene.net

該庫最初用Java編寫的,(Lucene的),但有一個端口到.NET(lucene.net)。

您在選擇stemmer時必須格外小心。一個詞幹提取器取一個詞的「根」,以便幾個相似的詞可以匹配(即書和書會匹配)。如果你需要完全匹配,那麼你應該採取(或實施)一個詞幹,它返回原來的單詞沒有改變。

必須使用相同的詞幹分析器來創建索引和搜索結果。

您還必須查看語法,因爲它太強大並且允許部分匹配,完全匹配等等。你可以看看this blog