見出し画像

AIとLLMを使ったウェブクローラー開発

情報はいろいろな所に集積されている。Twitter / Xはとても良い場所だが、フェイクニュースがとても問題になっている。これから、AIでフェイクニュースを認識し、それだけではなく誰がその背後に居るかまでを分析できるようなAIができたらすごいと思う。推論で、推定する訳だ。
この頃考えているアルゴリズムのアイデアとして、
1. ニュースウェブサイトを定期的にスクレイピングして、ホットキーワードを抽出する。
2. 抽出したキーワードからLLMにスキャターショット型に関連キーワードをJSONで出力してもらう。
3. 関連キーワードは類似語でも反対語でも良い。
4. ウェブクローラーを並列処理で動かして、nの数のサイクル毎にこの処理をループする。
5. そうすると、似たサイトと似ていないサイト両方がウェブクローラーによって集められる。

試しに、ChatGPT (GPT-4)によってこのコードを簡単にPythonで書いてもらうことにした。
プロンプトはこちら:

「このようなPython プログラムをrequestsとBeautiful Soupで書いてください:1. ニュースウェブサイトを定期的にスクレイピングして、ホットキーワードを抽出する。2. 抽出したキーワードからLLMにスキャターショット型に関連キーワードをJSONで出力してもらう。3. 関連キーワードは類似語でも反対語でも良い。4. ウェブクローラーを並列処理で動かして、nの数のサイクル毎にこの処理をループする。」
さっと確認した所、ロジックはちゃんとできている。あとは肉付けのみですね。

import requests
from bs4 import BeautifulSoup
import time
import concurrent.futures

def fetch_news(url):
    try:
        response = requests.get(url)
        soup = BeautifulSoup(response.content, 'html.parser')
        articles = soup.find_all('article')
        text_data = [article.get_text() for article in articles]
        return text_data
    except requests.RequestException as e:
        print(f"Request failed: {e}")
        return []

def extract_keywords(text_data):
    # キーワード抽出のロジックはここに記述(NLTKや自作のアルゴリズムを使用)
    return ["keyword1", "keyword2"]  # 仮のキーワードリスト

def generate_related_keywords(keywords):
    # LLMを使用して関連キーワードを生成する(ここでは仮の実装)
    return {"keyword1": ["related1", "related2"], "keyword2": ["related3", "related4"]}

def scrape_cycle(urls):
    with concurrent.futures.ThreadPoolExecutor(max_workers=len(urls)) as executor:
        results = list(executor.map(fetch_news, urls))
    keywords = []
    for result in results:
        for text in result:
            keywords.extend(extract_keywords(text))
    related_keywords = generate_related_keywords(keywords)
    return related_keywords
def main_loop(urls, cycle_count=10, sleep_time=3600):
    for _ in range(cycle_count):
        related_keywords = scrape_cycle(urls)
        print(related_keywords)
        time.sleep(sleep_time)  # 次のサイクルまでの待機時間(秒)

if __name__ == "__main__":
    news_urls = ["https://example-news-website.com"]
    main_loop(news_urls)


この記事が気に入ったらサポートをしてみませんか?