Skip to content

Instantly share code, notes, and snippets.

@blu3mo
Created July 27, 2024 14:02
Show Gist options
  • Save blu3mo/12d055e94ac617d7babc5f79360d52d3 to your computer and use it in GitHub Desktop.
Save blu3mo/12d055e94ac617d7babc5f79360d52d3 to your computer and use it in GitHub Desktop.
from flask import Flask, request, render_template_string
import requests
from openai import OpenAI
import concurrent.futures
import logging
SEMANTIC_SCHOLAR_API_KEY=
OPENAI_API_KEY=
# Initialize the OpenAI client
client = OpenAI(api_key=OPENAI_API_KEY)
app = Flask(__name__)
# Set the Semantic Scholar API URL
SEMANTIC_SCHOLAR_API_URL = 'https://api.semanticscholar.org/graph/v1'
# Configure logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# Function to search for papers
def search_papers(query, limit=3):
logging.debug(f"Searching for papers with query: {query}")
url = f"{SEMANTIC_SCHOLAR_API_URL}/paper/search"
params = {'query': query} #, 'limit': limit}
response = requests.get(url, params=params)
if response.status_code == 200:
logging.debug(f"Found papers for query: {query}")
return response.json().get('data', [])
logging.error(f"Failed to search papers for query: {query}")
return []
# Function to get paper data
def get_paper_data(paper_id):
logging.debug(f"Fetching paper data for paper_id: {paper_id}")
url = f"{SEMANTIC_SCHOLAR_API_URL}/paper/{paper_id}"
params = {'fields': 'title,year,abstract,authors.name'}
headers = {'x-api-key': SEMANTIC_SCHOLAR_API_KEY}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
logging.debug(f"Retrieved paper data for paper_id: {paper_id}")
return response.json()
logging.error(f"Failed to get paper data for paper_id: {paper_id}")
return None
# Function to generate summary using GPT-4
def generate_summary(text):
logging.debug("Generating summary using GPT-4")
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an assistant that helps summarize academic papers in Japanese."},
{"role": "user", "content": f"次の論文の要約を日本語で生成してください:{text}"}
],
max_tokens=1000
)
logging.debug("Summary generation completed")
return response.choices[0].message.content.strip()
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
input_text = request.form['paper_list']
queries = input_text.splitlines()
summaries = []
def process_query(query):
papers = search_papers(query)
if not papers:
return f"論文が見つかりませんでした: {query}\n"
paper_id = papers[0]['paperId']
paper_details = get_paper_data(paper_id)
if not paper_details:
return f"論文詳細を取得できませんでした: {query}\n"
abstract = paper_details.get('abstract', 'アブストラクトがありません')
summary = generate_summary(abstract)
return f"タイトル: {paper_details['title']}\n要約: {summary}\n"
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_query = {executor.submit(process_query, query): query for query in queries}
for future in concurrent.futures.as_completed(future_to_query):
query = future_to_query[future]
try:
summaries.append(future.result())
except Exception as exc:
logging.error(f"Query {query} generated an exception: {exc}")
summaries.append(f"エラーが発生しました: {query}\n")
return render_template_string(TEMPLATE, summaries=summaries)
return render_template_string(TEMPLATE)
TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>論文要約ツール</title>
</head>
<body>
<h1>論文要約ツール</h1>
<form method="post">
<textarea name="paper_list" rows="10" cols="50" placeholder="論文のURL、タイトル、DOIを一行につき一つ入力してください"></textarea><br>
<input type="submit" value="要約を生成">
</form>
{% if summaries %}
<h2>要約結果</h2>
<pre>{{ summaries|join('\n') }}</pre>
{% endif %}
</body>
</html>
"""
if __name__ == '__main__':
app.run(debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment