2013-12-10 2 views
0

문자열에서 제거해야하는 중지 단어 목록이 있습니다.문자열에서 문자열 목록 제거 - C# .NET

List<string> stopwordsList = stopwords.getStopWordList(); 
string text = PDF.getText(); 
foreach (string stopword in stopwordsList) 
{ 
    text = text.Replace(stopword, ""); 
} 
PDF.setText(text); 

디버그 것 말이다 나는 stopwordsList이 제대로되고 볼 수 있지만, text.Replace()는 아무런 효과가없는 것처럼 보인다.

내가 뭘 잘못하고 있니?

편집 : 참고 text = text.Replace()이 아닌 text.Replace()을 독자적으로 시도했습니다. 둘 다 일하지 않아.

+0

무엇의 gettext 함수 반환합니까? – Max

+8

문제를 재현 할 수 없습니다. – ken2k

+0

디버깅 해 보았고 foreach 루프의 각 반복에 어떤 스톱 워드가 있는지 확인 했습니까? 나는 그 코드가 다르게 보이기 때문에 그것들이 틀렸다는 것을 확신한다. – Tobberoth

답변

2

비록 내가 당신의 코드에 문제가 있다고 생각하지 않지만, 나는 이렇게 할 것입니다. 케이스는하지만 중요한 경우

string someText = "this is some text just some dummy text Just text"; 
List<string> stopwordsList = new List<string>() { "some", "just", "text" };  
someText = string.Join(" ", someText.Split().Where(w => !stopwordsList.Contains(w, StringComparer.InvariantCultureIgnoreCase))); 

당신은 StringComparer.InvariantCultureIgnoreCase 부분을 무시할 수 있습니다. 당신이 그 기능을 대체 알아야

참고 나는 또한 오히려 텍스트보다, 자신에 text.Replace()를 시도 = text.Replace()는 당신이 원하는 경우에 처리되어야 문자열을 반환 갱신 된 캐릭터 라인 그래서 당신은 근본적으로 지금 당장 그것을하고 있습니다. 즉 text = text.Replace()

+0

왜 downvote? –

+0

같은 것을 궁금해합니다. @huMptyduMpty – Ehsan

+1

OP의 다른 입력이 없으면 대/소문자 구분이 범인이라고 가정합니다. 그런데 스톱 워드 목록이 상당히 큰 경우 List 대신 Hashset 을 사용할 것입니다. –

1

하나의 문제가 있습니다. 이전의 모든 해결책은 단어 경계를 고려하지 않았습니다. 예를 들어 'hell'이라는 단어는 나쁜 단어 일 수 있지만 'hello'라는 단어는 완벽하게 유효합니다. 또한 교체는 완전한 단어로만 수행해야합니다. 그렇지 않으면 이상한 결과가 발생할 수 있습니다.

다음 계정으로 단어 경계 소요 코드는 다음과 같습니다

var text = "Hello world, this is a great test!"; 
var badWords = new List<string>() 
{ 
    "Hello", 
    "great" 
}; 

var wordMatches = Regex.Matches(text, "\\w+") 
    .Cast<Match>() 
    .OrderByDescending(m => m.Index); 

foreach (var m in wordMatches) 
    if (badWords.Contains(m.Value)) 
     text = text.Remove(m.Index, m.Length); 

Debug.WriteLine(text); 
+0

어쨌든이 작품은 더 좋네;) : text = text.Remove (m.Index, m.Length + 1); – Dragouf

+1

항상 그렇지는 않습니다. 제거 할 단어 다음에 [공백]이 있다고 가정하고 있지만 문장에 완전한 의미를 부여하는 문장 부호 (마침표, 물음표, 느낌표 등) 일 수 있습니다. 원본 답변과 같이 문자열을 처리하면 중복 된 공백을 제거하는 것이 현명합니다. 그 일을하는 방법에 대해 많은 샘플이 있습니다. 하나는 여기에 있습니다 : [링크] (http://stackoverflow.com/questions/206717/how-do-i-replace-multiple-spaces-with-a-single-space-in-c) –

+0

당신 말이 맞아. – Dragouf