Python - スクレイピングと自然言語処理
###▼目的:
記事の類似度を記事内の単語から簡単に評価したい。
###▼ステップ
①urllibを使ってURLからHTMLを取得
②BeautifulSoupを使って、HTMLから記事を取得(スクレイピング)
③Mecabを使って、名詞を抽出(形態素解析)
④TF-IDFを使って、単語の出現頻度、単語の希少度を判定
⑤TF-IDFベクトルを使ってコサイン類似度を計算し、記事ごとの類似度を計算
#####▼準備
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から記事を取得(スクレイピング)
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を使って、名詞を抽出(形態素解析)
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を使って、単語の出現頻度、単語の希少度を判定
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ベクトルを使ってコサイン類似度を計算し、記事ごとの類似度を計算
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を代入するのをなくしたい
・結果の出力をもっと見やすい形にしたい
・各工程の結果も出力したい