Created
July 27, 2024 14:02
-
-
Save blu3mo/12d055e94ac617d7babc5f79360d52d3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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