스페이스로 고유의 표현 추출하기 [머신러닝 지식 0도 이해]

spaCy를 사용하여 문장에서 고유한 표현 방법을 추출한다.
spacy는 자연 언어로 처리된 많은 작업을 통합한 프로그램 라이브러리입니다.
예를 들면, 이런 일을 할 수 있다.
  • 본 징수는 추출을 표시한다
  • 시스템 수신 분석
  • 형태소 분석
  • 또 CNN에서 배우는 모형도 넣었다.사용해 본 부분은 학습 데이터를 준비할 필요가 없다.
    (물론 자신만의 독특한 학습 데이터로 모델을 만들 수도 있다.)
    간단한 심도 있는 학습으로 자연스러운 언어 처리를 하고 싶은 사람에게는 매우 편리하다!
    그나저나 스페이스의 v2.2과까지 일본어를 다 배우지 못한 패턴.
    따라서 일본어를 해석하기 위해서는 학습 데이터를 준비할 필요가 있다.
    (또는 GiNZA라는 이름의spacy의 파생 라이브러리를 사용해야 함)
    v2.3과부터 일본어 학습 완료 모드를 도입했기 때문에 스페이스로 일본어 데이터를 단일체로 분석할 수 있습니다!
    https://spacy.io/usage/v2-3

    환경 구조


    환경 사용을 확인합니다Colaboratory.
    Colaboratory는 구글에서 제공하는 무료pyton 실행 환경입니다.
    jupter 인터페이스를 통해 조작할 수 있어 기계 학습 라이브러리의 검증과 데이터 분석에 매우 편리하다.

    spacy 설치


    Colaboratory는 기본적으로spacy가 있지만 버전은 2.2 계열(2021/05월 시점)이다.
    학습한 일본어 모델을 사용할 때는 2.3 시스템 이상을 설치해야 합니다.
    # このコマンドで、2.2系が消えて3.0.6が入る
    %%bash
    pip install spacy==3.0.6
    

    학습 모드 설치


    다 배우는 모델은 대·중소 세 가지가 있다.
    https://spacy.io/models/ja
    이번에는 ja_core_news_sm,ja_core_news_md 두 개를 사용합니다.
    %%bash
    python -m spacy download ja_core_news_sm
    python -m spacy download ja_core_news_md
    

    고유 표현 추출


    나는 본 문제의 고유한 표현을 추출하고 있다.
    시작하기 전에 아래에서 매크로 패키지를 다시 불러오십시오.
    import pkg_resources, imp
    imp.reload(pkg_resources)
    
    상기 처리를 통해 설치된 모델을 읽을 수 있다.
    그럼 설치된 모형으로 고유의 표현을 뽑아 보세요.
    import spacy
    
    # モデルのロード
    nlp = spacy.load("ja_core_news_md")
    # 解析対象のテキストa
    input_text = "2018年の8月に旅行にフランスへ旅行に行った。ルーヴル美術館でモナ・リザの絵を見た。" 
    # モデルに解析対象のテキストを渡す
    doc = nlp(input_text)
    # 固有表現を抽出
    for ent in doc.ents: 
        print(ent.text, ent.label_, ent.start_char, ent.end_char)
    
    # out --> 
    ## 2018年 DATE 0 5
    ## 8月 DATE 6 8
    ## フランス GPE 12 16
    ## ルーヴル美術館 ORG 24 31
    
    이게 다야.아주 적은 코드로 결과를 낼 수 있다.
    다음은 모형을 ja_core_news_md로 바꾸어 봅시다.
    import spacy
    
    # モデルのロード
    nlp = spacy.load("ja_core_news_md")
    # 解析対象のテキストa
    input_text = "2018年の8月に旅行にフランスへ旅行に行った。ルーヴル美術館でモナ・リザの絵を見た。"
    # モデルに解析対象のテキストを渡す
    doc = nlp(input_text)
    # 固有表現を抽出
    for ent in doc.ents:
        print(ent.text, ent.label_, ent.start_char, ent.end_char)
    
    # out --> 
    ## 2018年 DATE 0 5
    ## 8月 DATE 6 8
    ## フランス GPE 12 16
    ## ルーヴル美術館 ORG 24 31
    ## モナ・リザ PERSON 32 37
    
    새로 발견된'모나리자'는 인명으로 추출할 수 있다.
    모델 크기에 비례해 고유한 표현의 변주곡을 늘리고 싶습니다.
    더 많은 변화의 데이터를 얻고 싶을 때ja_core_news_lg를 쓰면 된다.
    추출 결과를 시각화할 수도 있습니다.
    from spacy import displacy
    displacy.render(doc, style="ent", jupyter=True)
    

    블로그나 발표 등에 대한 설명은 편리할 것 같다.

    상하문에 따라 추출 결과가 달라질까요?


    결론을 보면 추출 결과는 상하문에 다소 의존한다.
    import spacy 
    nlp = spacy.load("ja_core_news_sm")
    input_text = "川崎へ行く"
    
    #
    # 「川崎」がGPE(地名)として抽出される
    #
    doc = nlp(input_text)
    for ent in doc.ents:
        print(ent.text, ent.label_, ent.start_char, ent.end_char)
    # out -> 川崎 GPE 0 2
    
    import spacy 
    nlp = spacy.load("ja_core_news_sm") 
    input_text = "川崎さんの家"
    
    #
    # 「川崎」がPERSON(人物)として抽出される
    #
    doc = nlp(input_text)
    for ent in doc.ents:
        print(ent.text, ent.label_, ent.start_char, ent.end_char)
    # out -> 川崎 PERSON 0 2
    
    에서 추출할 수 있는 고유의 표현은 같지만 라벨은 다르다.
    글 첫머리에서 설명한 바와 같이 스페이스의 학습 완료 모델은 CNN을 기반으로 한 모델이다.
    CNN 기반 모델은 연속성을 고려한 학습에 적합하지 않기 때문에 컨텍스트와 추출 결과에 대한 의존도가 낮아 다소 의외다.
    그나저나 RNN은 연속된 정보를 설명하는 효과적인 수단으로 유명하다.
    CNN과 RNN의 차이는 참고할 수 있으니 관심 있는 사람은 보세요.
    https://lionbridge.ai/ja/articles/neural-network-cnn-rnn/

    총결산


    스페이스를 사용한다면 고유표현 추출 임무를 간단하게 수행하는 방법을 적었습니다.
    spacy는 고유의 추출 표현 외에도 많은 자연 언어 처리 임무를 쉽게 테스트할 수 있다.
    관심 있으신 분들은 꼭 참고해주세요!

    좋은 웹페이지 즐겨찾기