컨볼 루션 신경망을 사용한 문서 분류


11

CNN (Convolutional Neural Network)을 사용하여 문서를 분류하려고합니다. 짧은 텍스트 / 문장에 대한 CNN은 많은 논문에서 연구되었습니다. 그러나 긴 텍스트 나 문서에 CNN을 사용한 논문은없는 것 같습니다.
내 문제는 문서의 기능이 너무 많다는 것입니다. 내 데이터 세트에서 각 문서에는 1000 개 이상의 토큰 / 단어가 있습니다. 각 예제를 CNN에 제공하기 위해 word2vec 또는 장갑 을 사용하여 각 문서를 행렬로 변환 하여 큰 행렬을 만듭니다. 각 행렬에서 높이는 문서의 길이이고 너비는 단어 포함 벡터의 크기입니다. 내 데이터 세트에는 9000 개가 넘는 예제가 있으며 네트워크를 훈련시키는 데 많은 시간이 걸립니다 (일주일 내내). 매개 변수를 미세 조정하기가 어렵습니다.
또 다른 특징 추출 방법은 각 단어마다 one-hot vector를 사용하는 것이지만 매우 희소 행렬을 만듭니다. 물론이 방법은 이전 방법보다 훈련하는 데 더 많은 시간이 걸립니다.
큰 입력 행렬을 만들지 않고 피처를 추출하는 더 좋은 방법이 있습니까?
가변 길이의 문서를 어떻게 처리해야합니까? 현재 문서의 길이를 동일하게 만들기 위해 특수 문자열을 추가하지만 좋은 해결책이라고 생각하지 않습니다.


2
TfIdf 벡터 라이저를 사용하는 것이 적합합니까? 어쩌면 word2vec와 함께 사용하여 각 문서마다 상위 x 단어 만 남기겠습니까?
Diego

글쎄, 나는 Tfldf가 무엇인지 모른다. 나는 그것이 작동하는지 확인하려고합니다. 감사합니다
lenhhoxung


방금 확인했는데 도움이되지 않는다고 생각합니다. 기본적으로 해당 도우미 클래스는 문서 집합에 대한 행렬을 만듭니다. 행렬의 각 행 벡터 (이진 또는 단어 수)는 문서에 해당하지만 CNN의 경우 각 문서에 대한 행렬이 필요합니다.
lenhhoxung

요점은 TfIdf에 의해 순위가 매겨진 문서 당 x 개의 사소한 단어 만 남기는 것이 었습니다. 그런 다음 원본 인코딩을 사용하여 문서 행렬을 작성하십시오. 이 두 단계 접근법 아이디어가 나왔는지 확실하지 않습니다.
Diego

답변:


8

문서를 더 긴 일련의 단어 벡터 대신 일련의 문장 벡터로 표시하여 입력 데이터의 길이를 줄일 수 있습니다. Doc2vec 는이를 수행하는 한 가지 방법입니다 (각 문장은 "문서"입니다).

Doc2vec를 사용하지 않으려면 문장 벡터를 만드는 한 가지 방법은 각 문장에 대해 단어 벡터를 평균화하여 각 문장에 대해 동일한 너비의 단일 벡터를 제공하는 것입니다. 이것은 Doc2Vec을 통해 사용 가능한 일부 방법만큼 정확하지는 않지만 주제 모델링에 상당히 성공적으로 사용했습니다.

문장 벡터를 얻은 후에는 이미 단어 벡터를 위해하고있는 것처럼 각 문서마다 순서대로 정렬 한 다음 모델을 실행하십시오. 각 문서의 시퀀스 길이가 짧기 때문에 모델은 단어 벡터보다 빨리 학습해야합니다.

그건 그렇고,이 방법은 정확성과 속도 요구를 충족시키기 위해 확장하거나 축소 할 때 작동 할 수 있습니다. (예를 들어 CNN이 여전히 문장 벡터로 너무 느리게 훈련하는 경우 대신 단락 벡터를 만들 수 있습니다).

길이가 다른 문서를 처리하는 한 가지 방법은 패딩을 사용하는 것입니다. 문서 순서는 모두 가장 긴 문서와 길이가 같아야합니다. 따라서 가장 긴 문서가 400 문장이면 모든 문서 시퀀스의 길이는 400 벡터입니다. 최대 길이보다 짧은 문서는 0으로 채워진 벡터로 채워집니다.


재미있는 생각. 나는 그것을 시도 할 것이다 :)
lenhhoxung

뭐 좀 물어봐도 될까요? 길이가 매우 다른 문서 (5 문장 / 문서, 500 문장 / 문서)를 문장 벡터로 표현한 문서를 어떻게 처리 할 수 ​​있습니까? 여기 패딩은 이상하게 보입니다 ...
stackunderflow

1
음성 처리에서 일부 사람들은 길이에 따라 시퀀스를 정렬하므로 길이가 비슷한 시퀀스는 동일한 배치에있게됩니다. 이것은 텍스트 시퀀스에서 작동 할 수 있습니다.
suthee December

4

지역 임베딩을 사용할 수 있습니다. 개별 "토큰"을 벡터로 변환하는 대신 텍스트 영역을 벡터로 변환하는 전략을 사용할 수 있습니다. 이 접근법은 여기에서 사용됩니다 : https://arxiv.org/abs/1504.01255

CNN에 국한되지 않으면 다음과 같은 계층 적주의 모델을 사용할 수 있습니다. https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf 이런 종류의 파이프 라인이있는 경우 : word vectors (combined into) sentence vectors (combined into) final document vector

이 방법을 사용하면 모든 단어 벡터를 임베딩으로 변환해야하지만 한 번에 모두 변환해야하는 것은 아닙니다.

길이가 다른 문서를 처리하려면 패딩 / 컷팅이 지금까지 유일한 솔루션입니다.

마지막으로 속도를 높이려면 중요한 섹션 만 포함하여 텍스트의 크기를 줄이십시오 (문서의 시작 부분만으로 분류 정확도가 충분할 수 있음)


1
참조 링크 주셔서 감사합니다. 지역 삽입이 흥미 롭습니다. 이 문서 arxiv.org/abs/1412.1058 (동일한 저자) 에서 언급 한 것처럼 가변 크기 문서 에 대해서는 패딩 / 커팅 대신 여러 풀링 단위를 사용할 수 있습니다.
lenhhoxung
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.