대규모 텍스트 분류


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 차원을 쉽게 처리 할 수 ​​있습니다.

WEKAKNIME을 포함한 여러 오픈 소스 머신 러닝 제품군 에는 SVM과 로지스틱 회귀가 모두 포함됩니다. 독립형 SVM 구현에는 libSVMSVMlight가 포함됩니다 . 로지스틱 회귀 분석을 위해 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.