2015-01-07 2 views
2

각 문자열에 약 5 개의 문자열이 들어있는 수백만 개의 배열이 있습니다. 나는 "to", "and", "or", "the", "the"와 같은 단어의 모든 기사와 같은 배열에서 모든 "쓰레기 단어"(더 나은 설명이 없음) a "등등.문자열이나 문자열 배열에서 과도한 쓰레기 단어를 제거하십시오.

예를 들어, 내 배열 한 다음 6 문자열이 있습니다

"14000" 
"Things" 
"to" 
"Be" 
"Happy" 
"About" 

내가 배열에서 "to"을 제거 할.

하나의 해결책은 할 수 있습니다 :

excess_words = ["to","and","or","the","a"] 
cleaned_array = dirty_array.reject {|term| excess_words.include? term} 

을하지만 수동으로 모든 여분의 단어를 입력하지 않아도 기대하고있다. 누구든지이 프로세스에서 도움이 될 Rails 함수 또는 도우미를 알고 있습니까? 아니면 이미 쓰여진 "쓰레기 단어"배열일까요?

답변

4

불용어 다루는 것은 쉽지만 문자열을 구성 요소 단어로 분리하기 전에 수행하는 것이 좋습니다. 당신이 그들을 이미 분할받을 경우

STOPWORDS = /\b(?:#{ %w[to and or the a].join('|') })\b/i 
# => /\b(?:to|and|or|the|a)\b/i 

clean_string = 'to into and sandbar or forest the thesis a algebra'.gsub(STOPWORDS, '') 
# => " into sandbar forest thesis algebra" 

clean_string.split 
# => ["into", "sandbar", "forest", "thesis", "algebra"] 

어떻게 당신이 그들을 어떻게 처리하나요 :

아주 간단한 정규 표현식 단어의 짧은 작품을 만들 수 있습니다 구축? join(' ') 배열을 다시 문자열로 변환 한 다음 위의 코드를 실행하여 배열을 다시 반환합니다.

incoming_array = [ 
    "14000", 
    "Things", 
    "to", 
    "Be", 
    "Happy", 
    "About", 
] 

STOPWORDS = /\b(?:#{ %w[to and or the a].join('|') })\b/i 
# => /\b(?:to|and|or|the|a)\b/i 

incoming_array = incoming_array.join(' ').gsub(STOPWORDS, '').split 
# => ["14000", "Things", "Be", "Happy", "About"] 

당신은 배열의 설정 작업을 사용하려고 할 수 있지만 당신이 중지 단어와 많이 느리게 실행되는 배열을 반복하기 위해 강제로 충돌 단어의 대소 문자 구분의 실행하겠습니다.

당신이 쉽게 문자열 수천 일치하도록 만드는 매우 강력한 패턴을 구축 할 수 방법에 대한 몇 가지 추가 팁이 두 가지 답변을 살펴보십시오 :

+0

흥미 롭다. 나는 정규 표현식이 더 빠를 것이라고 생각하지 않았다. 대신 그 방법을 사용하겠습니다. 감사! –

+0

regex는 간단한 문자열 조회에는 더 빠르지 않지만 여러 개의 문자열을 처리 할 때 갑자기 패턴이 유용합니다. 더 복잡한 상황에 대한 어려움이있을 수 있지만 이것은 매우 간단합니다. 필자는 Perl에서 이런 종류의 일을 많이하곤 했었습니다. 그리고 훨씬 더 빨랐습니다. –

+0

복잡한 패턴 생성 및 사용에 대한 답변에서 추가 된 링크를 참조하십시오. –

2

영어 의 목록 만 있으면됩니다. here 또는 '영어 중지 단어 목록'에 대해 google을 찾으십시오.

+0

Perfect! 나는 "stopwords"이라는 용어를 알지 못했다. 덕분에 많이 –

관련 문제