File size: 5,829 Bytes
cd63cf6
 
 
 
 
 
4b3bda3
cd63cf6
 
 
103de27
cd63cf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103de27
cd63cf6
103de27
 
 
cd63cf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b3bda3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd63cf6
 
 
 
103de27
 
 
 
 
 
 
 
 
 
 
cd63cf6
103de27
cd63cf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103de27
cd63cf6
 
 
 
 
 
 
 
 
 
 
 
 
103de27
cd63cf6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import json
import os
from logging import getLogger

from openai import OpenAI
from openai import AzureOpenAI
from openai import OpenAIError
import fitz

import requests
import time

from langchain.document_loaders import PyPDFLoader
from langchain.prompts import ChatPromptTemplate
from langchain.text_splitter import (  # CharacterTextSplitter,
    RecursiveCharacterTextSplitter,
)
from langchain.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser

import json
# from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# from langchain_openai import AzureChatOpenAI, AzureOpenAIEmbeddings
import csv
from bs4 import BeautifulSoup
from src.myLogger import set_logger

logger = set_logger("my_app", level="INFO")

system_prompt = """
あなたのタスクは、提供された資料が指定された会社のものであるかどうかを判断することです。以下の基準に基づいて判断を行ってください:

1. 資料に会社名が明記されているかどうかを確認してください。
2. 資料の内容の大部分が指定された会社に関する情報であるかどうかを確認してください。
これらの基準を満たしている場合、その資料は会社のものであると見なされます。出力フォーマットに従って結果を出力してください。
"""

json_schema = {
    "type": "object",
    "properties": {
        "judge": {
            "type": "integer",
            "description": "{company_name}の資料であれば1,そうでなければ0"
        },
        "reason": {
            "type": "string",
            "description": "どうしてそう判断したのか"
        }
    },
    "required": ["judge", "reason"]
}


def generate_check_(reference):
    api_key = os.getenv("OPENAI_API_KEY")
    client = OpenAI(
        api_key=api_key,
    )
    retries = 0
    max_retries = 100
    delay = 5

    while retries < max_retries:
        try:
            response = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=[
                    {
                        "role": "system",
                        "content": system_prompt,
                    },
                    {
                        "role": "user",
                        "content": reference,
                    },
                ],
                functions=[{"name": "generate_queries", "parameters": json_schema}],
                function_call={"name": "generate_queries"},
                temperature=0.0,
                top_p=0.0,
            )
            output = response.choices[0].message.function_call.arguments
            time.sleep(1)
            return output
        except OpenAIError as e:
            print(f"Error occurred: {e}. Retrying in {delay} seconds...")
            retries += 1
            time.sleep(delay)
        except Exception as e:
            print(f"Unexpected error: {e}. Retrying in {delay} seconds...")
            retries += 1
            time.sleep(delay)
    raise RuntimeError("Maximum retries exceeded. Could not get a valid response.")


def ch(company_name, reference):
    com = company_name.replace("株式会社", "")
    user_prompt = f"""
    以下の資料は,{company_name}のものであるか,理由をつけて答えてください。資料が{company_name}のものであるとは,
    資料に{company_name}と明記されておりまた資料の内容の大部分が{company_name}に関する情報であるということです。
    以下のフォーマットに従い出力してください。
    [資料]
    {reference}
    [出力フォーマット]
    {{
    judge: 0 or 1({com}の資料であれば1,そうでなければ0)
    reason: "どうしてそう判断したのか具体的に説明してください。"
    }}
    """
    ret = generate_check_(user_prompt)
    js = json.loads(ret)

    return js["judge"], js["reason"]

def pdf_to_text(url):
    # リクエストをきちんと送るためのもの
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    }
    result = requests.get(url, headers=headers, timeout=5)

    finename = (
        # "./out/" + company_name + url.replace("/", "_").replace(":", "_") + "IR.pdf"
        # url.replace("/", "_").replace(":", "+") + "IR.pdf"
        "./out/tmp.pdf"
    )
    try:
        with open(finename, "wb") as file:
            for chunk in result.iter_content(1000000000):
                file.write(chunk)
    except Exception as e:
        print(e)


    document = fitz.open(finename)

    full_text = ""

    for page_num in range(len(document)):
        page = document.load_page(page_num)

        full_text += page.get_text()
    document.close()
    return full_text

def html_to_text(url):
    # リクエストをきちんと送るためのもの
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    }
    logger.info(f"requesting {url}")
    result = requests.get(url, headers=headers, timeout=5)

    result.encoding = result.apparent_encoding
    soup = BeautifulSoup(result.text, "html.parser")
    paragraphs = soup.find_all("p")
    return "\n".join([paragraph.get_text() for paragraph in paragraphs])


def co(company_name, url):
    try:
        if url.endswith(".pdf"):
            full_text = pdf_to_text(url)
        else:
            full_text = html_to_text(url)
    except Exception as e:
        print(e)
        return -1

    reference = full_text[:10000]

    judge, reason = ch(company_name, reference)
    logger.info(f'Judge: {judge}, Reason: {reason}')
    return judge, reason