fastText로 자동으로 텍스트 분류 [머신러닝 초보자도 간단]

이 글에서fastText는 텍스트를 자동으로 분류해 보았다.
나는'fastText로 텍스트 분류를 먼저 하는 상태'를 목표로 이 글을 썼다.
기계 학습에서 텍스트를 분류하는 방법은 매우 많은데fastText를 사용하는 장점은 다음과 같다.
  • 절약 메모리에서 고속 동작
  • GPU 없이 작동
  • 단어 벡터를 자동으로 생성할 수 있다(다른 도구로 만들 필요 없다)
  • 이렇게 하면fastText는 초보자가 쉽게 습득할 수 있는 문장 분류 도구라고 할 수 있다.
    또한 실제 서비스를 활용할 때도 큰 이점이 있다는 점을 고려하면 실용성이 높은 도구라고 할 수 있다.

    환경 구조


    이 유효성 검사에 사용된fastText를 설치합니다.
    fastText에는 C++와python 두 개의 인터페이스가 있습니다.
    기계 학습을 하는 사람들이 많은데python을 사용하기 때문에 이번에python 버전을 설치합니다.
    pip install git+https://github.com/facebookresearch/[email protected]
    
    2010/08/25 최신 v0.9.2 설치를 지정했습니다.
    그나저나 일본어 문장을 검증할 때MeCabSudachi 등 기호화 도구가 필요하다.
    이번에는 영어 문장으로 공부해야 하기 때문에 설치할 필요가 없다.

    유효성 검사용 기사 데이터 가져오기


    우선fasttext가 사용할 수 있는 상태가 목표이기 때문에 데이터 사이즈가 적은 글을 선택했습니다.
    이번에 사용한 것NLP 100개 노크 소리 2020에서도 사용한 것News+Aggregator.
    다운로드 링크에서 zip 파일의 압축을 풀고 압축을 풀십시오.
    다음 명령을 사용하여 구현할 수도 있습니다.
    전개
    wget https://archive.ics.uci.edu/ml/machine-learning-databases/00359/NewsAggregatorDataset.zip
    unzip NewsAggregatorDataset.zip
    
    2pageSessions.csvnewsCorpora.csv 두 파일, 이번에 사용newsCorpora.csv.

    학습과 테스트로 분리

    newsCorpora.csv를 학습용과 테스트용 데이터로 분리한다.
    import pandas as pd
    import csv 
    from sklearn.model_selection import train_test_split
    news_corpora = pd.read_table('newsCorpora.csv', header=None,quoting=csv.QUOTE_NONE)
    train, test = train_test_split(news_corpora, test_size=0.2, random_state=0)
    
    분리한 후 다음과 같이 파일을 저장합니다.
    학습은 제목과 분류를 사용하기 때문에 두 열만 저장합니다.
    train[[1, 4]].to_csv('train.tsv', sep='\t', index=False, header=None)
    test[[1, 4]].to_csv('test.tsv', sep='\t', index=False, header=None)
    
    train.tsvtest.tsv는 다음과 같은 데이터를 저장해야 한다.
    'X-Men: Days of Future Past' owns the holiday weekend	e
    KEEPING UP WITH THE KARDASHIANS: NEW WEDDING DETAILS	e
    Ruble Drops With Bonds as Gas Talks Fail: Russia Reality Check	b
    'Divergent' Stars Shailene Woodley & Theo James on Film's Soundtrack	e
    

    fasttext 형식으로 가공


    위에서 작성한 학습용과 테스트용 데이터를 각각fastText 형식으로 저장
    # 学習データを加工
    with open('train.tsv', 'r') as f_in, open('train_fasttext.txt', 'w') as f_out:
        for row in f_in:
            text, label = row.strip().split('\t')
            f_out.write('__label__{} {}\n'.format(label, text))
    
    # テストデータを加工
    with open('test.tsv', 'r') as f_in, open('test_fasttext.txt', 'w') as f_out:
        for row in f_in:
            text, label = row.strip().split('\t')
            f_out.write('__label__{} {}\n'.format(label, text))	
    
    아래의 형식으로 보존할 수 있다면 OK.
    __label__e 'X-Men: Days of Future Past' owns the holiday weekend
    __label__e KEEPING UP WITH THE KARDASHIANS: NEW WEDDING DETAILS
    __label__b Ruble Drops With Bonds as Gas Talks Fail: Russia Reality Check
    
    보시다시피fastText의 데이터는 __label__{ラベル名} 텍스트의 형식으로 제작되었습니다.
    이번 라벨 이름은 뉴스 종류이고, 텍스트는 새로운 제목이다.
    또 b=비즈니스, t=science and technology, e=entertainment, m=health 4개로 분류됐다.

    분류기의 학습


    마침내 분류기의 학습에 이르렀다.
    그럼에도 불구하고 코드는 매우 간단하다.
    import fasttext
    model = fasttext.train_supervised(input="train_fasttext.txt")
    model.save_model("news_corpora.bin")
    
    학습 시간은 Colaboratory 10초 정도입니다.
    작은 데이터도 공부하고 있지만 빨리 공부할 수 있다.

    분류기로 분류를 추론하다


    이 글의 제목을 추론해 보아라Dutch arrest girl for threatening tweet to American Airlines.
    유별 e로 분류하는 것이 정답입니다.
    ret = model.predict("Dutch arrest girl for threatening tweet to American Airlines")
    print(ret) # (('__label__e',), array([0.91577011]))
    
    예상대로 분류e가 반환되었습니다.
    aray가 되돌아오는 0.9157011은 확률치를 나타낸다.
    위의 경우 유별 e를 나타내는 확률은 0.9157011이다.
    참고로 예측 결과는 두 개 이상 되돌아갈 수 있다.
    ret = model.predict("Dutch arrest girl for threatening tweet to American Airlines")
    print(ret) # (('__label__e', '__label__b'), array([0.91577011, 0.07166039]))
    
    예측된 카테고리가 하나가 아닌 경우 사용할 수 있다.

    평가 분류기


    마지막으로 분류기에 대한 평가를 진행한다.
    분류기의 평가도 간단해 아래 코드가 미리 작성한 테스트 데이터를 평가할 수 있다.
    ret = model.test("test_fasttext.txt")
    print(ret) # (84588, 0.931136804274838, 0.931136804274838)
    
    원조의 시작은 84588로 테스트 데이터의 건수다.두 번째와 세 번째는 각각precision,recall이다.
    파라미터 조정을 특별히 실시하지는 않았지만 정밀도는 상당히 높다.
    학습할 때의 초파라미터를 조정하면 서로 다른 결과가 나타날 수 있다.
    예를 들어 epoch=10라면 이런 느낌이다.
    ret = model.test("test_fasttext.txt")
    print(ret) # (84588, 0.9389629734714143, 0.9389629734714143)
    
    조금 있지만 epoch=5 때보다 정밀도가 높습니다.
    공부할 때 슈퍼 파라미터 일람표는 다음과 같습니다. 관심이 있으면 많이 시도해 보세요.
    https://fasttext.cc/docs/en/options.html

    끝말


    어때요?
    나는 가능한 한 기계로 초보자도 바로 시험해 볼 수 있는 수준으로 쓸 계획이다.
    참고로 이번 검증에서는 텍스트 점차적 변화 등 사전 처리가 이뤄지지 않았다.
    실시하면 정밀도가 높아질 거예요. 관심 있으신 분들은 한번 해보세요.
    그럼
    산양눈()

    좋은 웹페이지 즐겨찾기