Crates.io | parsed_to_plot |
lib.rs | parsed_to_plot |
version | 0.2.0 |
source | src |
created_at | 2023-04-10 04:56:38.224072 |
updated_at | 2023-05-12 11:21:21.290372 |
description | plots constituency trees and dependency trees given by strings. |
homepage | |
repository | https://github.com/Sabn0/ParsedToPlot-Rs |
max_upload_size | |
id | 834834 |
size | 138,181 |
Plots constituency trees and dependency trees given by strings.
Primarily written for inputs like parsed syntactic trees, but can serve other inputs, such as mathematical expressions etc. The program first transforms the input to a conll / tree, then plots the structure, recursively. It is mostly suitable for short parsed sequences of up to 15-20 tokens. The program is a simple drawing program, plots strings that are already parsed. This is not a parser! I wrote this in order to get familiar with Rust and decided to upload it if it can help others. The code uses both the id-tree crate and the plotters crate.
See examples below.
How to use the API in order to produce a png from a single parsed constituency string:
// Example parsed sentence:
// (S (NP (det The) (N people)) (VP (V watch) (NP (det the) (N game))))
use parsed_to_plot::Config;
use parsed_to_plot::String2Tree;
use parsed_to_plot::Tree2Plot;
use parsed_to_plot::String2StructureBuilder;
use parsed_to_plot::Structure2PlotBuilder;
let mut constituency = String::from("(S (NP (det The) (N people)) (VP (V watch) (NP (det the) (N game))))");
let mut string2tree: String2Tree = String2StructureBuilder::new();
string2tree.build(&mut constituency).unwrap(); // build the tree from the string
let tree = string2tree.get_structure();
// build plot from tree and save
Config::make_out_dir(&"Output".to_string()).unwrap();
let save_to: &str = "Output/constituency_plot.png";
let mut tree2plot: Tree2Plot = Structure2PlotBuilder::new(tree);
tree2plot.build(save_to).unwrap();
How to use the API in order to produce a png from a single conll format:
// Example conll:
// 0 The the det _ _ 1 det _ _
// 1 people people NOUN _ _ 2 nsubj _ _
// 2 watch watch VERB _ _ 2 ROOT _ _
// 3 the the DET _ _ 4 det _ _
// 4 game game NOUN _ _ 2 dobj _ _
use parsed_to_plot::Config;
use parsed_to_plot::String2Conll;
use parsed_to_plot::Conll2Plot;
use parsed_to_plot::String2StructureBuilder;
use parsed_to_plot::Structure2PlotBuilder;
let mut dependency = [
"0 The the DET _ _ 1 det _ _",
"1 people people NOUN _ _ 2 nsubj _ _",
"2 watch watch VERB _ _ 2 ROOT _ _",
"3 the the DET _ _ 4 det _ _",
"4 game game NOUN _ _ 2 dobj _ _"
].map(|x| x.to_string()).to_vec();
let mut string2conll: String2Conll = String2StructureBuilder::new();
string2conll.build(&mut dependency).unwrap(); // build the conll from the vector of strings
let conll = string2conll.get_structure();
// build plot from conll and save
Config::make_out_dir(&"Output".to_string()).unwrap();
let save_to: &str = "Output/dependency_plot.png";
let mut conll2plot: Conll2Plot = Structure2PlotBuilder::new(conll);
conll2plot.build(save_to).unwrap();
You can use a combination of the API and command-line to process multiple inputs of the same type through a file. The command-line format is as follows:
cargo run INPUT_TYPE INPUT_FILE OUTPUT_PATH
when:
For example, you can enter multiple constituencies by using the following command:
cargo run c constituencies.txt Output
With the following usage:
use parsed_to_plot::Config;
use parsed_to_plot::String2Tree;
use parsed_to_plot::Tree2Plot;
use parsed_to_plot::String2StructureBuilder;
use parsed_to_plot::Structure2PlotBuilder;
use std::env;
// collect arguments from command line
let args: Vec<String> = env::args().collect();
// note: your command line args should translate to something similar to the following:
let args: Vec<String> = ["PROGRAM_NAME", "c", "Input/constituencies.txt", "Output"].map(|x| x.to_string()).to_vec();
// run configuration protocol and inspectations
let sequences = match Config::new(&args) {
Ok(sequences) => Vec::<String>::try_from(sequences).unwrap(),
Err(config) => panic!("{}", config)
};
for (i, mut constituency) in sequences.into_iter().enumerate() {
println!("working on input number {} ...", i);
let save_to = &Config::get_out_file(&args[3], i.to_string().as_str());
// build tree from consituency
let mut string2tree: String2Tree = String2StructureBuilder::new();
string2tree.build(&mut constituency).unwrap();
let tree = string2tree.get_structure();
// build plot from tree
let mut tree2plot: Tree2Plot = Structure2PlotBuilder::new(tree);
tree2plot.build(save_to).unwrap();
}
Those will save png images of constituency trees drawn for the inputs in constituencies.txt, in an Output dir. The dependency equivalent is similar.
As of version 0.2.0 you can create a string from a built structure, tree or Vec
// 0 The the det _ _ 1 det _ _
// 1 people people NOUN _ _ 2 nsubj _ _
// 2 watch watch VERB _ _ 2 ROOT _ _
// 3 the the DET _ _ 4 det _ _
// 4 game game NOUN _ _ 2 dobj _ _
use parsed_to_plot::Config;
use parsed_to_plot::String2Conll;
use parsed_to_plot::Conll2String;
use parsed_to_plot::String2StructureBuilder;
use parsed_to_plot::Structure2PlotBuilder;
let example = [
"0 The the DET _ _ 1 det _ _",
"1 people people NOUN _ _ 2 nsubj _ _",
"2 watch watch VERB _ _ 2 ROOT _ _",
"3 the the DET _ _ 4 det _ _",
"4 game game NOUN _ _ 2 dobj _ _"
].map(|x| x.to_string()).to_vec();
let mut dependency = example.clone();
let mut string2conll: String2Conll = String2StructureBuilder::new();
string2conll.build(&mut dependency).unwrap(); // build the conll from the vector of strings
let conll = string2conll.get_structure();
// from v0.2.0 - reconstruction of the original dependency from the built conll
Config::make_out_dir(&"Output".to_string()).unwrap();
let save_to: &str = "Output/dependency_reconstruction.txt";
let mut conll2string: Conll2String = Structure2PlotBuilder::new(conll);
conll2string.build(save_to).unwrap();
let dependency_reproduction = conll2string.get_conll();
assert_eq!(dependency_reproduction, example);
Under MIT license.