ニュース記事からTF-IDFの手法を用いて重要なワードを取り出す

  • URLをコピーしました!
目次

はじめに

ニュースの記事をスクレイピングするなどしてある程度たまってきたときに、そこにある重要なキーワードを探してみます。この重要なキーワードを分類していくことでも、ポジティブなニュースかネガティブなニュースかを分析することができるようになるはずです。

テキストデータの前処理(英文の場合)

データの前処理は、テキストデータをクリーニングし、分析や機械学習モデルに適した形式に変換する重要なステップです。以下に、一般的なテキスト前処理の手順を示します。

  • 必要なライブラリをインポートします。
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
  • 必要なデータをダウンロードします(1回だけ実行):
nltk.download("stopwords")
nltk.download("wordnet")
  • ストップワードを設定し、テキストの前処理関数を定義します:
stop_words = set(stopwords.words("english"))
lemmatizer = WordNetLemmatizer()

def preprocess_text(text):
    # 小文字に変換
    text = text.lower()
    
    # URLを除去
    text = re.sub(r"http\S+|www\S+|https\S+", "", text, flags=re.MULTILINE)
    
    # 数字と句読点を除去
    text = re.sub(r'\d+', '', text)
    text = re.sub(r'[^\w\s]', '', text)
    
    # テキストをトークン化
    tokens = nltk.word_tokenize(text)
    
    # ストップワードと単一文字の単語を除去
    tokens = [token for token in tokens if token not in stop_words and len(token) > 1]
    
    # 単語を原型(レンマ)に変換
    lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]
    
    # トークンを連結して前処理されたテキストを返す
    return " ".join(lemmatized_tokens)
  • データフレーム内のニュース記事に前処理関数を適用します:
df["processed_news"] = df["news"].apply(preprocess_text)

この例では、テキストを小文字に変換し、URL、数字、句読点を削除し、トークン化してストップワードを除去し、最後に単語の原型(レンマ)に変換しています。

テキストデータの前処理(日本語)

日本語のテキストデータの前処理には、形態素解析が必要です。形態素解析とは、文章を最小単位の意味を持つ単語(形態素)に分割し、品詞情報を付与する処理です。日本語の形態素解析には、MeCabやJanomeなどのライブラリが利用できます。

以下に、日本語のテキストデータの前処理例を示します。

  1. 必要なライブラリをインストールし、インポートします。
!pip install janome
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenfilter import *
  1. Janomeの設定と前処理関数を定義します。
# 形態素解析器のインスタンス化
tokenizer = Tokenizer()

# フィルターの定義
char_filters = [UnicodeNormalizeCharFilter()]
token_filters = [POSKeepFilter(['名詞']), LowerCaseFilter(), ExtractAttributeFilter('base_form')]

# 解析器のインスタンス化
analyzer = Analyzer(char_filters, tokenizer, token_filters)

def preprocess_text_japanese(text):
    # 形態素解析とフィルタリング
    tokens = [token for token in analyzer.analyze(text)]
    
    # トークンを連結して前処理されたテキストを返す
    return " ".join(tokens)
  1. データフレーム内のニュース記事に前処理関数を適用します。
df["processed_news"] = df["news"].apply(preprocess_text_japanese)

この例では、Janomeの形態素解析器を使用してテキストデータを処理し、名詞だけを抽出しています。また、UnicodeNormalizeCharFilterを使用してテキストを正規化しています。

データベースに格納された記事から重要ワードを抽出

前処理ができたので、実際に重要なワードを取り出してみます。ここでは、ある企業ごとに重要なワードトップ10を作成するようにしています。

sqliteのdb ”stock_data.db”に
・date:日付
・ticker:企業コード
・news:ニュースの記事本文
がnews_tableというテーブルに格納されているとします。

必要なライブラリをインポートします。

import sqlite3
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

SQLiteデータベースに接続し、データを取得します。

conn = sqlite3.connect("stock_data.db")
query = "SELECT * FROM news_table"
df = pd.read_sql_query(query, conn)

TfidfVectorizerを使用して、TF-IDF値を計算します。

vectorizer = TfidfVectorizer(max_features=10) # 上位10件のキーワードに制限
tfidf_matrix = vectorizer.fit_transform(df["news"])

トップ10のキーワードとそのTF-IDF値を取得し、データフレームに格納します。

keywords_df = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names())
keywords_df["date"] = df["date"]
keywords_df["ticker"] = df["ticker"]

新しいテーブルを作成し、キーワードデータをデータベースに挿入します。

keywords_df.to_sql("keywords_table", conn, if_exists="replace", index=False)
conn.close()

まとめ

ニュース記事から重要な単語を抽出する方法について記載しています。意味のあるデータの抽出のためには十分なデータ量が必要となりますが、計算量が多いため大量データの処理には時間が必要となります。

バーマン
プロダクトマネージャー
ソフトウェア開発に長く従事しています。
・機械学習のサンプルコード作成
・生成型AIから調べたことのまとめ
・これまでのビジネスで経験したことのまとめ
を記事として作成させていただいています。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次