대규모 텍스트 분류


18

텍스트 데이터를 분류하려고합니다. 나는 300 classes수업 당 200 개의 교육 문서를 가지고 60000 documents in total있으며 이것은 매우 높은 차원의 데이터 를 초래할 가능성 이있다 (우리는 1 백만 개 이상의 차원을 보고있을 것이다 ).

파이프 라인에서 다음 단계를 수행하고 싶습니다 (내 요구 사항에 대한 이해를 돕기 위해).

  1. 각 문서를 피처 벡터 ( tf-idf또는 vector space model) 로 변환
  2. Feature selection( Mutual Information바람직하게 또는 다른 표준을 기반으로 함)
  3. 분류 훈련 ( SVM, Naive Bayes, Logistic Regression또는 Random Forest)
  4. 훈련 된 분류기 모델을 기반으로 보이지 않는 데이터를 예측합니다.

문제는 이러한 고차원 데이터를 처리하기 위해 어떤 도구 / 프레임 워크를 사용해야합니까? 나는 평범한 용의자 (R, WEKA ...)를 알고 있지만 내 지식이가는 한 (내가 틀릴 수도 있음) 아마도 아무도이 큰 데이터를 처리 할 수 ​​없습니다. 내가 볼 수있는 선반 도구 이외의 다른 도구가 있습니까?

병렬화 해야하는 경우 Apache Mahout을 보고해야 합니까? 아직 필요한 기능을 제공하지 못하는 것 같습니다.

미리 감사드립니다.


업데이트 : 나는 이 웹 사이트 , R 메일 링리스트 및 인터넷을 둘러 보았습니다 . 내 상황에서 다음과 같은 문제가 발생할 수 있습니다.

R (사용하여 내 데이터 전처리 (1) TM을 특히 패키지)이 될 수 비실용적 때문에 tm엄청나게 느린 될 것입니다.

(2) R 패키지의 앙상블 (전처리, 희소 행렬, 분류기 등)을 사용해야하므로 패키지 간의 상호 운용성이 문제가 될 수 있으며 한 형식에서 다른 형식으로 데이터를 변환 할 때 추가 오버 헤드가 발생할 수 있습니다. . 예를 들어 tmWEKA와 같은 외부 도구를 사용하여 사전 처리를 수행 하는 경우이 데이터를 R의 HPC 라이브러리가 읽을 수있는 형식으로 변환하는 방법을 찾아야합니다. 그리고 분류 자 ​​패키지가 HPC 라이브러리에서 제공 한대로 데이터를 직접 가져 오는지 명확하지 않습니다.

내가 올바른 길을 가고 있습니까? 그리고 더 중요한 것은, 이해가 되나요?


R은 이보다 훨씬 큰 데이터 세트를 처리 할 수 ​​있으므로 사용 가능한 도구를 잘 활용하면됩니다. Weka와 Mahout은 어떤 언어 나 환경에서 성취 할 수 있는지에 대해서는 차이가 없지만, 사용 가능한 언어가 부족합니다. FWIW, 이것은 상당히 작은 샘플 크기이며 1M 크기는 더 크지 않지만 통계적으로 너무 과도합니다. 내 추천은 초보자 또는 초보자 모두에게 무료이기 때문에 R 또는 Python입니다. Matlab은 무료는 아니지만 좋습니다. 또한 많은 컴퓨터를 사용할 때 큰 세금이 발생합니다.
— Iterator

1
훨씬 두드러진 점은 클래스 당 예제보다 많은 클래스가 있으며이를 매우 높은 차원의 공간에 임베드한다는 것입니다. 나는 당신이 여기서 좋은 수업 분리를 얻을 것이라고 확신하지 않습니다. 수업에 구조적인 관계가 있습니까? 그렇다면 이러한 통찰력 없이는 이러한 방법 중 일부가 제대로 작동하지 않을 수 있습니다.
— Iterator

1
foreach라이브러리 쓰기 병렬 코드를 R로 사용할 수 있습니다 . 이는 본질적으로 병렬화가 쉬운 임의 포리스트와 함께 잘 작동합니다.
— Zach

2
몇 가지 질문이 있습니다. 1) 언급 한 모든 유형의 학습 접근 방식을 비교하고 싶습니까? 아니면 직업을 완수하기 위해 하나만 필요한가요? 2) 각 문서가 1, 1 이상 또는 0 이상의 클래스에 속합니까? 3) 어떤 이유로 기능 선택을 구체적 으로 사용 하시겠습니까 , 아니면 필요하다고 생각 했습니까? 나는 이것이 오늘날의 표준에 의해 적당한 크기의 문제이며 치수 축소가 필요하지 않다는 다른 의견에 동의합니다.
— DavidDLewis

1
거의 10,000 개의 주제 (예 : 수업 또는 카테고리 또는 원하는 용어)와 관련된 텍스트 분류 작업을하고 있습니다. 현재이 텍스트 분류 시스템을이 규모로 조정하고 있습니다. 나는 자신의 기술을 독점적이라고 공유 할 수는 없지만, 약간의 조언이 있습니다. 이미 제안 된 기술이 아니라면 일부 제안 된 기술이 확장된다고 가정 할 때 매우 신중해야합니다. 내 경험상 거의 할 일이 없습니다.

답변:


13

데이터가 scipy.sparse.csr_matrixPython의 인스턴스 와 같은 희소 데이터 구조로 표시되는 한 데이터가 작동하도록 할 수 있어야합니다 . 텍스트 데이터 작업을 위한 자습서를 작성했습니다 . 해싱 트릭을 활용하여 메모리 사용량을 더 줄일 수도 있습니다 . 또는 HashingVectorizer대신에 사용하도록 조정 CountingVectorizer하십시오 TfidfVectorizer. 이것은 문서 섹션 텍스트 기능 추출에 설명되어 있습니다 .

랜덤 포레스트는 일반적으로 선형 모델 (예 : 선형 지원 벡터 머신 및 로지스틱 회귀) 및 다항식 또는 베르누이 순진 베이보다 훨씬 비싸고, 단순한 모델보다 예측 정확도가 크게 향상되지 않는 대부분의 텍스트 분류 문제입니다.

scikit-learn이 문제에 맞게 확장되지 못하면 Vowpal Wabbit 은 말한 모든 모델을 구현하지는 않지만 sklearn보다 빠릅니다.

scikit-learn 라이브러리의 현재 상태를 반영하고 끊어진 링크를 수정하기 위해 2015 년 4 월에 편집되었습니다.


"비표준"차원 축소 기술을 사용할 때의 문제는 작업을 게시하려고 할 때 문제가 발생할 수 있다는 것입니다. 텍스트 분류 필드에서 적어도 리뷰어가 일반적으로 사용되는 기술을보고 싶어한다는 사실을 알고 있습니다 (기존 분류 기술과 비교하기가 더 쉽습니다).
— user721975

걱정하지 마십시오-@ogrisel은 비표준을 언급하지 않았습니다. 최소의 텍스트 분류와 관련이 있기는하지만 아직 그의 자습서를 읽지는 않았지만.
— Iterator

+1 저는 파이썬이 즐거운 방법이라고 생각합니다. R에는 텍스트 마이닝을위한 최신 패키지가 있지만 통계적 전문 지식과 관심 분야보다 계산이 더 많은 경우 Python을 권장합니다.
— Iterator

@ogrisel : 당신과 다른 사람들이 sklearn에 기여한 것에 대한 찬사. 나는 파이썬에서 일하는 많은 사람들에게 그것을 추천했습니다. 전체 디자인은 모범적입니다.
— Iterator

"비표준"차원 축소 (임의의 투영법 사용) 및 기능 해싱 에 대해서는 John Langford 의 해시 트릭 과 metaoptimize에 대한 토론을 확인하십시오 .
— ogrisel

10

Python 용 Gensim 은 마법입니다. 그리고 파이썬으로되어 있기 때문에 @ogrisel의 제안과 함께 사용할 수 있습니다.


1

내 자신의 경적을 울리지는 않지만 Rapidminer를 사용하여 텍스트 분석에 대한 인기있는 비디오 시리즈를 만들었습니다. 여기에서 볼 수 있습니다 :

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

기능 선택을 피할 수 있습니다. 메모리에 백만 * 백만 행렬을 생성하지 않는 분류기를 사용하십시오. :)

로지스틱 회귀는 그 많은 차원에서 질식 할 것입니다. Naive Bayes는 독립 치수를 가정하므로 괜찮습니다. SVM은 차원 수 (지지 벡터 수)에 의존하지 않으므로 괜찮습니다.

300은 많은 수업입니다. 나는 몇 가지로 시작하고 당신의 방법을 작동합니다.


훌륭한 포인터와 조언. 감사. "몇 가지만으로 시작하고 일을 시작하십시오"라는 의미를 자세히 설명해 주시겠습니까?
— user721975

음, "바이올린, 비올라, 첼로, 트럼펫 ..."과 같은 300 개의 클래스 대신 "string, brass"와 같이 더 작은 수로 다시 분류 할 수 있습니다.
— Neil McGuigan

알았어, 이제 알겠다
— user721975

1

먼저, 귀하의 의견에 따라, 이것을 300 이진 (예 / 아니오) 분류 문제로 취급합니다. 사용하기 쉬운 오픈 소스 이진 분류기 학습자가 많이 있으며,이를 통해 메모리 시간을 교환 할 수 있습니다.

SVM과 로지스틱 회귀는 아마도 텍스트 분류에 가장 많이 사용되는 방법 일 것입니다. 현대 구현에서는 드문 데이터 구조를 사용하고 과적 합을 피하는 정규화 설정을 포함하므로 둘 다 1000000 차원을 쉽게 처리 할 수 ​​있습니다.

WEKA 및 KNIME을 포함한 여러 오픈 소스 머신 러닝 제품군 에는 SVM과 로지스틱 회귀가 모두 포함됩니다. 독립형 SVM 구현에는 libSVM 및 SVMlight가 포함됩니다 . 로지스틱 회귀 분석을 위해 Madigan, Genkin 및 기타 와 함께 개발 한 BXRtrain 및 BXRclassify를 연결 합니다. BXRclassify는 수천 개의 로지스틱 회귀 모델의 메모리 내 인덱스를 작성하고 동시에 적용 할 수 있습니다.

텍스트를 속성 벡터 형태로 변환하는 것에 관해서는, 나는 항상 처음부터 그것을하기 위해 약간의 Perl을 작성하게됩니다. :-) 그러나 내가 언급 한 머신 러닝 제품군에는 토큰 화 및 벡터화 코드가 포함되어 있다고 생각합니다. 또 다른 방법은 LingPipe 와 같은 더 많은 자연 언어 툴킷 을 사용하는 것입니다.


+1 좋은 댓글. 300 예 / 아니요 분류를 수행하려면 클래스에 대한 부정적 훈련 데이터를 어떻게 선택합니까? 긍정적 인 데이터는 분명히 클래스에 속한 문서입니다.
— user721975

다른 의견. SVM / Logistic reg는 백만 개의 치수를 확실히 처리 할 수 ​​있지만 어떻게 이러한 분류기의 매개 변수를 선택하기 위해 실험을 실행할 수 있습니까? 예를 들어, 작은 데이터 세트에서 10 배 교차 검증을 실행하여 매개 변수를 결정할 수 있지만 알고리즘이 적절한 시간 내에 실행을 완료하도록 그러한 큰 데이터에 대해 어떤 접근 방식을 취합니까?
— user721975

@ user721975 : 특정 차별의 경우 긍정적 인 문서는 레이블 X가 붙은 문서이고 부정적인 문서는 나머지 문서입니다.
— DavidDLewis

@ user721975 : 알고리즘과 구현에 따라 세부 사항이 매우 다양하므로 실행 시간에 대한 일반적인 조언을 제공하기가 어렵습니다. 10 배 교차 검증은 데이터 세트에 비실용적이지 않을 수 있습니다. 60000 예제는 중요하지 않습니다.
— DavidDLewis

1
불균형 훈련 세트가 반드시 문제가되는 것은 아닙니다. 그러나 실제로 나는 혼란스러워하는 것이 있다는 것을 알고 있습니다. 문서는 0, 1 또는 여러 클래스에 속할 수 있기 때문에 클래스 당 200 개의 교육 문서를 가지고 있다는 것은 무엇을 의미합니까? 0 클래스 또는 2+ 클래스의 문서를 제거하기 위해 무언가를 했습니까? 일반적으로이 60000 개의 문서 세트를 어떻게 생성 했습니까?
— DavidDLewis

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.