2012-09-13 4 views
1

대략 50/150kb의 텍스트 파일이 업로드되고 많은 문구 (~ 10k)와 대조되는 프로세스를 구현해야합니다.많은 수의 문자열/문구 맞추기

구체적으로 일치하는 문구를 알아야합니다.

어구는 "ㅋ blah blah"또는 "blah"일 수 있습니다. 즉, 중도 삽입을 포함하고 싶지 않기 때문에 단어 경계를 고려해야합니다.

내 첫 번째 시도는 @"\b{0}\b"과 같이 정규 표현식의 큰 미리 컴파일 된 목록을 작성하는 것이 었습니다 (문구가 상수이기 때문에 여러 문서에 대해 동일한 목록을 &에 다시 캐시 할 수 있음).

내 새롭게 & 매우 빠른 PC에서 -이 일치는 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

당신이 그것에 대해 정말 빠른 쿼리를 할 수 있도록 당신은이 텍스트의 inedx을 생성합니다 Lucene.Net

를 사용할 수 있습니다. 이것은 "전체 텍스트 색인"입니다. 이 라이브러리는 원래 자바로 작성

Lucene.net

(루씬)하지만 .NET (lucene.net)에 포트가있다 :

이 문서는 모든에 대해 무엇을 설명합니다.

줄기를 선택할 때 특히주의해야합니다. 줄을 긋는 사람은 단어의 "뿌리"를 사용하여 여러 개의 유사한 단어가 일치 할 수 있습니다 (예 : 책과 책이 일치 함). 정확한 일치가 필요한 경우 변경하지 않고 원래 단어를 반환하는 형태소 분석기를 가져와야합니다 (또는 구현해야합니다).

색인 생성 및 결과 검색에 동일한 스 트리머를 사용해야합니다.

너무 강력하고 부분 일치, 완전 일치 등을 허용하기 때문에 구문을 살펴 봐야합니다.

this blog을 볼 수도 있습니다.