こんにちは。
コロナウィルスが猛威を振るっていますね。
そのせいでNYダウや日経平均が暴落しており、
このまま景気後退期へ入ってしまうのかと心配しています。
最近自分の中の目標として、記事のリライトを自動化したいなーというものがあります。
手ごろな記事をリライトした後、自分の意見や経験をもとに追記、再リライトし、
新しい記事として投稿する、みたいな。
それを実現すべく、キーワードの類義語を自動的に取得してくれるツールを
作成してみました。
実装するにあたり色々調査した内容について、備忘録として残しておきます。
使用した言語は Python、類義語取得に使用したのは Word2Vec と呼ばれる手法です。
Word2Vec とは
Word2Vec は、大量のテキストデータをプログラムによって解析し、
そこに含まれる各単語の意味をベクトルによって表現化する手法です。
2013年に Google が開発したもので、書籍やネット、論文でも
その仕組みについては公開されています。
自然言語処理の分野では、非常に重要な技術の1つになっているようです。
「同じ意味、似た意味の単語は、似た文脈の中に登場する」
という考えに基づき、各単語をベクトルによる数値化していきます。
単語をベクトルで表現することにより、
各単語同士の意味の近さを計算して数値化することが出来たり、
各単語同士の意味を足し算や引き算で計算することができます。
・・・ と、正直僕自身これくらいのざっくりしたイメージしか持っていません^^;
Word2Vec の詳細については、以下のページがかなりわかりやすく説明されています。
詳しく知りたい方は読んでみると良いでしょう。
【参考】
word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり
|
|
Word2Vec を Windows 環境で使用する前準備
Word2Vec を使用するにあたり、モデルと呼ばれる学習データを作成する必要があります。
その際に使用するモジュールなどを先にインストールしておきます。
・・・ただ、自前でモデルを作成するまでもなく、既に有志の方々によるモデルが
後悔されていますので、そちらを使用するのもありです。
その場合、このモデル作成手順は不要です。
モデル作成には結構時間がかかりますので、こういったサービスはありがたいですね。
gensim モジュールをインストール
Powershell で以下のコマンドを実行するだけで OK です。
(僕のPC環境は Windows10 64bit / python3.7 です)
1 2 3 |
pip install gensim |
↓実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
> python -V Python 3.7.1 PS C:\Users\RYO> pip install gensim Collecting gensim Downloading gensim-3.8.1-cp37-cp37m-win_amd64.whl (24.2 MB) |■■■■■■■■■■■■■■■■| 24.2 MB 3.3 MB/s Collecting scipy>=0.18.1 Downloading scipy-1.4.1-cp37-cp37m-win_amd64.whl (30.9 MB) |■■■■■■■■■■■■■■■■| 30.9 MB 6.8 MB/s Requirement already satisfied: six>=1.5.0 in c:\applications\49_python\lib\site-packages (from gensim) (1.14.0) Requirement already satisfied: numpy>=1.11.3 in c:\applications\49_python\lib\site-packages (from gensim) (1.18.1) Collecting smart-open>=1.8.1 Downloading smart_open-1.9.0.tar.gz (70 kB) |■■■■■■■■■■■■■■■■| 70 kB 2.2 MB/s Collecting boto>=2.32 Downloading boto-2.49.0-py2.py3-none-any.whl (1.4 MB) |■■■■■■■■■■■■■■■■| 1.4 MB ... Requirement already satisfied: requests in c:\applications\49_python\lib\site-packages (from smart-open>=1.8.1->gensim) (2.22.0) Collecting boto3 Downloading boto3-1.12.11-py2.py3-none-any.whl (128 kB) |■■■■■■■■■■■■■■■■| 128 kB 6.8 MB/s Requirement already satisfied: idna<2.9,>=2.5 in c:\applications\49_python\lib\site-packages (from requests->smart-open>=1.8.1->gensim) (2.8) Requirement already satisfied: certifi>=2017.4.17 in c:\applications\49_python\lib\site-packages (from requests->smart-open>=1.8.1->gensim) (2019.11.28) Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\applications\49_python\lib\site-packages (from requests->smart-open>=1.8.1->gensim) (3.0.4) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\applications\49_python\lib\site-packages (from requests->smart-open>=1.8.1->gensim) (1.25.7) Collecting s3transfer<0.4.0,>=0.3.0 Downloading s3transfer-0.3.3-py2.py3-none-any.whl (69 kB) |■■■■■■■■■■■■■■■■| 69 kB 3.5 MB/s Collecting jmespath<1.0.0,>=0.7.1 Downloading jmespath-0.9.5-py2.py3-none-any.whl (24 kB) Collecting botocore<1.16.0,>=1.15.11 Downloading botocore-1.15.11-py2.py3-none-any.whl (5.9 MB) |■■■■■■■■■■■■■■■■| 5.9 MB 1.7 MB/s Collecting python-dateutil<3.0.0,>=2.1 Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB) |■■■■■■■■■■■■■■■■| 227 kB 6.4 MB/s Collecting docutils<0.16,>=0.10 Downloading docutils-0.15.2-py3-none-any.whl (547 kB) |■■■■■■■■■■■■■■■■| 547 kB 6.4 MB/s Installing collected packages: scipy, boto, jmespath, python-dateutil, docutils, botocore, s3transfer, boto3, smart-open, gensim Running setup.py install for smart-open ... done Successfully installed boto-2.49.0 boto3-1.12.11 botocore-1.15.11 docutils-0.15.2 gensim-3.8.1 jmespath-0.9.5 python-dateutil-2.8.1 s3transfer-0.3.3 scipy-1.4.1 smart-open-1.9.0 |
MeCab をインストール
Mecab はオープンソースの形態素解析エンジンで、
文章を分かち書きにする際に使用します。
インストールされていない場合は、以下のページを参考にインストールしておいてください。

|
|
Word2Vec で使用するモデルの作成
Word2Vec では、コーパスと呼ばれる
テキストを大量に集めてデータベース化したものを利用してモデルを作成します。
コーパスの作成
僕は Wikipedia のデータを使用しました。
以下のコマンドを powershell 上にて実行し、ローカルにファイルをダウンロードします。
僕がダウンロードした際は、約2.8GBの大容量だったため、ダウンロードには
かなりの時間を要しました(20分くらい?)
1 2 3 |
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2 |
ダウンロード中の画面はこんな感じ↓
「jawiki-latest-pages-articles.xml.bz2」というファイルがダウンロードされます。
ダウンロードしたファイルは解凍せずに使用します。
XML ファイルをパースして Wiki本文だけを入手するため、
以下のサイトで公開されているフリーツールを使用し、コマンドを実行します。
A tool for extracting plain text from Wikipedia dumps
上のリンクから、画面右側にある「Clone or download」をクリックしてください。
「wikiextractor-master.zip」というファイルがダウンロードされるので、
適当なフォルダに解凍します。
解凍したフォルダ内に移動し、「WikiExtractor.py」ファイルを実行します。
実行時の引数として、先ほどダウンロードした Wikipedia のダンプファイルを指定します。
ダウンロード同様、かなり時間かかります。
1 2 3 |
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2 |
ツールの実行結果は、WikiExtractor.py ファイルと同じ階層に
text ディレクトリが作成され、その中に大量のテキストファイルとして出力されます。
次は、分割して出力された数千のファイル群を、1つのファイルへ集約します。
以下のコマンドを powerShell から実行します。
1 2 3 |
Get-ChildItem ".\text" -Recurse -File -Filter "wiki_*" | Get-Content | Add-Content "output.txt" |
モデルの作成前準備
上手順で作成したコーパスを利用し、モデルを作成します。
コマンドプロンプトを開き、先ほどの output.txt のあるフォルダへ移動した後、
以下のコマンドを実行します。
1 2 3 |
mecab -O wakati output.txt -o wiki_wakati.txt |
さらに、文字コードを UTF-8 へそろえるため、以下のコマンドを実行します。
(処理終了までに少し時間がかかります。5分程度でしょうか。)
1 2 3 |
nkf -w --overwrite wiki_wakati.txt |
※ Default では、Windows で nkf コマンドを使用することができなかったため、
以下サイトを参考にして nkf コマンドを導入しました。
nkfツールで文字コードを変換する(Windows編)
ここまでで、モデルを作成する準備が整いました。
後は下の Python ファイルを作成し実行することで、
作成したコーパスをもとにモデルを作成することができます。
モデルの作成
作成したコーパスをもとに、モデルを作成していきます。
以下の python プログラムを実行します。
処理完了まで結構時間がかかるため、処理進捗がわかりやすいように
logging による標準出力機能を入れてあります。
1 2 3 4 5 6 7 8 9 10 |
from gensim.models import word2vec import logging logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) sentences = word2vec.Text8Corpus('【コーパスのパス】') model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15) model.save("【モデル名】") |
ローカルフォルダにモデルが作成されているのを確認してください。
ここまでで word2vec を使用する準備は完了です。
|
|
Word2Vec を利用したキーワードの類義語調査
上手順で作成したモデルを使って、引数で与えたキーワードの類義語を返却する関数を作成してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 必要なモジュールをインポート from gensim.models import word2vec # モデルのパスを指定 model_path = "./model/wiki.model" # 引数の類義語のリストを返却する関数 def get_synonym_word_by_word2vec(word): synonym_list=[] model = word2vec.Word2Vec.load(model_path) results = model.wv.most_similar(positive=[word]) for result in results: synonym_list.append(result[0]) return synonym_list |
tmp = get_synonym_word_by_word2vec(“対象語”)[0]
などとすれば、一番意味の近しい類義語を取得できます。
この関数を利用すれば、文章内の名詞や形容詞を上手い具合に
類義語で変換してくれるため、簡易的なリライトが可能になるでしょう。
その場合、リライト対象の文章を品詞ごとに分割するなどの処理が必要になるので、
MeCab を使って文章を分かち書きにするなどの処理を入れてやる必要がありそうです。
最後に
今回作成した関数を上手く使えば、何かアフィリエイトやアドセンスに役立つツール、
面白いツール、便利なツールを作成できそうですね。
何かアイディアが浮かんだら、ツール化して特典で配布してみようかなー なんて考えています。
あまり期待せずお待ちいただければと思います。
本記事を作成するにあたり、色々と参考にさせていただいたサイト運営の方々に感謝いたします。
【参考】
【Python】Word2Vecの使い方
コメント