2014-12-05 2 views
0

문자열리스트가 있고 각 문자열 안에 정지 단어를 제거하고 싶습니다. 문제는, 불용어의 길이가 문자열보다 훨씬 길고 각 문자열을 불용어 목록과 비교하는 것을 반복하고 싶지 않다는 것입니다. 파이썬에서 이러한 여러 문자열을 동시에 사용할 수있는 방법이 있습니까?동시에 여러 개의 문자열을 처리하는 파이썬

lis = ['aka', 'this is a good day', 'a pretty dog'] 
stopwords = [] # pretty long list of words 
for phrase in lis: 
    phrase = phrase.split(' ') # get list of words 
    for word in phrase: 
     if stopwords.contain(word): 
      phrase.replace(word, '') 

이것은 현재 나의 방법입니다. 그러나 이것은 내가 목록에있는 모든 문구를 거쳐야한다는 것을 의미합니다. 이 구문을 한 번만 처리 할 수있는 방법이 있습니까?

감사합니다.

+0

"긴"기간은 얼마나됩니까? 그것이 100,000 개 이하의 요소라면, 나는 그것에 대해 걱정하지 않을 것이다. 특히'stopwords'를 집합으로 만들면'x in set' 검사가 매우 빠릅니다. – Kevin

+0

nested list comprehension statement는 좀 더 멋지 겠지만 (더 혼란 스럽습니까?) 이걸 보면 알 수있는 가장 좋은 방법입니다. – TehTris

+0

@Kevin 음, 100, 000이지만 길지는 않지만 여전히 원하지 않습니다. 여러 번 확인하는 것. – JudyJiang

답변

3

같은 생각이지만 몇 가지 개선 사항이 있습니다. 빠른 검색을 위해 list 개의 정지 단어를 set 개로 변환하십시오. 그런 다음 목록 목록에서 반복하여 반복 할 수 있습니다. 그런 다음 문구의 단어를 반복하고 정지 세트에 있지 않으면 문구를 유지 한 다음 join 문구를 함께 표시하십시오.

>>> lis = ['aka', 'this is a good day', 'a pretty dog'] 
>>> stopwords = ['a', 'dog'] 
>>> stop = set(stopwords) 
>>> [' '.join(j for j in i.split(' ') if j not in stop) for i in lis] 
['aka', 'this is good day', 'pretty'] 
1

각 구로 구성된 목록과 중지 단어 간의 차이를 계산할 수 있습니다.

>>> lis = ['aka', 'this is a good day', 'a pretty dog'] 
>>> stopwords = ['a', 'dog'] 

>>> stop = set(stopwords) 
>>> result = map(lambda phrase: " ".join(list(set(phrase.split(' ')) - stop)), lis) 
>>> print(result) 

['aka', 'this is good day', 'pretty'] 
+1

당신이 분할을 설정하기 때문에 그것은 실제로 구의 단어 순서를 엉망으로 만든다. 'lis = ['a b c d e f g ']'로 주어지면 '['c b e d g f ']'로 표시됩니다. – Dettorer

관련 문제