python 코드 파이썬에서 정지 단어를 제거하는 빠른 방법




파이썬 숫자 길이 (3)

텍스트 문자열에서 불용어를 제거하려고합니다.

from nltk.corpus import stopwords
text = 'hello bye the the hi'
text = ' '.join([word for word in text.split() if word not in (stopwords.words('english'))])

속도가 중요하기 때문에 6mil 같은 문자열을 처리 중입니다. 내 코드를 프로파일 링 할 때, 가장 느린 부분은 위의 줄입니다. 더 좋은 방법은 없습니까? 나는 정규식의 re.sub 같은 것을 사용하는 생각 중이 야하지만 단어 집합에 대한 패턴을 작성하는 방법을 모르겠습니다. 다른 사람이 나에게 손을 댈 수 있고 다른 가능한 빠른 방법을 듣고 기쁘게 생각합니다.

참고 : 나는 stopwords.words('english')set() 과 함께 포장하는 방법을 제안했지만 아무런 차이가 없었다.

고맙습니다.


정규 표현식을 사용하여 일치하지 않는 단어를 모두 제거하십시오.

import re
pattern = re.compile(r'\b(' + r'|'.join(stopwords.words('english')) + r')\b\s*')
text = pattern.sub('', text)

이것은 아마도 자신을 반복 하는 것보다 빠를 것입니다. 특히 큰 입력 문자열의 경우.

텍스트의 마지막 단어가 이것에 의해 삭제되면 뒤 공백이 생길 수 있습니다. 나는 이것을 별도로 처리 할 것을 제안한다.


먼저, 각 문자열에 대한 정지 단어를 만듭니다. 그것을 한 번 만드십시오. 여기에 세트가 실제로 좋을 것입니다.

forbidden_words = set(stopwords.words('english'))

나중에, 내부 join 제거하십시오. 대신 발전기를 사용하십시오.

' '.join([x for x in ['a', 'b', 'c']])

다음으로 대체하다

' '.join(x for x in ['a', 'b', 'c'])

다음으로 처리 할 것은 배열을 반환하는 대신 .split() 값을 반환하는 것입니다. 나는 regex 이 여기에 대체 될 것이라고 믿는다. s.split() 이 실제로 왜 s.split() 는지 확인하십시오.

마지막으로, 이와 같은 작업을 병렬 처리합니다 (6m 문자열에서 정지 단어 제거). 그것은 완전히 다른 주제입니다.


아래에 표시된 것처럼 stopwords 객체를 캐싱 해보십시오. 함수를 호출 할 때마다 이것을 생성하는 것이 병목 현상 인 것 같습니다.

    from nltk.corpus import stopwords

    cachedStopWords = stopwords.words("english")

    def testFuncOld():
        text = 'hello bye the the hi'
        text = ' '.join([word for word in text.split() if word not in stopwords.words("english")])

    def testFuncNew():
        text = 'hello bye the the hi'
        text = ' '.join([word for word in text.split() if word not in cachedStopWords])

    if __name__ == "__main__":
        for i in xrange(10000):
            testFuncOld()
            testFuncNew()

프로파일 러를 통해 이것을 실행했습니다 : python -m cProfile -s cumulative test.py. 관련 라인은 아래에 게시됩니다.

nCalls 누적 시간

10000 7.723 words.py:7(testFuncOld)

10000 0.140 words.py:11(testFuncNew)

따라서 stopwords 인스턴스를 캐싱하면 ~ 70x의 속도 향상을 얻을 수 있습니다.





stop-words