Python
mecab
word2vec
BashOnUbuntuOnWindows

自然言語処理で、
言語のベクトル化とか、Cos類似度とか、分かち書きとか、機械学習とか・・・・・
いろいろ興味があって挑戦はするのですが、いつも途中で挫折してしまい。。。。

挫折しても、どうせまたすぐりやたくなって、その時のための備忘録的に書いていけたならと思って書いていこうとおもっています。

ではまず、なぜBUWを使う必要があるのかというところからいきます。
なぜならば、漠然としてしまいますが、Windows10とAnacondaでJupyter Notebookを使って、いろいろやっていたのですが、Mecabがうまく動かなかったから。。。。
どのように動かなかったのかは、今は忘れてしまいました。。
しかし、とにかく、よくわからなかったということだけは、よく覚えています。

たぶん、Mecab-Python for Windowsがうまく機能してないんじゃないかなって感じでした。

ネット上で、
Mecab-PythonのLinux用のソースコードを、Windows用に書き換えてコンパイルしなすとうまくいくかも!!
とい情報を取得しても、Windows用への書き換えなんてまったく知らないし。。。。

今回も挫折か。。。。。。

そんなことが頭をよぎりながら、パソコンの前に座るのがだんだん嫌になってきたとき、ある記事を目にしました。

「bash on ubuntu on Windows」

えーっ。しかも、Windows10の標準機能っぽい。
再びパソコンの前に座る気力がわいてきました。
これなら、Linux用のMecab-Pythonそのまま使えるでしょ!!

そんなこんなで、いろいろやった結果を張り付けていければと思います。

とりあえず、以下、成功したので忘れないうちに、コードを貼り付けておきます。
環境は、以下です。
・64bit Windows10 Creatve update
・Bash on ubuntu on Windows
・Jupyter Notevook(anaconda3-4.4.0)
・python3.6

なお、ほとんどは、「@enta0701」さんのページに貼り付けていただいたコードを利用参考にさせていただいております。
ありがとうございます(..)_
http://qiita.com/enta0701/items/87cbe783aeb44ddf41ce

Macではなく、BUWで動かそうとしているからなのか、それとも何か他に原因があるのか特定できませんでしたが、元のソースコードのままだと、「.txt」ファイルをうまく読み込めませでした。

(2017/11/16追記開始)
__file__」のあたりがうまく動いてくれていないような感じでした。
(追記終了)

(2017/11/19追記開始)
__file__」でエラーがでる問題、次のように対応しました。
https://qiita.com/Chizizii/items/42a78754aa2fe6b6a29f
(追記終了)

いろいろ試してみると、「.txt」ファイルの中身が日本語の場合うまくいかないのかなと。
その後、UTF-8等の関係かと思いしつこむ挑戦したのですが、うまくいかず。。。

Windowsの深い階層に「.txt」を置くことで、パスが長すぎるのかなとか考え、動的なパスを取得することはあきらめ、比較的階層が浅く、固定パスで指定した場所に「.txt」ファイルを置くことにしました。
それに合わせて、importするものも若干削ったりしました。

で、なんとか動くところまではこじつけました!!

そのほか、入力するテキストデータなども含めて、ほぼそのまま利用させていただいています。

忘れないうちに、ソースコードだけ、貼り付けさせていただきます。

おかしな点などありましたら、やさしくご指摘ください。あまり知識がないので。。

# -*- coding: utf-8 -*-
# 言語指定 py3
# 参考元 http://qiita.com/enta0701/items/87cbe783aeb44ddf41ce

import os
import sys
import numpy as np
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

input_text = open('/mnt/c/BOW/documents.txt', 'r').read()
print(input_text)

documents = input_text.split("|")

def words(text):
    out_words = []
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(text)

    while node:
        word_type = node.feature.split(",")[0]
        if word_type in ["名詞"]:
            out_words.append(node.surface)
        node = node.next
    return out_words

def vecs_array(documents):
    docs = np.array(documents)
    vectorizer = TfidfVectorizer(
        analyzer=words,
        stop_words='|',
        min_df=1,
        token_pattern='(?u)\\b\\w+\\b'
    )
    vecs = vectorizer.fit_transform(docs)
    return vecs.toarray()

tag = ["記事A", "記事B", "記事C", "記事D", "記事E", "記事F"]
cs_array = cosine_similarity(vecs_array(documents), vecs_array(documents))

for i, cs_item in enumerate(cs_array):
    print("[" + tag[i] + "]")
    cs_dic = {}
    for j, cs in enumerate(cs_item):
        if round(cs - 1.0, 5) != 0:
            cs_dic[tag[j]] = cs
    for k, v in sorted(cs_dic.items(), key=lambda x:x[1], reverse=True):
        print("\t" + k + " : " + str(v))

(追記)ソースコードの部分に言語の指定として「py3」追加しました。
shiracamusさん、ありがとうございました。

以上。