주니꾸기
20
2018-12-14 00:40:12
6
1022

word embedding 학습 시에 다른 feature들(성별, 연령, 대화시간대, 화자와의관계 등)을 고려하여 학습시키고 싶습니다.


안녕하십니까 논문 작성을 위해 word2vec을 공부하고 있는 경영학 석사과정 대학원생입니다.

다름이 아니라 성별, 연령대 등의 정보를 고려하여 단어를 임베딩 시키는 방법에 대해서 고민 중입니다.

일단 제가 가진 데이터는 모 채팅플랫폼의 대화내용 corpus이며 아래의 표와 같은 형태입니다.

성별연령대화시간대화자와의 관계텍스트
청년새벽친구피곤하지? 난 덕분에 좋았어. 어여 자
청장년오전가족아들, 사진을 좀 다듬었어.
장년오후가족인물이 아니라 여백을….

상기 코퍼스를 활용하여 word embedding을 하려고 하는데요. 제가 아는 선에서는 기존의 흔히 사용되는 word embedding의 방법은 코퍼스에서 텍스트 feature만 가져와서 파이썬 gensim 모듈을 이용하여 학습시키는 것으로 알고 있습니다.

저는 하나의 형태소가 주어진 정보의 양에 따라서 다른 벡터 값을 가질 것이라고 생각을 했습니다. 예를 들어 '피곤하다/Adjective'는 '피곤하다/Adjective/남', '피곤하다/Adjective/남/청년'처럼 주어진 정보의 양에 따라서 그 벡터값이 미묘하게 다를 것이라고 생각했습니다. 그래서 이를 어떻게 학습시킬까 하다가 단순하게 원래 텍스트에 corpus에서 도출 할 수 있는 정보를 하나씩 추가하면서 임베딩 학습을 시켜보기로 하였습니다.

[1] 파이썬의 트위터형태소 분석기를 통해 normalize, stemming, tokenize를 진행하였습니다.

# 코퍼스 불러오고 명사, 동사, 형용사, 음소만 남겨서 문장을 tokenize한다. 이 과정에서 normalize 및
prepcor_okt = [["/".join(tu) for tu in okt.pos(st, norm=True, stem=True) if (tu[1] == "Noun" or tu[1] == "Verb" or tu[1] == "Adjective" or tu[1] == "KoreanParticle")] for st in corpus]

# 결과를 확인한다.
print(prepcor_okt[:4])
#[['피곤하다/Adjective', '난/Noun', '덕분/Noun', '좋다/Adjective', '자/Noun'],
#['아들/Noun', '사진/Noun', '좀/Noun', '다듬다/Verb'],
#['인물/Noun', '아니다/Adjective', '여백/Noun'],
#['이모티콘/Noun', '오/Noun', '이제/Noun', '편집/Noun', '하다/Verb', '감사하다/Verb']]

[2] 이후에 각 형태소에 성별 정보만 붙여서 100차원의 word2vec 모델을 만들어 보았습니다. 여기서의 성별 정보는 어디서 구하냐면... 제일 위의 표에서 하나의 행의 성별정보를 그 행의 텍스트에 붙이는 것입니다.

[3] 그 결과 형태소/품사/성별 정보로 이루어진 벡터공간을 얻을 수 있었습니다.예를 들어 '피곤하다/Adjective/남', '난/Noun/남', '덕분/Noun/남', '좋다/Adjective/남', '자/Noun/남' 과 같은 형태의 형태소들이 100차원의 벡터 형태로 존재하는 것입니다.


여기까지 진행하고 나서 위와 같은 방식으로 추가적으로 연령대 정보를 붙여서 word2vec 모델을 만들려고 했으니 문득 든 생각이 '피곤하다/Adjective/남'과 '피곤하다/Adjective/남/청장년'은 결국 벡터 값이 같을 수 밖에 없지 않을까 입니다. 붙여진 정보만 성별에서 성별+연령대로 바뀌었을 뿐... 사실 학습데이터는 변함이 없으니까요.

여기서 굉장한 난관에 봉착하게 되었는데요... 제가 궁극적으로 원하는 것은 '피곤하다/Adjective/남'과 '피곤하다/Adjective/남/청장년'의 벡터 값이 달랐으면 좋겠습니다. 이러한 방식으로 학습을 것이 있는지 정말 제 나름 여기저기 찾아보았는데요. sense2vec이라는 것이 있지만 자세히 보니 그냥 형태소에 품사정보를 달아서 학습시키는 것에 불과한 것 같더라구요... 


결론적으로, '피곤하다/Adjective/남'과 '피곤하다/Adjective/남/청장년'의 벡터값을 다르게 임베딩 할 수 있는 방법이 있을까요? 혹시 관련된 레퍼런스 같은것이라도 추천해주시면 정말 감사하겠습니다. 긴 글 읽어주셔서 감사합니다.







0
0
  • 답변 6

  • EF
    904
    2018-12-14 06:11:54 작성 2018-12-14 06:27:37 수정됨

    "'피곤하다/Adjective/남'과 '피곤하다/Adjective/남/청장년'은 결국 벡터 값이 같을 수 밖에 없지 않을까 입니다. 붙여진 정보만 성별에서 성별+연령대로 바뀌었을 뿐... 사실 학습데이터는 변함이 없으니까요."


    음... 왜 벡터값이 같을거라고 생각하시나요? 데이터를 학습시키면서 '피곤하다/Adjective/남/청장년', '피곤하다/Adjective/남/장년', '피곤하다/Adjective/남/청년' 이런 식의 다른 데이터를 보게 되면 확률상 모든 나이대에서 벡터 값이 정확히 일치할 수가 없죠.


    물론 '피곤하다'라는 예시는 나이성별 불문하고 비슷하게 쓰이기 때문에 나이에 따른 벡터간의 거리가 매우 가깝겠지만 예를들어 '엄마', '선생님' 같은 단어는 나이에 따라 벡터값의 차이가 상대적으로 클 수 있겠네요. '형'같은 경우도 성별에 따라 많이 다를 거구요. 어차피 이런 차이를 보기 위해서 이런 임베딩 모델을 만들려는 거 잖아요


    +추가

    성별이나 연령대 정보를 받아들이는 word2vec 모델을 학습시키는 것은 질문자님이 제시한 방법으로는 힘들 수도 있겠다 싶습니다. 질문자님이 예상하신 word2vec 모델은 '피곤하다/남'과 '피곤하다/여'의 거리가 굉장히 가까운 모델을 생각하는 것이지 싶은데, 질문자님의 방식으로 학습하면 남성벡터 따로놀고 여성벡터 따로놀고 하는 방식이 될 수 있습니다.

    1
  • darong
    76
    2018-12-14 10:00:13

    연령 embedding을 추가해서 입력을 [단어 embedding + 연령 embedding]으로 학습하면

    가능하지 싶습니다.  feature가 여러 개인 경우 보통 이런 식으로 학습시킵니다.


    1
  • 주니꾸기
    20
    2018-12-14 10:53:14

     

    EF님 답변 감사드립니다. 제 생각에도 각각의 feature의 벡터공간이 따로 놀것 같다구 생각하는데요... 참 난관이네요.. 관련 논문이 있나 다시 한번 찾아봐야 할 것 같습니다.
    0
  • 주니꾸기
    20
    2018-12-14 11:10:15

    darong님 답변감사드립니다. 말씀 해주신 부분에서 아이디어가 있을 것 같은데요... 정확히 어떤 의미인지 이해를 못 했습니다. 제 생각이 맞는지 한번만 검토해주시면 감사하겠습니다. 제가 알기론 skip-gram으로 학습할때 vocabulary를 만든다음 원핫인코딩 된 단어를 이용해서 뉴럴넷으로 학습하는 것으로 알고 있는데, 이 때 원핫인코딩에 성별, 연령대, 대화시간대 등의 feature 정보를 붙이면 되는 것인가요?

    예를들어 아래와 같은 상황을 가정한다면,

    [1] 다양한 feature들 중에서 성별과 연령대만 반영하여 단어를 임베딩

    [2] vocabulary의 사이즈는 1000

    [3] '피곤하다'는 vocabulary에서 2번째 단어


    V1V2V3...V999V1000
    피곤하다/Adjective010...00

    위와 같이 단어를 원-핫 인코딩 할수 있는데,


    여기에 feature 정보를 붙이면

    [1] 해당 문장에서 등장한 '피곤하다'의 화자는 여성(0)

    [2] 해당 문장에서 등장한 '피곤하당'의 화자는 청장년(1)



    V1
    V2V3...V999V1000성별연령대
    피곤하다010...0001

    이런식으로 그냥 concatenate 한 후 뉴럴넷으로 학습시키는 것이 맞는지요...? 제가 이해한게 올바른 것인지 모르겠습니다 ㅠㅠ


    0
  • darong
    76
    2018-12-14 11:44:46

    쉽게 말하면 단어를 embedding vector로 만드는 것처럼 다른 feature도 똑같이 embedding vector로 만들어서 학습하는 겁니다.

    word embedding vector의 차원이 128이라면 연령 embedding vector도 128 차원으로 만들어서 두 벡터를

    concat시킵니다.

    즉 word embedding vector 와 연령 embedding vector를 concatenate한 벡터를 입력으로 사용해서 학습하는 방식인데, word embedding vector와 연령 embedding vector 두 개를 학습시킵니다.

    이것이 word2vec에도 그대로 적용할 수 있는지는 모르겠습니다. 


    0
  • 주니꾸기
    20
    2018-12-14 13:08:32

    darong님 답변 감사드립니다. 참고해서 진행해 보도록 하겠습니다!!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.