| from utca.core import RenameAttribute
|
| from utca.implementation.predictors import (
|
| GLiNERPredictor,
|
| GLiNERPredictorConfig
|
| )
|
| from utca.implementation.tasks import (
|
| GLiNER,
|
| GLiNERPreprocessor,
|
| GLiNERRelationExtraction,
|
| GLiNERRelationExtractionPreprocessor,
|
| )
|
| from typing import Dict, Union
|
| import gradio as gr
|
|
|
| text = """
|
| Dr. Paul Hammond, a renowned neurologist at Johns Hopkins University, has recently published a paper in the prestigious journal \"Nature Neuroscience\".
|
| His research focuses on a rare genetic mutation, found in less than 0.01% of the population, that appears to prevent the development of Alzheimer's disease.
|
| Collaborating with researchers at the University of California, San Francisco, the team is now working to understand the mechanism by which this mutation confers its protective effect.
|
| Funded by the National Institutes of Health, their research could potentially open new avenues for Alzheimer's treatment.
|
| """
|
|
|
| predictor = GLiNERPredictor(
|
| GLiNERPredictorConfig(
|
| model_name = "knowledgator/gliner-multitask-large-v0.5",
|
| device = "cpu",
|
| )
|
| )
|
|
|
| pipe = (
|
| GLiNER(
|
| predictor=predictor,
|
| preprocess=GLiNERPreprocessor(threshold=0.7)
|
| )
|
| | RenameAttribute("output", "entities")
|
| | GLiNERRelationExtraction(
|
| predictor=predictor,
|
| preprocess=(
|
| GLiNERPreprocessor(threshold=0.7)
|
| | GLiNERRelationExtractionPreprocessor()
|
| )
|
| )
|
| )
|
|
|
|
|
| def process(
|
| relation: str, text, distance_threshold: str, pairs_filter: str, labels: str
|
| ) -> Dict[str, Union[str, int, float]]:
|
| pairs_filter = [tuple(pair.strip() for pair in pair.split("->")) for pair in pairs_filter.split(",")]
|
|
|
| if len(distance_threshold) < 1 or not distance_threshold or not distance_threshold.strip().isdigit():
|
| r = pipe.run({
|
| "text": text,
|
| "labels": [label.strip() for label in labels.split(",")],
|
| "relations": [{
|
| "relation": relation,
|
| "pairs_filter": pairs_filter
|
| }]
|
| })
|
| elif int(distance_threshold.strip()):
|
| r = pipe.run({
|
| "text": text,
|
| "labels": [label.strip() for label in labels.split(",")],
|
| "relations": [{
|
| "relation": relation,
|
| "pairs_filter": pairs_filter,
|
| "distance_threshold": int(distance_threshold.replace(" ", ""))
|
| }]
|
| })
|
|
|
| return r["output"]
|
|
|
| relation_e_examples = [
|
| [
|
| "worked at",
|
| text,
|
| "None",
|
| "scientist -> university, scientist -> other",
|
| "scientist, university, city, research, journal"]
|
| ]
|
|
|
| with gr.Blocks(title="Open Information Extracting") as relation_e_interface:
|
| relation = gr.Textbox(label="Relation", placeholder="Enter relation you want to extract here")
|
| input_text = gr.Textbox(label="Text input", placeholder="Enter your text here")
|
| labels = gr.Textbox(label="Labels", placeholder="Enter your labels here (comma separated)", scale=2)
|
| pairs_filter = gr.Textbox(label="Pairs Filter", placeholder="It specifies possible members of relations by their entity labels. Write as: source -> target,..")
|
| distance_threshold = gr.Textbox(label="Distance Threshold", placeholder="It specifies the max distance in characters between spans in the text")
|
| output = gr.Textbox(label="Predicted Relation")
|
| submit_btn = gr.Button("Submit")
|
| examples = gr.Examples(
|
| relation_e_examples,
|
| fn=process,
|
| inputs=[relation, input_text, distance_threshold, pairs_filter, labels],
|
| outputs=output,
|
| cache_examples=True
|
| )
|
| theme=gr.themes.Base()
|
|
|
| input_text.submit(fn=process, inputs=[relation, input_text, distance_threshold, pairs_filter, labels], outputs=output)
|
| labels.submit(fn=process, inputs=[relation, input_text, distance_threshold, pairs_filter, labels], outputs=output)
|
| pairs_filter.submit(fn=process, inputs=[relation, input_text, distance_threshold, pairs_filter, labels], outputs=output)
|
| submit_btn.click(fn=process, inputs=[relation, input_text, distance_threshold, pairs_filter, labels], outputs=output)
|
| distance_threshold.submit(fn=process, inputs=[relation, input_text, distance_threshold, pairs_filter, labels], outputs=output)
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| relation_e_interface.launch() |