fastText로 자동으로 텍스트 분류 [머신러닝 초보자도 간단]
나는'fastText로 텍스트 분류를 먼저 하는 상태'를 목표로 이 글을 썼다.
기계 학습에서 텍스트를 분류하는 방법은 매우 많은데fastText를 사용하는 장점은 다음과 같다.
또한 실제 서비스를 활용할 때도 큰 이점이 있다는 점을 고려하면 실용성이 높은 도구라고 할 수 있다.
환경 구조
이 유효성 검사에 사용된fastText를 설치합니다.
fastText에는 C++와python 두 개의 인터페이스가 있습니다.
기계 학습을 하는 사람들이 많은데python을 사용하기 때문에 이번에python 버전을 설치합니다.
pip install git+https://github.com/facebookresearch/[email protected]
2010/08/25 최신 v0.9.2 설치를 지정했습니다.그나저나 일본어 문장을 검증할 때
MeCab
와Sudachi
등 기호화 도구가 필요하다.이번에는 영어 문장으로 공부해야 하기 때문에 설치할 필요가 없다.
유효성 검사용 기사 데이터 가져오기
우선fasttext가 사용할 수 있는 상태가 목표이기 때문에 데이터 사이즈가 적은 글을 선택했습니다.
이번에 사용한 것NLP 100개 노크 소리 2020에서도 사용한 것News+Aggregator.
다운로드 링크에서 zip 파일의 압축을 풀고 압축을 풀십시오.
다음 명령을 사용하여 구현할 수도 있습니다.
전개
wget https://archive.ics.uci.edu/ml/machine-learning-databases/00359/NewsAggregatorDataset.zip
unzip NewsAggregatorDataset.zip
2pageSessions.csv
와 newsCorpora.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.tsv
와 test.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
때보다 정밀도가 높습니다.공부할 때 슈퍼 파라미터 일람표는 다음과 같습니다. 관심이 있으면 많이 시도해 보세요.
끝말
어때요?
나는 가능한 한 기계로 초보자도 바로 시험해 볼 수 있는 수준으로 쓸 계획이다.
참고로 이번 검증에서는 텍스트 점차적 변화 등 사전 처리가 이뤄지지 않았다.
실시하면 정밀도가 높아질 거예요. 관심 있으신 분들은 한번 해보세요.
그럼
산양눈()
Reference
이 문제에 관하여(fastText로 자동으로 텍스트 분류 [머신러닝 초보자도 간단]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yagiyuki/articles/3bb2104de0d0c6d20cd0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)