2010-04-22 3 views
5

의 내가 그때이키워드 문자열 내부에 존재하는 경우 알고리즘은 볼 수

{ "최고의 스포츠 테니스" "올림픽", "테니스", "테니스 규칙"} 배열에서 일련의 키워드를 가지고 있다고 가정 해 봅시다 큰 목록 (한 번에 최대 50 개)의 문자열 (또는 실제로는 트윗)이므로 최대 140 자입니다.

각 문자열을보고 거기에 어떤 키워드가 있는지보고 싶습니다. 키워드가 "sports tennis best"와 같은 여러 단어로 구성된 경우 단어가 문자열에 함께있을 필요는 없지만 모두 표시해야합니다.

효율적으로 처리하는 알고리즘을 찾는 데 문제가 있습니다.

의견이 있으십니까? 감사!

편집 : {1 : "올림픽", 2 : "스포츠 테니스", 3 : "테니스", "4 : 테니스 규칙"}과 같이 각 키워드의 ID가 더 잘 설명됩니다.

문자열/트윗 목록을 확인하고 어떤 키워드 그룹과 일치하는지 확인하고 싶습니다. 결과물은 키워드 # 4에 속해야합니다. (여러 경기가있을 수 있으므로 키워드 2와 일치하는 항목은 모두 테니스가 포함되어 있으므로 3과 일치합니다.)

키워드에 단어가 여러 개인 경우 (예 : "스포츠 테니스"는 함께 나타나지 않아도되지만 모두 나타나야합니다. 예 : 이것은 정확하게 일치합니다 : "나는 방금 테니스를 치고, 나는 스포츠를 사랑합니다."...이 문자열에는 "sports tennis best"가 포함되어 있으므로 keywordID (이 예에서는 2)와 연결되어 관련이 있습니다.

편집 2 : 대소 문자를 구분하지 않습니다.

+1

원하는 출력은 무엇입니까? 키워드가 포함 된 문자열 목록? 또는 각 키워드가 문자열에 몇 번이나 있는지 계산합니까? 또는 다른 것? –

+0

하위 문자열 또는 전체 단어가 일치합니까? 대소 문자를 구분합니까? – RedFilter

+0

위의 몇 가지 설명을 추가했습니다. 전체 단어 일치 ...하지만 공백으로 구분 된 키워드는 논리적 AND와 같습니다. 그래서 "스포츠 테니스 최고"는 "스포츠"AND "테니스"AND "최고"라는 키워드와 일치해야합니다. – rksprst

답변

6
에서 C#에서 그리고 당신의 여러 단어 당 : 끝 끝

를 들어 종료를 들어 경우 MatchingString은 경기

편집을 모두 포함

IEnumerable<string> tweets, keywords; 

var x = tweets.Select(t => new 
          { 
           Tweet = t, 
           Keywords = keywords.Where(k => k.Split(' ') 
                   .All(t.Contains)) 
                .ToArray() 
          }); 
0

모든 키워드를 문자열 목록에 넣은 다음 데이터 목록 (짹짹, 무엇이든)을 다른 문자열 목록으로 옮기는 것이 좋습니다.

이 같은

어떻게 좀 :

Dim matchingStrings As Dictonary(String, String); 
For Each stringToSearch As String In tweetList 
    For Each keyword As String In keywordList 
     If stringToSearch.Contains(keyword) 
     matchingString.Add(stringToSearch, keyword); 

휴식; 키워드 목록

Dictionary<string, string> matchingString = New Dictionary<string, string>; 
foreach (String stringToSearch In tweetList){ 
    foreach (String keyword In keywordList){ 
     If(stringToSearch.Contains(keyword){ 
      matchingString.Add(stringToSearch, keyword); 
      break; 
} 
else if{ 
    List<string> split = keyword.Split(" ") 
    foreach(String sKeyword In split){ 
      If(stringToSearch.Contains(keyword){ 
      matchingString.Add(stringToSearch, keyword); 
      break; 
      } 
    } 

} 

} }

+0

하지만 여러 단어가 포함 된 키워드는 어떻게됩니까? 이것은 일치하지 않을 것입니다. – rksprst

+0

Q는 태그가 붙어 있습니다. C#이 아닌 vb –

+0

키워드와 일치하는 키워드를 찾으려면 키워드와 일치해야합니다. 나는 이것을 C#에서 몇 초 만에 다시 작성하려고한다. – msarchet

0

와우.

foreach (var s in strings) 
    { 
     foreach (var keywordList in keywordSet) 
     { 
      if (s.ContainsAll(keywordList)) 
      { 
       // hit! 
      } 
     } 
    } 

... 

private bool ContainsAll(this string s, string keywordList) 
{  
    foreach (var singleWord in keywordList.Split(' ')) 
    { 
     if (!s.Contains(singleWord)) return false; 
    } 
    return true; 
} 
1

여러 패턴 몇몇 예 (a 트라이 사용) algorithm of Aho-Corasick로서 알고리즘 또는 Wu and Manber 중 하나를 사용하여 매우 효율적으로 검색 할 수있다.

성능이 중요한 경우 그 중 하나를 선택하는 것이 좋습니다. 여러 문자열을 검색하려면 50 개의 문자열을 모두 하나의 큰 문자열로 연결하여 개별 문자열의 시작 위치에 대한 책을 보관하는 것이 가장 효율적일 수 있습니다.

1

어쩌면 이렇게 할 수 있을까요?

0

문자열을 사전 처리하여 검색 효과를 높일 수있는 방법이 있지만 그 짧은 문자열에 대한 오버 헤드가 더 많은 것으로 생각됩니다. 그렇게 많은 데이터가 아니므로 문자열을 반복하면됩니다.

foreach (string tweet in tweets) { 
    foreach (string keywords in theArray) {[ 
    string[] keyword = keywords.Split(' '); 
    bool found = true; 
    foreach (string word in keyword) { 
     if (tweet.indexOf(word) == -1) { 
     found = false; 
     break; 
     } 
    } 
    if (found) { 
     // all words exist in the tweet 
    } 
    } 
} 
관련 문제