File size: 3,422 Bytes
f7c86a4
3dd590c
e0b928c
 
 
 
 
 
 
 
 
 
 
 
79f1e27
e0b928c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79f1e27
e0b928c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79f1e27
e0b928c
38e02fd
 
 
 
 
 
 
e0b928c
 
 
 
 
 
bd17aeb
38e02fd
 
 
e0b928c
 
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
from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoConfig
import gradio as gr
from torch.nn import functional as F
import seaborn
import matplotlib
import platform
from transformers.file_utils import ModelOutput
if platform.system() == "Darwin":
    print("MacOS")
    matplotlib.use('Agg')
import matplotlib.pyplot as plt
import io
from PIL import Image
import matplotlib.font_manager as fm

# global var
MODEL_NAME = 'yseop/distilbert-base-financial-relation-extraction'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME)
config = AutoConfig.from_pretrained(MODEL_NAME)
MODEL_BUF = {
    "name": MODEL_NAME,
    "tokenizer": tokenizer,
    "model": model,
    "config": config
}
font_dir = ['./']
for font in fm.findSystemFonts(font_dir):
    print(font)
    fm.fontManager.addfont(font)
plt.rcParams["font.family"] = 'NanumGothicCoding'

def change_model_name(name):
    MODEL_BUF["name"] = name
    MODEL_BUF["tokenizer"] = AutoTokenizer.from_pretrained(name)
    MODEL_BUF["model"] = AutoModelForSequenceClassification.from_pretrained(name)
    MODEL_BUF["config"] = AutoConfig.from_pretrained(name)
def predict(model_name, text):
    if model_name != MODEL_NAME:
        change_model_name(model_name)
    
    tokenizer = MODEL_BUF["tokenizer"]
    model = MODEL_BUF["model"]
    config = MODEL_BUF["config"]
    tokenized_text = tokenizer([text], return_tensors='pt')
    model.eval()
    output, attention = model(**tokenized_text, output_attentions=True, return_dict=False)
    output = F.softmax(output, dim=-1)
    result = {}
    
    for idx, label in enumerate(output[0].detach().numpy()):
        result[config.id2label[idx]] = float(label)
    return result
if __name__ == '__main__':
    text1 = 'An A-B trust is a joint trust created by a married couple for the purpose of minimizing estate taxes.'
    text2 = 'For example, if the supply of reserves in the fed funds market is greater than the demand, then the fed funds rate falls, and if the supply of reserves is less than the demand, the rate rises.'
    text3 = 'Coupon dates are the dates on which the bond issuer will make interest payments.'
    text4 = "Two features of a bond—credit quality and time to maturity—are the principal determinants of a bond's coupon rate."
    text5 = "When an investment sale is less than a standard lot, it's referred to as a job lot."
    text6 = 'Most bonds can be sold by the initial bondholder to other investors after they have been issued.'
    text7 = 'A bond could be thought of as an I.O.U. between the lender and borrower.'
    model_name_list = [
        'yseop/distilbert-base-financial-relation-extraction'
    ]
    #Create a gradio app with a button that calls predict()
    app = gr.Interface(
        fn=predict,
        inputs=[gr.inputs.Dropdown(model_name_list, label="Model Name"), 'text'], outputs=['label'], 
        examples = [[MODEL_BUF["name"], text1], [MODEL_BUF["name"], text2], [MODEL_BUF["name"], text3], [MODEL_BUF["name"], text4], [MODEL_BUF["name"], text5], [MODEL_BUF["name"], text6], [MODEL_BUF["name"], text7]],
        title="FReE (Financial Relation Extraction)",
        description="A model capable of detecting the presence of a relationship between financial terms and qualifying the relationship in case of its presence."
        )
    app.launch(inline=False)