序文
言語モデルの微調整の一環として、インターネット上で大量のテキスト データを収集する必要がありますが、あるネットワークには、トレーニングに適した質の高い公開された質問と回答が多数公開されています。さて、今日はその上位 2 年間の質問と回答のリストをダウンロードします。
一連の考え
まず、質問に対する回答をクリックし、[共有] をクリックして、リンクをコピーしましょう。
リンク構造は次のとおりであることがわかります。
https://www.zhihu.com/question/431730729/answer/1591942026
質問 ID と回答 ID から構築されたリンクは、次の質問につながります。
1. 質問 ID は質問の ID、方法 過去 2 年間、ホット リストに載っていたすべての質問 ID はどうなるのでしょうか?
2. 回答 ID は回答の ID です。これはすべての質問に対して 1 つの回答を共有しているようです。ループを通じて現在の質問の回答 ID を取得する方法はありません。
3. これらの ID を取得した後、リンク内のテキストを取得するにはどうすればよいですか?
準備
1. 2020 年 11 月 24 日から始まる定期的なクロールのホット検索リストを github で見つけることができます:
https://github.com/justjavac/zhihu-trending-hot-questions
。ダウンロードして解凍し、アーカイブに入れます。フォルダー ホット検索されたすべての md ドキュメントを見つけることができます。
2. 必要なライブラリをインストールする
pip install beautifulsoup4
pip install lxml
3. コードの計画
問題に応じて、コードは 3 つの部分に分割できます。
最初の部分は、md ドキュメントからすべてのホット リスト URL リンクを抽出します。
2 番目の部分では、ホット リストの URL リンクに従って、次の回答リンクを取得します。
3 番目の部分では、質問と回答から構築された一意のリンクに基づいてページ コンテンツを取得します。
コード
すべての md ドキュメントのファイル名を読み取るために、コードはデフォルトでアーカイブ ディレクトリに保存されることに注意してください。
from bs4 import BeautifulSoup
import json
import numpy as np
import requests
import os
import re
import time
#第一部分
headers = {
'content-type': 'text/html; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/111.0.0.0 Safari/537.36'}
arr = os.listdir()
print(arr)
list_total_question = []
for x in arr:
if x.endswith('.md'):
with open(x,'r',encoding='utf8') as hot_diary:
pattern = r'https://www.zhihu.com/question/(\d+)'
list_total_question+=re.findall(pattern, hot_diary.read())
print(len(list_total_question))
#第二部分
list_all_url = []
for x in list_total_question:
a1 = time.time()
url = 'https://www.zhihu.com/api/v4/questions/'+str(x)+'/feeds?'
datas = requests.get(url,headers=headers).json()
for info in datas['data']:
answerid = info['target']['id']
final_url = 'https://www.zhihu.com/question/'+x+'/answer/'+str(answerid)
list_all_url.append(final_url)
#break #每条问题默认提取五条问答,此处Break则只选默认排序第一条
a2 = time.time()
print(a2-a1) #0.5s
break #选一条问题进行测试
print(list_all_url)
#第三部分
list_json = []
for x in list_all_url:
html = requests.get(url=x, headers=headers)
site = BeautifulSoup(html.text, 'lxml')
title = site.find_all('meta', attrs={
'itemprop': "name"}, recursive=True, limit=1)[0].__getattribute__('attrs')[
'content']
text = site.find('div', attrs={
'class': "RichContent-inner"})
print(title)
total_string = ""
for i in text:
if i.text.find('.css') == -1:
total_string += i.text
dict_json = {
"instruction":title,"input":"","output":total_string}
list_json.append(dict_json)
print(list_json)
168,500 個のホットリストをすべてクロールするには約 91,000 秒かかり、情報抽出のテストはまだ行われていませんが、単純に効果を確認したい場合は、ブレーク テストの項目を 1 つ追加できます。デフォルトでは、コードは最初の質問に対する 5 つの回答を抽出します。ファイルを保存するためのコードはここには書かれていませんが、非常に簡単です。
効果
ここで json 形式で構築する目的は、ライブラリを使用して大規模な言語モデルを微調整し、不要な場合は削除することです。