multilingual/
multilingual.rs

1//! Another example in span mode, to check and illustrate the use of GLiNER-X (multilingual model).
2
3use gliner::model::output::decoded::SpanOutput;
4use orp::params::RuntimeParameters;
5use gliner::util::result::Result;
6use gliner::model::{GLiNER, input::text::TextInput, params::Parameters};
7use gliner::model::pipeline::span::SpanMode;
8
9
10// French example taken from https://huggingface.co/knowledgator/gliner-x-large
11const TEXT: &str = "Cristiano Ronaldo dos Santos Aveiro (prononciation portugaise : [kɾiʃ'tjɐnu ʁɔ'naldu] ; né le 5 février 1985) est un footballeur professionnel portugais qui joue comme attaquant et est capitaine à la fois du club d'Al Nassr en Saudi Pro League et de l'équipe nationale du Portugal. Largement considéré comme l’un des plus grands joueurs de tous les temps, Ronaldo a remporté cinq Ballons d’Or, un record de trois prix du Joueur de l’année UEFA et quatre Souliers d’or européens, le plus grand nombre pour un joueur européen. Il a remporté 33 trophées dans sa carrière, dont sept titres de championnat, cinq Ligues des champions de l’UEFA, le Championnat d'Europe et la Ligue des nations de l’UEFA. Ronaldo détient les records du plus grand nombre d'apparitions (183), de buts (140) et de passes décisives (42) en Ligue des champions, de buts dans le Championnat d'Europe (14), de buts internationaux (128) et d'apparitions internationales (205). Il est l’un des rares joueurs à avoir disputé plus de 1 200 matchs professionnels en carrière, le plus grand nombre pour un joueur de champ, et a marqué plus de 850 buts officiels en carrière en club et en sélection, ce qui fait de lui le meilleur buteur de tous les temps.";
12const LABELS: [&str; 5] = ["personne", "récompense", "date", "compétitions", "équipes"];
13const EXPECTED_ENTITIES: [[&str; 2]; 11] = [
14    ["Cristiano Ronaldo dos Santos Aveiro", "personne"],
15    ["5 février 1985", "date"],
16    ["Al Nassr", "équipes"],
17    ["Saudi Pro League", "équipes"],
18    ["équipe nationale du Portugal", "équipes"],
19    ["Ronaldo", "personne"],
20    ["Ballons d’Or", "récompense"],
21    ["Championnat d'Europe", "compétitions"],
22    ["Ligue des nations de l’UEFA", "compétitions"],
23    ["Ligue des champions", "compétitions"],
24    ["Championnat d'Europe", "compétitions"],
25];
26
27
28// Use GLiNER-X large in quantized version
29const MODEL: &str = "models/gliner-x-large/onnx/model_quantized.onnx"; // https://huggingface.co/knowledgator/gliner-x-large/blob/main/onnx/model_quantized.onnx
30const TOKENIZER: &str = "models/gliner-x-large/tokenizer.json"; // https://huggingface.co/knowledgator/gliner-x-large/blob/main/tokenizer.json
31
32
33// Load the model, perform inference, then check and print the results
34fn main() -> Result<()> {    
35    println!("Loading model...");
36    let model = GLiNER::<SpanMode>::new(Parameters::default(), RuntimeParameters::default(), TOKENIZER, MODEL)?;    
37
38    println!("Inferencing...");
39    let input = TextInput::from_str(&[TEXT], &LABELS)?;
40    let output = model.inference(input)?;
41
42    println!("Results:\n{output}");    
43
44    Ok(check_results(&output))
45}
46
47
48// Check that the output matches expectations (this code is not efficient, but it doesn't matter here)
49fn check_results(output: &SpanOutput) {
50    let spans = output.spans.first().expect("expected one sequence");
51    assert_eq!(spans.len(), EXPECTED_ENTITIES.len(), "unexpected number of entities");
52    for [text, class] in EXPECTED_ENTITIES {
53        let span = spans.iter().find(|s| s.text().eq(text)).expect(&format!("missing entity: {}", text));
54        assert_eq!(span.class(), class, "unexpected label for entity: {}", text);
55    }
56}