9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python - スクレイピングと自然言語処理(簡単に)

Last updated at Posted at 2018-05-06

Python - スクレイピングと自然言語処理

###▼目的:
記事の類似度を記事内の単語から簡単に評価したい。

###▼ステップ
①urllibを使ってURLからHTMLを取得
②BeautifulSoupを使って、HTMLから記事を取得(スクレイピング)
③Mecabを使って、名詞を抽出(形態素解析)
④TF-IDFを使って、単語の出現頻度、単語の希少度を判定
⑤TF-IDFベクトルを使ってコサイン類似度を計算し、記事ごとの類似度を計算

#####▼準備

python
import urllib.request
from time import sleep
from bs4 import BeautifulSoup
import MeCab
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

#####▼ステップ
①urllibを使ってURLからHTMLを取得
②BeautifulSoupを使って、HTMLから記事を取得(スクレイピング)

python

def url2text(urls):
    article = []
    for url in urls:
        print(url+"のデータを取得しています")
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html,"html.parser")
        soup_article = soup.find("div", class_="mw-parser-output")#Wikipediaの文書部分を抽出
        soup_article= soup_article.get_text()#タグの削除
        article.append(soup_article)
        sleep(3)  #マナーとして3秒間隔以上あける
    return article

③Mecabを使って、名詞を抽出(形態素解析)

python
def mplg(article):
    word_list = ""
    m = MeCab.Tagger ()
    m_article = m.parse (article)
    for row in m_article.split("\n"):
        word =row.split("\t")[0]#タブ区切りになっている1つ目を取り出す。ここには形態素が格納されている
        if word == "EOS":
            break
        else:
            pos = row.split("\t")[1]#タブ区切りになっている2つ目を取り出す。ここには品詞が格納されている
            slice = pos[:2]
            if slice == "名詞":
                word_list = word_list +" "+ word
    return word_list

④TF-IDFを使って、単語の出現頻度、単語の希少度を判定

python
def tfidf(word_list):
    docs = np.array(word_list)#Numpyの配列に変換する
    #単語を配列ベクトル化して、TF-IDFを計算する
    vecs = TfidfVectorizer(
                token_pattern=u'(?u)\\b\\w+\\b'#文字列長が 1 の単語を処理対象に含めることを意味します。
                ).fit_transform(docs)
    vecs = vecs.toarray()
    return vecs

⑤TF-IDFベクトルを使ってコサイン類似度を計算し、記事ごとの類似度を計算

python
def cossim(v1,v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

①~⑤の処理をまとめて計算する

def main():
    article = url2text([
            "http://mensnote.boy.jp/document/html.html",
            "http://mensnote.boy.jp/document/python.html",
            "http://mensnote.boy.jp/document/R.html"
            ])
    word_list = []
    for article in article:
        word_list.append(mplg(article))
    vecs = tfidf(word_list)
    
    print("HTMLとPython")
    print(cossim(vecs[1],vecs[0]))
    print("RとPython")
    print(cossim(vecs[1],vecs[2]))
    print("RとHTML")
    print(cossim(vecs[0],vecs[2]))

main()

#####▼実行結果:
HTMLとPython
0.23880015353328762
RとPython
0.2699773736163584
RとHTML
0.1691580768168567

#####メモ:課題
・pythonの基本構文の部分
・URLを代入するのをなくしたい
・結果の出力をもっと見やすい形にしたい
・各工程の結果も出力したい

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?