비정형 텍스트 분류


12

구조화되지 않은 텍스트 문서, 즉 구조가 알려지지 않은 웹 사이트를 분류하려고합니다. 내가 분류하고있는 수업의 수는 제한되어 있습니다 (이 시점에서는 3 명 이하라고 생각합니다). 누구든지 내가 어떻게 시작할 수 있는지 제안 했습니까?

여기서 "단어"접근이 가능한가? 나중에 문서 구조 (아마도 의사 결정 트리)를 기반으로 다른 분류 단계를 추가 할 수 있습니다.

Mahout과 Hadoop에 어느 정도 익숙하므로 Java 기반 솔루션을 선호합니다. 필요한 경우 Scala 및 / 또는 Spark 엔진 (ML 라이브러리)으로 전환 할 수 있습니다.

답변:


14

처음부터 시작합시다. 분류 (분류라고도 함) 는지도 학습 의 예입니다 . 지도 학습에는 다음이 있습니다.

  • 모델 -데이터의 내부 구조에 근접한 것으로 추론하고 유용한 예측을 할 수 있습니다 (예 : 객체의 클래스 예측). 일반적으로 모델에는 "학습"하려는 매개 변수가 있습니다.
  • 학습테스트 데이터 세트 -모델 학습 (매개 변수에 대한 올바른 값 찾기) 및 추가 평가에 사용하는 오브젝트 세트
  • 훈련분류 알고리즘 -먼저 훈련 데이터 세트에서 모델을 학습하는 방법을 설명하고, 둘째는 훈련 된 모델이 지정된 새로운 객체의 클래스를 도출하는 방법을 보여줍니다.

이제 간단한 스팸 분류 사례를 살펴 보겠습니다. 교육 데이터 세트는 이메일 + 해당 레이블- "스팸"또는 "스팸 아님"입니다. 테스트 데이터 세트는 동일한 구조를 갖지만 일부 독립적 인 이메일로 만들어집니다 (보통 데이터 세트를 분할하여 9/10을 훈련에 사용하고 1/10을 테스트에 사용). 이메일을 모델링하는 한 가지 방법은 각각을 단어 세트 (가방)로 표현하는 것입니다. 단어가 서로 독립적이라고 가정하면 Naive Bayes 분류기를 사용할 수 있습니다 . 즉, 각 단어 및 각 클래스의 사전 확률을 계산 한 다음 (트레이닝 알고리즘) Bayes 정리를 적용하여 새 문서가 속할 확률을 찾습니다. 특정 클래스.

기본적으로 우리는

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

이제 우리는 객체 (문서)를 단어 가방으로 표현했습니다. 그러나 유일한 방법입니까? 사실, 우리는 원시 텍스트에서 훨씬 더 많은 것을 추출 할 수 있습니다. 예를 들어, 단어 대신에 줄기 나 쉼표를 사용하고 , 시끄러운 단어를 버리거나 , 단어의 POS 태그 를 추가하고 , 이름이 지정된 엔티티를 추출 하거나 문서의 HTML 구조를 탐색 할 수 있습니다. 실제로, 문서 (및 일반적으로 모든 객체)의보다 일반적인 표현은 특징 벡터 입니다. 예를 들어 텍스트 :

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

여기에서 첫 번째 행은 가능한 기능 목록이며 후속 행은 문서에서 해당 기능이 몇 번이나 나타나는지를 보여줍니다. 예를 들어 첫 번째 문서에는 "actor"라는 단어, 1 개의 "burn"단어, 5 개의 명사, 2 개의 형용사 및 2 개의 텍스트가 굵게 표시되지 않습니다. 마지막 열은 결과 클래스 레이블에 해당합니다.

기능 벡터를 사용하면 텍스트의 모든 속성을 통합 할 수 있습니다. 좋은 기능 세트를 찾는 데 시간이 걸릴 수 있습니다.

그리고 모델과 알고리즘은 어떻습니까? 우리는 나이브 베이 즈에 묶여 있습니까? 전혀. 로지스틱 회귀 , SVM , 의사 결정 트리 – 몇 가지 인기있는 분류기를 언급 할뿐입니다. (대부분의 경우 "분류기"라고 말하면 훈련 및 분류를위한 모델 + 해당 알고리즘을 의미합니다).

구현과 관련하여 작업을 두 부분으로 나눌 수 있습니다.

  1. 특징 추출-원본 텍스트를 특징 벡터로 변환합니다.
  2. 객체 분류-모델 구축 및 적용.

첫 번째 요점은 많은 NLP 라이브러리 에서 잘 작동합니다 . 두 번째는 기계 학습에 관한 것이므로 데이터 세트에 따라 Weka 또는 MLlib를 사용할 수 있습니다 .


Original Poster는 "classify"라는 단어를 사용했지만 "cluster"는 범주에 대한 사전 정의가 없기 때문에 문제에 대한보다 정확한 설명입니다. 따라서 이것은 반드시지도 학습 문제가 아닙니다.
MrMeritology

@MrMeritology : 흠, 문맥에서 저자는 그가 사용할 구체적인 클래스에 대해서는 확실하지 않지만 클러스터링이 아닌 분류를 원한다고 말합니다. 어쨌든, 그는 진실을 아는 유일한 사람입니다 :)
ffriend

어쩌면 나는 분명하지 않았다. 범주는 조언으로 선택되므로 클러스터링 문제보다는 분류입니다. 복잡한 특징 벡터를 생성한다는 아이디어는 상당히 합리적입니다. 특히 일부 태그가 있으며 일부 샘플을 빠르게 분류 할 가능성이 높습니다. 높은 비선형 성을 예측할 때 SVM이 문제에 적합한 지 확실하지 않지만 의사 결정 트리와 베이가 적용 가능한 것 같습니다. 하이브리드 알고리즘 (SVM 기반 의사 결정 트리)의 적용에 대해서도 생각하기 시작했습니다.
Grzegorz E.

@GrzegorzE. -범주가 미리 정의되어 있으면 질문에이 세 가지 범주를 나열하십시오. 제 생각에는 ML 알고리즘에 너무 집중되어 있으며 문제의 성격과 데이터의 성격에 충분하지 않습니다. 예를 들어, 구조가 알려지지 않은 웹 사이트의 기능에서 "비선형"을 예측합니다. 왜? 또한 웹 페이지 텍스트와 태그를 혼합하여 who-knows-what-else와 다른 의미를 갖습니다.
MrMeritology

@GrzegorzE. -분류 방법은 주로 사전 카테고리의 특성과 데이터의 특성에 따라 결정되어야합니다. 임의의 웹 사이트를 3 가지 범주로 분류하는 방법에는 무한한 방법이 있습니다. 각 분류 방법은 데이터 또는 두드러진 패턴에서 두드러진 특징을 제안합니다. 개별 데이터 요소 (웹 페이지) 및 해당 컨텍스트의 수동 분석을 대체 할 수는 없습니다.
MrMeritology

5

주제 모델링은 문제에 매우 적합한 방법입니다. 주제 모델은 감독되지 않은 학습 / 발견의 한 형태로, 지정된 (또는 발견 된) 주제 수는 함께 나타날 확률이 높은 단어 목록으로 정의됩니다. 별도의 단계에서 주제 전문가를 사용하여 각 주제에 레이블을 지정할 수 있지만 3 개의 클러스터에 관심이 있기 때문에 필요하지 않습니다.

각 문서를 한 단어의 단어로 취급하고 중지 단어 등을 제거하기위한 사전 프로세스를 수행합니다. 가장 간단한 방법으로 주제 수를 미리 지정합니다. 귀하의 경우, 카테고리에 대한 고정 한계 인 "3"을 지정하거나 더 많은 주제를 선택하고 (10에서 100 사이), 별도의 단계에서 공통 강조점이있는 문서에 대해 3 개의 클러스터를 형성 할 수 있습니다 주제. K- 평균 또는 다른 클러스터링 방법이 사용될 수있다. (후자의 접근법을 권장합니다)

주제 모델링 소프트웨어를 처음부터 코딩 할 필요는 없습니다. 다음은 소프트웨어 라이브러리 / 패키지를 포함한 많은 리소스 가있는 웹 페이지입니다 .

Java에는 없지만 Java에서 C ++ 및 Python을 실행하는 방법이 있습니다.


4

텍스트 분류를위한 훌륭한 오픈 소스 소프트웨어 패키지는 다음과 같습니다.

  • MALLET 은 텍스트 데이터 작업을 위해 UMass가 구축 한 CPL 라이센스 Java 기반 기계 학습 툴킷입니다. 여기에는 여러 분류 알고리즘 (예 : 나이브 베이, 최대 엔트로피, 의사 결정 트리)의 구현이 포함됩니다 .
  • Stanford NLP Group 의 Stanford Classifier 는 텍스트 데이터를 처리하도록 설계된 최대 엔트로피 분류기의 GPL 라이센스 Java 구현입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.