공통 주제별로 문자열을 그룹화하려면 어떻게해야합니까?


10

예를 들어, 프로그래밍에 관한 다른 문자열로 프로그래밍하는 것에 관한 문자열, 물리학에 관한 다른 문자열을 가진 물리에 관한 문자열 등을 광범위한 주제로 그룹화하려고합니다. 문제의 눈에 띄는 이론적 언어 측면에도 불구하고 실제로 프로그래밍 / 소프트웨어를 사용 하여이 작업을 수행하려고합니다.

요약 : 많은 문자열이 주어지면 의미 론적 주제별로 그룹화하는 방법은 무엇입니까?

특정 응용 프로그램 : 나는 일반적인 그룹 (자동차, 컴퓨터, 정치, 캐나다, 음식, 버락 오바마 등)으로 분류하고 싶은 ~ 200,000 개의 퀴즈 질문이 있습니다.

내가 살펴본 것 : Wikipedia에는 자연어 처리 툴킷 목록이 있는데 (내가하려고하는 것이 실제로 NLP라고 가정 함) 몇 가지를 보았지만 내 요구와 비슷한 것을 수행하지 않는 것 같습니다.

참고 : 이 작업을 수행하려면 추가 지식 (예 : 포르쉐는 자동차, C ++은 프로그래밍 언어)이 필요합니다. 그런 다음 교육 데이터가 필요하다고 가정하지만 질문과 답변 목록 만있는 경우 교육 데이터를 어떻게 생성 할 수 있습니까? 그런 다음 교육 데이터를 어떻게 사용합니까?

추가 참고 사항 : 현재 Q & A의 형식이 도움말 인 경우 (JSON처럼 보이지만 기본적으로 원시 텍스트 파일 임) :

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

그러나 누군가가 이미 범주가 있음을 지적하기 전에 ~ 200k 개의 질문과 답변이 있으며 기본적으로 많은 "범주"가 있습니다. 위에 나열된 것과 같이 더 넓은 그룹으로 그룹화하려고합니다. 또한이 형식은 모든 질문에 대해 매우 쉽게 변경할 수 있습니다. 프로그래밍 방식으로 수행합니다.

그리고 더 많은 메모 : 실제로 모든 질문을 스스로 읽지 않았기 때문에 필요한 범주 (최소 10-20)가 얼마나되는지 알지 못합니다 . 나는 분류하는 동안 어떻게 든 유한 숫자가 결정되도록 기대했다. 어쨌든 항상 여러 범주를 수동으로 만들 수 있습니다.


당근은 어떻게 사용 했습니까? 그것에 대한 나의 짧은 독서에서, 그것은 200k 레코드를 쉽게 처리 해야하는 것처럼 보입니다.

생각보다 훨씬 오래 걸렸으며 JVM의 초기 메모리 할당량을 1024m로 늘리고 최대 메모리를 2048m로 늘 렸습니다. 그 소리를내는 것만 큼 나쁘지 않았습니다.

충분한 훈련 데이터가 필요하며 질문을 이러한 범주로 분류 할 수 있어야합니다. 완전 자동 접근 방식은 다른 수단 (예 : "car"를 포함하는 질문)으로 그룹화 할 수 있습니다. 그룹을 만드는 것과 동시에 동의어를 배울 수 없습니다.
종료-익명-무스

예, 대량 처리를하고 있습니다. JVM을주는 것은 실제로 문제가되지 않습니다. 얼마나 걸렸어? 문서를 어디에서로드 했습니까? 맞춤 소스?

10 분 정도 걸렸지 만 대량 처리는 시간이 많이 걸리고 메모리를 많이 사용한다는 데 동의합니다. 질식에 관한 전체적인 문제는 문제가 아니었지만 더 많은 참고 사항입니다.

답변:


4

이것은 NLP에서 상당히 표준적인 문제이며, 당신이 찾고있는 마술 구글 단어는 "주제 모델링"입니다. 문자열이 매우 짧지 만 Latent Dirichlet Allocation 또는 이와 유사한 방법으로 성공할 수 있습니다 . Edwin Chen의 멋진 블로그 게시물이 있습니다. 여기 에는 알고리즘의 기본 개념이 나와 있습니다. 구현에 대한 자세한 내용은 Yi Wang 이이 노트 에서 다룹니다 .

기성품 솔루션을 찾고 있다면 topicmodelsR 패키지를 사용해 보는 것이 좋습니다.이 패키지는 LDA와보다 정교한 상관 관계가있는 주제 모델 모두에 대해 상당히 훌륭한 인터페이스를 제공합니다. David Mimno가 유지 관리하는 훌륭한 구현 목록도 있습니다 .


고맙습니다. Chen의 블로그 게시물은 내가하려는 일에 주목하는 것 같습니다. 이전에 나열 / 완료 한 내용을 사용한 적이 있습니까? 나는 완전히 새로운 근거를 가지고 있으며 내가해야 할 일 (기성품 솔루션 중 하나를 사용하여)에 대한 연습을 고맙게 생각합니다. "문서"를 어떻게 포맷해야합니까? 어떤 그룹에 속하는 문서를 식별 할 수 있도록 각 Q & A에 ID를 적용해야합니까? 출력 된 데이터는 어떻게 사용합니까? 내가 말했듯이, 나는 많은 세부 사항을 이해하지 못합니다.
Whymarrh

R topicmodels 패키지를 꽤 많이 사용했습니다. cran.r-project.org/web/packages/topicmodels/vignettes/…실제 예제가 포함 된 문서가 있습니다. 어쨌든 모든 것이 "단어"표현으로 축소되므로 각 문서의 특정 형식은 중요하지 않습니다. 모든 관련 텍스트를 하나의 문자열로 던져 넣으십시오.
Martin O'Leary

4

여기서 두 가지 문제를 해결하려고합니다.

문제 1 : 질문 문자열을 적절한 범주로 분류하십시오.

문제 2 : 적절한 카테고리를 만듭니다.

첫 번째 문제는 소위 감독 알고리즘에 의해 수행 될 수 있으며, 많은 분류기는 매우 우수한 정확도와 성능을 제공 할 수 있습니다. 그러나 얇은 데이터 (톤의 데이터)에서 범주를 생성하는 문제 2는 훨씬 까다 롭습니다. 컴퓨터가 일부 기준에 따라 범주를 자율적으로 결정하는 많은 양의 데이터를 고려할 때 이것은 감독되지 않은 문제입니다. 이상적으로 이러한 기준과 알고리즘은 데이터를 깔끔하게 클러스터로 구성해야합니다. 그런 다음 라벨을 붙일 수 있습니다. 그러나 이것은 훨씬 어려운 작업이므로 여기에는 수용 가능한 드롭 인 솔루션이 없으므로 전문가가 많이 필요로하는 많은 조정 노력 없이도 좋은 결과를 얻을 수 있다고 말합니다.

그래서 아직 여기에 마법 버튼이없는 것이 두렵습니다. 그러나 당신이 할 수있는 일은 기계를 조금 도와주는 것입니다. 예를 들어, 카테고리 세트를 결정할 수 있습니다. 범주를 결정하면 교육 데이터를 만들 수 있습니다. 이 설정에서 훈련 데이터는 질문과 올바른 범주 쌍입니다.

훈련 데이터가 많을수록 좋습니다. 그러나 작업이 여전히 자동으로 수행되므로 처음에는 수동으로 작업을 시작하는 것이 이치에 맞지 않습니다. 이제 왜 교육 데이터를 원하십니까? 정확도 평가. 좋은 결과를 원한다면 설정이 얼마나 잘 수행되고 있는지 평가할 수 있어야합니다. 그리고 다소 체계적으로 그 일을하는 유일한 방법은 직접 질문을 직접 작성하는 것입니다. 그렇지 않으면 당신은 장님에 있습니다.

그런 다음 몇 가지 새로운 질문이 생깁니다. 첫째 : 얼마나 많은 교육 데이터가 필요합니까? "때에 따라 다르지". 귀하의 데이터 나 카테고리를 보지 않으면 추측조차 할 수 없습니다. 하지만 "야구장 추정"을하고 약 500 개의 질문을 할 수 있습니다. 나는 순서대로 떨어져있을 수 있습니다.

이것은 실제로 500 개의 질문에 직접 태그를 지정해야한다는 것을 의미합니까? 예, 아니오 "부트 스트랩"분류기에 중간 결과와 영리함을 사용할 수 있습니다. 그것은 여전히 ​​수동 작업이며, 생각할 때 500 개의 질문이 태그를 지정하는 데 오래 걸리지 않습니다. 여기서 영리하면 부지런한 것보다 더 나쁜 결과를 빨리 줄 수 있습니다.

충분한 양의 훈련 데이터가있는 경우 75 %를 가져 와서 선호하는 도구 (예 : 여기에 언급 된 도구 또는 기타 도구)를 사용하여 분류기를 만듭니다. 이제 분류자가 데이터의 보류 된 25 %에 레이블을 지정하고 결과 정확도를 측정하도록합니다. 결과가 좋으면 샴페인을 터 뜨리십시오. 그렇지 않다면 더 많은 훈련 데이터를 만들거나 다른 분류기를 사용해보십시오.

TL; DR

요약하면 다음과 같습니다.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

하나의 작은 질문 : 당신은 훈련 데이터에 대해 "약 500 질문"이라고 말하고 수동으로 그에 태그를 붙이지 만 "나는 몇 배 정도 떨어져있을 수 있습니다". 대신 5k 또는 50k 질문을 사용한다면 여전히 수동으로 그 많은 태그를?

문제는; 데이터를 보거나 프로젝트의 모든 세부 사항을 명확하게 알지 못하면 좋은 평가를하기가 어렵습니다. 그러나 500이 너무 낮 으면 태그 작업이 낭비되지 않았 음을 기억해야합니다. 평가를 위해 여전히 수동으로 레이블이 지정된 질문이 필요합니다. 평가 데이터가 많을수록 더 나은 평가를 수행 할 수 있습니다.

한 자리수로 나는 50-500-5000을 의미했습니다. 나는 당신이 50k를 분류해야한다고 생각하지 않습니다. 그것은 전체 말뭉치의 1/4입니다! 500 개의 질문이 너무 낮 으면 분류기를 부트 스트랩 할 수 있습니다. 여기서 아이디어는 작은 초기 말뭉치 (예 : 500)에서 분류기를 훈련시킨 다음 나머지 부분에 태그를 지정하는 것입니다. 이제 분류자가 새롭고 더 큰 분류자를 재교육 할 것을 확신 한 경우를 사용할 수 있습니다.

명심해야 할 또 다른 중요한 사항; 많은 분류기의 성능은 훈련 데이터의 양에서 선형이 아니지만 일반적으로 S 자형 곡선 일 것입니다. 즉, 500 개의 태그가 추가 된 질문이 5000만큼이나 큰 이점이 될 수 있습니다. 내 조언은 작은 단계로 작업하는 것입니다.

내 프로젝트에 대한 추가 정보를 제공하는 세부 정보는 무엇입니까? 서식을 보여주기 위해 몇 가지 예제 질문을 공유 할 수 있지만 분류 프로세스에 맞게 Q & A 형식을 조정할 수 있습니다. 도움을 주셔서 감사합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.