대량의 일본어 파일 중에서 비슷한 파일을 찾다

9364 단어 기계 학습
Valtech Advent Calendar 2016
12월 13일의 책임자로서 이번에는 거리와 골목의 화제인'기계학습'의 실제 조작에서 어떤 느낌을 받았는지 소개할 수 있을 것 같습니다.

기계학


센서나 데이터베이스 등 일정 수량의 샘플 데이터 집합을 입력하여 분석하고 이 데이터에서 유용한 규칙, 규칙, 지식 표시, 판단 기준 등을 추출하여 알고리즘을 발전시킨다.또 데이터 집합을 분석해야 하기 때문에 통계학과 관련이 깊다.
/(중략)
머신러닝은 검색엔진, 의료진단, 스팸메일 검출, 금융시장 예측, DNA 배열 분류, 음성인식과 문자인식 등 패턴 인식, 게임 전략, 로봇 등 광범위한 분야에서 활용된다.
위키백과를 인용하다

요컨대


과거의 데이터 분석 경향에서 미래를 예지할 수 있습니다!
(그렇다면 PC계 잡지Interface(인터페이스) 2017년 01월호는 과거 트위터 데이터에서 주가 예측을 했다.)

이번에는 실제로 해보겠습니다.


일본어로 많이 쓴 서류에서 비슷한 서류를 찾아내다.

재료 준비


우선 대량의 일본어로 쓴 서류가 필요하다.
이것은 파행기를 사용하여 웹 페이지에서 페이지 정보를 순환적으로 회수하고 데이터를 수집하는 것이다.
(홈페이지를 돌며 페이지 정보를 회수할 때는 저작권 등의 문제가 있다고 생각하지만 개인이나 가족 간 사용, 정보 해석용이라면 문제가 되지 않는다.참조 페이지실제로 NG를 냈다면 Google 등도 NG를 냈을 것이다.)
crawler \
-u クロール対象のURL \
-s "どんなリンクを辿るか@リンクをたどった際に行う処理"  \
-i インターバル
이렇게 쓰면...
crawler \
-u http://example.co.jp \
-s "decreg('.sample','.+.html')@file_save_full('/tmp','%protocol/%host/%path')"  \
-i 5
example.co.jp를 방문하여 class=".sample"로 정의된 요소 산하 요소에서 부여된 끝 "."의 URL로 이동하여 이 페이지 정보를/tmp 산하의 프로토콜, 호스트 이름, 경로의 디렉터리에 저장합니다.(디렉토리가 임의로 생성됩니다.)이런 느낌으로 회수.
서버에 부담을 주지 않기 위해 5초 간격을 제공한다.
이렇게 되면 깊이는 1층만 순환할 수 있지만 Arrow(->)로 연결하면 몇 층이든 깊어진다.

어쨌든 1천400건 정도의 데이터를 수집했다.
이 데이터에서 주요 부분의 일본어 기술을 추출하여 파일에 저장합니다.
getcontent_htmldoc 읽기 - f에서 지정한 HTML 파일,class="title"요소 가져오기
요소 아래의 내용을 표준 출력으로 출력합니다.
다음 문장은 파일로 다시 지정합니다.
for i in `find ./ -name data`
do
getcontent_htmldoc -f $i -t ".title" > `dirname $i`/title
done
이로써 1천400건의 일본어 데이터가 준비됐다.

분류기를 준비하다.


기계 학습에도 각양각색의 종류가 있지만, 이번에는 간단하고 명쾌하며 설치가 간단하다
(혹은 다른 건 설명할 수 있는 정도가 아니라... orz)
의 TF-IDF 및 k 평균법의 조합입니다.
분류기의 흐름
1. 일본어를 나눔으로 쓴다.
"나는 도쿄에 산다."
열다
"나는 도쿄에 산다."
이렇게 형태소 해석을 한 뒤 단어를 빈칸으로 나눈다.
이것은 MeCab을 사용합니다.
import MeCab
def get_word(str, split_char):
    returnstr = ""
    mecab_result  = MeCab.Tagger('mecabrc').parse(str)
    splited_words = mecab_result.split('\n')
    for splited_word in splited_words:
        if splited_word == 'EOS' or splited_word == '':
            break
        splited_word_info = splited_word.split(',')
        word_and_tag = splited_word_info[0].split('\t')
        if len(word_and_tag) == 2:
            word = word_and_tag[0]
            returnstr += word + split_char
    return returnstr
2. TF-IDF를 사용하여 일본어 데이터를 벡터화합니다.
ff-idf는 파일에서 단어와 관련된 중요성 중 하나로 주로 정보 검색과 문장 요약 등 분야에 사용된다.
위키백과
・TF(Term Frequency)
어떤 문서 d에 나오는 색인 단어 t의 주파수입니다.파일에 그 단어가 몇 번 생겼는지 나타낸다.
・DF(Dock ument Frrequency)
전체 문서에서 그 단어가 몇 번이나 나타났음을 나타낸다.
IDF는 DF의 대수입니다.
공식이 페이지은 매우 이해하기 쉽다.
이렇게 하면 각 파일의 피쳐 양을 계산할 수 있습니다.
scikit-learn 라이브러리를 사용합니다.
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b', min_df=1, max_df=50)
vecs = vectorizer.fit_transform(data)
3. "k평균법"을 사용하여 분류한다.
k평균법은 비분층 집합 알고리즘이다.MacQueen은 클러스터 평균값을 사용하여 지정된 클러스터 수 k개로 분류하기 때문에 이렇게 이름을 지정합니다.k-평균법(k-means), c-평균법(c-means)이라고도 부른다.
위키백과
간단하게 말하면 N차원 공간에 설정된 데이터에서 부근의 요소를 찾는다.
이번 조건은 모든 TFT IDF가 걸린 파일을 N차원 공간에 먼저 구성하는 것입니다.
(요소와 요소가 가까울수록 닮았다.)
그 중에서 임의의 집단에 무작위로 들어가 집단과 요소의 거리를 계산하는 동시에 집단의 위치를 조금씩 이동시켜 모든 문서가 특정한 집단에 속하게 한다.
모든 집합이 움직이지 않았다. 계산이 끝났다.
이것도 scikit-learn 라이브러리를 사용합니다.
clusters = KMeans(n_clusters=100, random_state=0).fit_predict(vecs)

이루어지다

import os
import random
import MeCab
import numpy as np

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans

def fild_all_files(directory, filename):
    for root, dirs, files in os.walk(directory):
        for file in files:
            if filename == file :
                yield os.path.join(root, file)

def get_files_with_label(label, directory, filename):
    retuenarray = np.empty((0,4))
    for file in fild_all_files(directory, filename):
        filestr = ''
        for line in open(file, 'r'):
            filestr += line.rstrip()

        filedata = np.array([[label, filestr, file, -1]])
        retuenarray = np.append(retuenarray, filedata, axis=0)
    return retuenarray

def get_word(str, split_char):
    returnstr = ""
    mecab_result  = MeCab.Tagger('mecabrc').parse(str)
    splited_words = mecab_result.split('\n')
    for splited_word in splited_words:
        if splited_word == 'EOS' or splited_word == '':
            break
        splited_word_info = splited_word.split(',')
        word_and_tag = splited_word_info[0].split('\t')
        if len(word_and_tag) == 2:
            word = word_and_tag[0]
            returnstr += word + split_char
    return returnstr

# 指定のディレクトリに保存してあるデータを読み込み
alldata = np.empty((0,4))
alldata = np.append(alldata, get_files_with_label('it'           , '/tmp/crawler/savedata/it'           , 'title'), axis=0)
alldata = np.append(alldata, get_files_with_label('economy'      , '/tmp/crawler/savedata/economy'      , 'title'), axis=0)
alldata = np.append(alldata, get_files_with_label('entertainment', '/tmp/crawler/savedata/entertainment', 'title'), axis=0)
alldata = np.append(alldata, get_files_with_label('sports'       , '/tmp/crawler/savedata/sports'       , 'title'), axis=0)

# 文書をスペースにて分かち書きにする
all_title_data = np.array([])
for str in alldata[:,1]:
    all_title_data = np.append(all_title_data, get_word(str, ' '))

# TF-IDFを算出する。
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b', min_df=1, max_df=50, ngram_range=(1,2))
vecs = vectorizer.fit_transform(all_title_data)

# K平均法でクラスタリング、100個くらいに分類
clusters = KMeans(n_clusters=100, random_state=0).fit_predict(vecs)

# 結果をデータに戻す。
for i in range(0, len(alldata)):
    alldata[i, 3] = clusters[i]

# 適当なクラスタに属した文書を取得
result=[]
for i in range(0, len(alldata)):
    if int(alldata[i,3]) == random.randint(0,99):
        result.append(alldata[i,1])

# 表示
result.sort()
for i in range(0, len(result)):
    print(result[i])

실행 결과


실행시간은 3분 정도?
일부 실행 결과를 발췌하다.
Windows 7 RC、日本は5月7日一般公開 「XPと同等かそれ以上に快適」
Windows 7 RCは5月5日リリース? Microsoftがリーク
Windows 7β版、一般公開終了
Windows 7の「XPモード」、RC版公開
Windows 7の「XPモード」が完成 10月22日にリリース
Windows 7のエディションは6種類、すべてネットブックに対応――マイクロソフトが公表
Windows 7の一般販売が解禁――真夜中のアキバに1000人を超える群衆
Windows 7の評価をユーザーが投稿 MSが専用サイト
Windows 7ベータ版、一般公開期限を2月12日まで延長
Windows 7/8.1→Windows 10が“推奨される更新”に
Windows XPがもうすぐアキバから消える? 「とりあえず再入荷はこれで最後かも」
Windows XPの「メインストリーム・サポート」が終了、14日から「延長サポート」に移行
Windows7が70円?海賊版、早速猛威振るう−北京
XPモデル、新色・新柄を追加したポケットサイズPC――「VAIO type P」
flumpool山村隆太、一般女性と結婚へ “14年愛”を実らせライブで生報告
「Doblog」5月に終了 障害で3カ月投稿不能、一部データ復旧できず
「Skype」と「Google Voice」に脆弱性、“PBXボットネット”に悪用されるおそれも
「Surface 3」当初の販売地域に日本は含まれず ~日本へは「最適な形での投入を検討」
「Windows 7」のアップグレード、“ここ”に注意
「Windows 7」ベータ版公開一般ユーザーへの提供は9日から
「Windows 7はXPより速い」 MS公式ベンチマークの結果は
「wwwの父」がどうしてもやり直したいこと、それはhttp:のあとの//の不要化―米紙
・・・
(데이터는 야후 뉴스 귀하의 뉴스를 사용했습니다.)
음... 비슷한 파일을 수집한 건 맞지만 아직 거칠어.근데 K평균법이라서 잘 분류가 되는 건가요?
그러나 특징량을 제시할 때 명사로만 한정하거나 TFT-IIDF를 제외한 최소, 최대 수 등 각종 매개변수를 조정하면 정밀도가 더 높아진다.

이런 기술은 무슨 소용이 있습니까?


예컨대
SNS에서 비슷한 사용자 찾기
· 사용자가 자주 보는 뉴스 중 해당 사용자가 좋아하는 뉴스를 우선적으로 표시
• 쇼핑몰에서 이용자 열람 이력에 추천상품 표시
· 포럼 사이트 창설 시 투고한 파일에서 표기 가능
적당히 생각해보면 아이디어를 많이 낼 수 있고 다양한 앱을 들을 수 있겠지.
또 전날 기사에서 아라타 미야키(Arata Miyauchi)가 쓴 것처럼 Iot가 진행하면 거기서 얻은 데이터와 머신러닝, 딥러닝을 병용하면 더 편리하고 재미있고 즐거운 세상이 우리를 기다리고 있지 않을까

금후


앞으로 SVM, 논리 회귀, TensorFolow를 사용해 신경 네트워크를 통해 정밀도를 더욱 높일 수 있기를 바란다.

이번에 사용한 도구.


이번에 사용한 복제와 HTML에서 지정한 요소의 내용을 추출하는 도구는 스스로 만든 것이다.
github에 코드가 있어서 마음대로 사용할 수 있지만 아직 좋지 않습니다. 사용할 때 스스로 책임을 져야 합니다.

이상


기계 학습의 통용성의 고도와 즐거움을 느낄 수 있다면 좋겠다.

좋은 웹페이지 즐겨찾기