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




파이썬 숫자 길이 (2)

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

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 문자열에서 정지 단어 제거). 그것은 완전히 다른 주제입니다.

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

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() 과 함께 포장하는 방법을 제안했지만 아무런 차이가 없었다.

고맙습니다.


아래에 표시된 것처럼 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