File size: 4,332 Bytes
5a18f55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import pipeline




def sentiment_analysis_generate_text(text):
    # Define the model
    model_name = "yiyanghkust/finbert-tone"

    # for faster, less model size use this model
    # model_name = "mrm8488/distilroberta-finetuned-financial-news-sentiment-analysis"

    # Create the pipeline
    nlp = pipeline("sentiment-analysis", model=model_name)
    # Split the input text into individual sentences
    sentences = text.split('|')
    # Run the pipeline on each sentence and collect the results
    results = nlp(sentences)
    output = []
    for sentence, result in zip(sentences, results):
        output.append(f"Text: {sentence.strip()}\nSentiment: {result['label']}, Score: {result['score']:.4f}\n")

    # Join the results into a single string to return
    return "\n".join(output)


def sentiment_analysis_generate_table(text):
    # Define the model
    model_name = "yiyanghkust/finbert-tone"
    # Create the pipeline
    nlp = pipeline("sentiment-analysis", model=model_name)
    # Split the input text into individual sentences
    sentences = text.split('|')

    # Generate the HTML table with enhanced colors and bold headers
    html = """
    <html>
    <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/css/bootstrap.min.css">
    <style>
    .label {
        transition: .15s;
        border-radius: 8px;
        padding: 5px 10px;
        font-size: 14px;
        text-transform: uppercase;
    }
    .positive {
        background-color: rgb(54, 176, 75);
        color: white;
    }
    .negative {
        background-color: rgb(237, 83, 80);
        color: white;
    }
    .neutral {
        background-color: rgb(52, 152, 219);
        color: white;
    }
    th {
        font-weight: bold;
        color: rgb(106, 38, 198);
    }
    </style>
    </head>
    <body>
    <table class="table table-striped">
    <thead>
        <tr>
            <th scope="col">Text</th>
            <th scope="col">Score</th>
            <th scope="col">Sentiment</th>
        </tr>
    </thead>
    <tbody>
    """
    for sentence in sentences:
        result = nlp(sentence.strip())[0]
        text = sentence.strip()
        score = f"{result['score']:.4f}"
        sentiment = result['label']

        # Determine the sentiment class
        if sentiment == "Positive":
            sentiment_class = "positive"
        elif sentiment == "Negative":
            sentiment_class = "negative"
        else:
            sentiment_class = "neutral"

        # Generate table rows
        html += f'<tr><td>{text}</td><td>{score}</td><td><span class="label {sentiment_class}">{sentiment}</span></td></tr>'

    html += """
    </tbody>
    </table>
    </body>
    </html>
    """

    return html


if __name__ == "__main__":
    # uncomment below code for using the code in text results
    # iface = gr.Interface(
    #     fn=sentiment_analysis_generate_text, 
    #     inputs="text", 
    #     outputs="text", 
    #     title="Financial Sentiment Analysis",
    #     description="<p>A sentiment analysis model fine-tuned on financial news.</p>"
    #                 "<p>Enter some financial text to see whether the sentiment is positive, neutral or negative.</p>"
    #                 "<p><strong>Note:</strong> Separate multiple sentences with a '|'.",
    #     )

    # generate the result in html format
    iface = gr.Interface(
        sentiment_analysis_generate_table,
        gr.Textbox(placeholder="Enter sentence here..."),
        ["html"],
        title="Financial Sentiment Analysis",
        description="<p>A sentiment analysis model fine-tuned on financial news.</p>"
                    "<p>Enter some financial text to see whether the sentiment is positive, neutral or negative.</p>"
                    "<p><strong>Note:</strong> Separate multiple sentences with a '|'.",
        examples=[
            ['growth is strong and we have plenty of liquidity.'],
            ['there is a shortage of capital, and we need extra financing.'],
            ['formulation patents might protect Vasotec to a limited extent.'],
            ["growth is strong and we have plenty of liquidity.|there is a shortage of capital"]
        ],
        allow_flagging=False,
        examples_per_page=2,
    )

    iface.launch()