test / app.py
Jofthomas's picture
Jofthomas HF staff
Add application file
daee091
raw history blame
No virus
4.89 kB
import os
import re
import json
import gradio as gr
from langchain import HuggingFaceHub
from langchain.output_parsers import PydanticOutputParser
from langchain import PromptTemplate
from pydantic import BaseModel, Field
from transformers import pipeline
from typing import List
import openai
openai.api_key = os.environ['OPENAI_API_TOKEN']
HUGGINGFACEHUB_API_TOKEN=os.environ["HUGGINGFACEHUB_API_TOKEN"]
classifier = pipeline("sentiment-analysis")
repo_id = "tiiuae/falcon-7b-instruct"
llm = HuggingFaceHub(huggingfacehub_api_token=HUGGINGFACEHUB_API_TOKEN,
repo_id=repo_id,
model_kwargs={"temperature":0.1, "max_new_tokens":300})
class Sentiment(BaseModel):
label: str = Field(description="Is a the above rview sentiment 'Good', or 'Bad' ?")
def sentence_builder(Model,Text):
if Model=="Sentiment analysis pipeline":
good_label,bad_label=pipeline_sentiment(Text)
if Model=="Falcon-7b-instruct":
good_label,bad_label=falcon_sentiment(Text)
if Model=="GPT-4 Function call":
good_label,bad_label=gpt4_sentiment(Text)
print({"Good": good_label, "Bad": bad_label})
return {"Good": good_label, "Bad": bad_label}
demo = gr.Interface(
sentence_builder,
[
gr.Dropdown(
["Sentiment analysis pipeline","Falcon-7b-instruct","GPT-4 Function call"], label="Model", info="Wich model to use"
),
gr.Textbox(
label="Text",
info="Review text",
lines=2,
value="I'm not sure about the origin of this product, it seems suspicious.",
),
],
"label",
examples=[
["Sentiment analysis pipeline","The product broke ! Great ..."],
["Sentiment analysis pipeline","Not sure if I like it or not."],
["Sentiment analysis pipeline","This product is just a toy."],
["Sentiment analysis pipeline","Bought a TV, received an Ipad..."],
["Sentiment analysis pipeline","Could have found the same on wish.com ."],
["Sentiment analysis pipeline","They did a wonderfull job at ripping us."],
["Sentiment analysis pipeline","Is it dropshipping ?"],
]
)
def pipeline_sentiment(text):
out = classifier(text)
print(out)
if out[0]['label'] == "NEGATIVE":
bad_label = out[0]['score']
good_label = 1 - bad_label
elif out[0]['label'] == "POSITIVE":
good_label = out[0]['score']
bad_label = 1 - good_label
print(good_label, bad_label)
return good_label, bad_label
def falcon_sentiment(text):
parser = PydanticOutputParser(pydantic_object=Sentiment)
prompt = PromptTemplate(
template="Classify the following review as Good or Bad : .\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
_input = prompt.format_prompt(query=text)
output = llm(_input.to_string())
print('Sentiment :', output)
try:
parsed_output=parser.parse(output)
print("parsed_output",parsed_output)
except:
pattern = r'\b(Good|Bad)\b'
match = re.search(pattern, output)
print(match)
print(match.group(0))
parsed_output=match.group(0)
return parsed_output=="Good",parsed_output=='Bad'
def Find_sentiment(sentence):
system_msg = {"role": "system", "content": f'You an AI that help me label sentences based on multiples features'}
# Initialize messages array
messages = [system_msg]
message=f"Sentence: {sentence}, based on the sentence, fin the best sentiment to discribe this sentence."
messages.append({"role": "user", "content": message})
try:
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=messages,
functions=[
{
"name": "set_sentiment",
"description": "Set the sentiment of the sentence.",
"parameters": {
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"description": "A Sentiment between 'Good' or 'Bad'",
},
},
"required": ["sentiment"],
},
}
],
function_call={"name": "set_sentiment"},
)
assistant_msg = response['choices'][0]['message']
response_options = assistant_msg.to_dict()['function_call']['arguments']
options = json.loads(response_options)
return options["sentiment"]
except openai.error.OpenAIError as e:
print("Some error happened here.",e)
return
def gpt4_sentiment(text):
out=Find_sentiment(text)
return out=="Good",out=='Bad'
if __name__ == "__main__":
demo.launch()