신경망은 문자열 데이터를 구문 분석합니까?


28

이제 신경망이 패턴을 인식하고 입력을 분류하기 위해 어떻게 작동하는지 배우기 시작했으며 인공 신경망이 이미지 데이터를 구문 분석하고 이미지를 분류하는 방법 ( convnetjs 데모 )과 그 핵심 을 살펴 보았습니다. 이미지를 다운 샘플링하고 각 픽셀이 하나의 입력 뉴런을 네트워크로 자극합니다.

그러나 문자열 입력으로 가능하다면 머리를 감싸려고합니까? 내가 가진 유스 케이스는 사용자가 본 영화의 "권장 엔진"입니다. 영화에는 많은 문자열 데이터 (제목, 줄거리, 태그)가 있으며 텍스트를 해당 영화를 설명하는 몇 가지 핵심 단어로 "다운 샘플링"한다고 상상할 수 있지만이 영화를 설명하는 상위 5 개 단어를 파싱하더라도 영화 세트를 비교하려면 모든 영어 단어에 입력 뉴런이 필요하다고 생각하십니까? 입력 뉴런을 세트에 사용 된 단어로만 제한 할 수 있지만 새로운 영화 (사용자가 새로운 영화와 함께 새로운 단어를보고)를 추가하여 성장 / 학습 할 수 있습니까? 내가 본 대부분의 라이브러리는 시스템이 훈련 된 후에 새로운 뉴런을 추가 할 수 없습니까?

문자열 / 단어 / 문자 데이터를 입력에 신경망으로 매핑하는 표준 방법이 있습니까? 아니면 신경망이 실제로 문자열 데이터를 파싱하는 작업에 적합한 도구가 아닌가?

답변:


19

자연 언어 데이터에 대한 예측을 위해 신경망을 사용하는 것은 까다로운 작업이지만이를 가능하게하는 시도 된 방법이 있습니다.

자연어 처리 (NLP) 필드에서 텍스트는 종종 단어 백 모델을 사용하여 표시됩니다. 즉, 길이가 n 인 벡터가 있습니다 . 여기서 n 은 어휘의 단어 수이며 각 단어는 벡터의 요소에 해당합니다. 텍스트를 숫자 데이터로 변환하려면 각 단어의 발생 횟수를 세어 그 단어에 해당하는 벡터의 인덱스에 해당 값을 배치하면됩니다. Wikipedia는이 변환 과정을 잘 설명합니다. 벡터의 길이는 고정되어 있기 때문에 인덱스에 매핑되지 않는 새로운 단어를 다루기가 어렵지만이 문제를 완화 할 수있는 방법이 있습니다 (조회 기능 해싱 ).

이 표현 방법에는 많은 단점이 있습니다. 인접한 단어 사이의 관계를 유지하지 않으며 매우 드문 벡터가됩니다. n- 그램을 살펴보면 단어 관계 유지 문제를 해결하는 데 도움이되지만 지금은 두 번째 문제인 희소성에 초점을 맞 춥니 다.

이러한 희소 벡터를 직접 다루는 것은 어렵습니다 (많은 선형 대수 라이브러리는 희소 입력을 처리하는 열악한 작업을 수행함). 종종 다음 단계는 차원 축소입니다. 이를 위해 우리는 주제 모델링 분야를 참조 할 수 있습니다 . Latent Dirichlet Allocation (LDA) 및 Latent Semantic Analysis (LSA) 와 같은 기술을 사용하면 문서를 주제의 조합으로 표현하여 이러한 희소 벡터를 밀도가 높은 벡터로 압축 할 수 있습니다. 사용 된 주제 수를 수정하면 LDA 또는 LSA에서 생성 한 출력 벡터의 크기를 수정할 수 있습니다. 이 차원 축소 프로세스는 최소한의 정보를 손실하려고 시도하면서 입력 벡터의 크기를 크게 줄입니다.

마지막으로, 이러한 모든 변환 후 주제 모델링 프로세스의 출력을 신경망의 입력에 공급할 수 있습니다.


1
더 궁금한 점이 있으면 알려주세요. 좀 더 자세히 설명하기 위해 최선을 다하겠습니다.
매디슨 May

감사합니다. 계속 탐색 할 좋은 조건이 있습니다.
MidnightLightning

우연히, 나는 "기능 해싱"과 관련이 있습니다. 왜냐하면 그것은 암호화 필터 와 매우 친숙한 블룸 필터 와 매우 유사 해 보이기 때문입니다 . 해시 함수가 인덱스의 부호를 설정하기 위해 두 번째 해시 함수가 필요하지 않고 입력 기능을 여러 인덱스 위치 (블룸 필터 스타일)와 관련시키는 것이 더 효과적인지 궁금합니다.
MidnightLightning

6

@Emre와 @Madison의 답변은 당면한 문제에 대해 좋은 지적을 할 수 있습니다. 문제는 문자열을 NN에 입력하기위한 기능 벡터로 나타내는 것 중 하나입니다.

첫째, 문제는 처리하려는 문자열의 크기에 따라 다릅니다. 이 설정에서는 may 토큰 (일반적으로 단어)을 포함하는 긴 문자열을 문서라고합니다. 개별 토큰 / 단어를 처리하는 별도의 방법이 있습니다.

문서를 표현하는 방법에는 여러 가지가 있습니다. 그들 중 많은 사람들이 단어 가방을 가정합니다. 가장 간단한 유형은 문서를 단어 수 또는 용어 빈도 (tf)의 벡터로 나타냅니다. 문서 길이의 영향을 제거하기 위해 일반적으로 사람들은 용어가 표시되는 문서 수, 문서 빈도 ( tf-idf ) 로 정규화하는 것을 선호합니다 .

또 다른 접근법은 데이터의 잠재적 인 저 차원 표현을 학습하는 주제 모델링입니다. LDALSI / LSA 는 일반적인 선택이지만, 이것이 감독되지 않음을 기억하는 것이 중요합니다. 배운 표현은 반드시 NN으로 수행하는지도 학습에 이상적 일 필요는 없습니다. 주제 모델링을 수행하려는 경우 감독 주제 모델을 시도 할 수도 있습니다 .

개별 단어의 경우 NN을 활용하여 단어를 임의 크기의 공간에 포함시키는 word2vec 를 사용할 수 있습니다 . 이 학습 된 공간에서 두 워드 벡터 간의 유사성은 시맨틱 유사성과 일치하는 경향이있다.

보다 최근에 개척 된 접근 방식은 단락 벡터 의 접근 방식으로 , 먼저 word2vec와 같은 단어 모델을 학습 한 다음 해당 표현을 기반으로 분산 된 단어 세트 (모든 크기의 문서) 표현을 학습합니다. 이것은 많은 응용 분야에서 최신 결과를 보여주었습니다.

NLP에서 NN을 사용할 때 사람들은 종종 Recurrent Neural Nets ( Long Short Term Memory 네트워크) 와 같은 다른 아키텍처를 사용 합니다. 에서 어떤 경우 사람들은 사용하고 길쌈 신경망을 텍스트.


word2Vec이 실제로 가장 정확한 답변이라고 생각합니다. 훈련 및 사용 하나하는 방법에 대한 정말 좋은 Kaggle 튜토리얼이 있습니다 : kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

덕분에 나는 하나 추가 할 것이다는 word2vec 링크를 잊어 버렸습니다 (여기 나열 일에 추가!)
jamesmf

3

이것은 신경망 자체에는 문제가 아니라 머신 러닝에서 텍스트 데이터를 표현하는 것에 관한 문제입니다. 영화, 캐스트 및 테마를 범주 형 변수로 나타낼 수 있습니다. 줄거리는 더 복잡합니다. 아마 그 주제 모델 을 원할 것입니다 . 그러나 나는 당신이 사물을 얻을 때까지 그것을 버릴 것입니다. 당신이 언급 한 바로 그 텍스트 "다운 샘플링"입니다.

에서 봐 신경 네트워크에 범주 변수를 인코딩하는 방법을 배울 수 자습서. 그리고 행운을 빌어!


이것은 모든 머신 러닝에서 명시 적으로 문제가 아니라 머신 러닝에서 보편적이지 않은 특징 벡터를 생성 할 때만 문제가된다는 점에 주목할 가치가 있습니다.
슬레이터 빅 토프

어떤 종류의 기계 학습이 기능을 사용하지 않습니까?
엠레

랜덤 포레스트는 신경망에서 볼 수있는 종류의 특징 벡터를 얻는 것이 문제가되지 않는 좋은 예입니다. 많은 감독되지 않은 방법은 특징 벡터가 아닌 원시 단어에 대해서도 작동합니다. 참고 : 기능을 사용하지 않는 메소드는 없으며 엄격하게 구조화 된 벡터에 의존하지 않는 메소드 만 있다고 말하지 않았습니다.
슬레이터 빅 토프

"엄격히 구조화 된"이라는 것이 무슨 의미인지 잘 모르겠습니다.
Emre

엄격하게 구조화 된 것은 사전, 가중치 행렬 및 일련의 문자열을 포함하는 목록과 달리 unint8의 1d 벡터입니다.
Slater Victoroff

0

텍스트를 사용하여 신경망을 시험 시행하는 다음 두 가지 방법을 시도했습니다. 후자는 상당히 잘 작동하지만 한계가 있습니다.

  1. word2vect 또는 NLTK / 맞춤 단어 토큰을 사용하여 어휘를 만들고 각 단어에 색인을 할당하십시오. 단어를 숫자로 나타내는 것이이 인덱스입니다.

    도전 과제 :

    • 기능 스케일링을 사용하여 인덱스를 "정규화"해야합니다.
    • 신경망의 출력에 약간의 차이가있는 경우 출력이 예상치 못한 단어의 색인 일 수 있습니다 (예 : 예상 출력이 250 인 경우 NN이 249 또는 251을 출력하는 경우 숫자 컨텍스트에서 가까운 출력 일 수 있음). 그것들은 다른 단어에 대한 색인입니다). 출력 인덱스를 생성하기위한 반복 NN을 여기에서 활용할 수 있습니다.
    • 새로운 단어가 어휘에 추가되면 토큰 색인의 크기를 다시 조정해야합니다. 이전에 조정 된 값으로 훈련 된 모델은 유효하지 않을 수 있으며 재 훈련해야합니다.
  2. 예를 들어 "n"단어에는 항등 행렬을 사용하십시오. 각 행과 열은 단어를 나타내는 "nx n"또는 (n-1 x n-1) 행렬을 사용하십시오. 교차 셀에 "1"을, 나머지 위치에 "0"을 넣으십시오. ( 참고 )

    도전 과제 :

    • 모든 입력 및 출력 값은 "nx 1"벡터입니다. 큰 어휘의 경우 부피가 크고 계산 속도가 느립니다.
    • 새로운 단어가 어휘에 추가되면 항등 행렬 (즉, 단어 벡터)을 다시 계산해야합니다. 이전에 계산 된 벡터로 훈련 된 모델은 유효하지 않을 수 있으며 재 훈련해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.