
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)