| /// Result of a distance/similarity algorithm. |
| pub struct Result<R> { |
| /// Indicates if it is a distance or a similarity metric. |
| pub(crate) is_distance: bool, |
| |
| /// Absolute raw value of the metric. |
| pub(crate) abs: R, |
| |
| /// Maximum possible value for the input of the given length. |
| pub(crate) max: R, |
| |
| /// Length of the first analyzed sequence. |
| pub(crate) len1: usize, |
| |
| /// Length of the second analyzed sequence. |
| pub(crate) len2: usize, |
| } |
| |
| impl Result<usize> { |
| /// Raw value of the metric. |
| /// |
| /// It is equivalent to `dist` for distance metrics |
| /// and to `sim` for similarity metrics. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.val() == 3); |
| /// |
| pub fn val(&self) -> usize { |
| self.abs |
| } |
| |
| /// Absolute distance. |
| /// |
| /// A non-negative number showing how different the two sequences are. |
| /// Two exactly the same sequences have the distance 0. |
| /// |
| /// The highest possible number varies based on the length of the input strings. |
| /// Most often, each increment of this value indicates one symbol that differs |
| /// in the input sequences. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.dist() == 3); |
| /// |
| pub fn dist(&self) -> usize { |
| if self.is_distance { |
| self.abs |
| } else { |
| self.max - self.abs |
| } |
| } |
| |
| /// Absolute similarity. |
| /// |
| /// A non-negative number showing how similar the two sequences are. |
| /// Two absolutely different sequences have the similarity 0. |
| /// |
| /// The highest possible number varies based on the length of the input strings. |
| /// Most often, each increment of this value indicates one symbol that is the same |
| /// in both sequences. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.sim() == 1); // "a" |
| /// |
| pub fn sim(&self) -> usize { |
| if self.is_distance { |
| self.max - self.abs |
| } else { |
| self.abs |
| } |
| } |
| |
| /// Normalized raw value of the metric. |
| /// |
| /// It is equivalent to `ndist` for distance metrics |
| /// and to `nsim` for similarity metrics. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.nval() == 3.0 / 4.0); |
| /// |
| pub fn nval(&self) -> f64 { |
| if self.is_distance { |
| self.ndist() |
| } else { |
| self.nsim() |
| } |
| } |
| |
| /// Normalized distance. |
| /// |
| /// A number from 0.0 to 1.0 showing how different the two sequences are. |
| /// 0.0 indicates that the sequences are the same, |
| /// and 1.0 indicates that the sequences are very different. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.ndist() == 3.0 / 4.0); |
| /// |
| pub fn ndist(&self) -> f64 { |
| if self.max == 0 { |
| self.dist() as f64 |
| } else { |
| self.dist() as f64 / self.max as f64 |
| } |
| } |
| |
| /// Normalized similarity. |
| /// |
| /// A number from 0.0 to 1.0 showing how similar the two sequences are. |
| /// 0.0 indicates that the sequences are very different, |
| /// and 1.0 indicates that the sequences are the same. |
| /// |
| /// use textdistance::{Algorithm, Hamming}; |
| /// let h = Hamming::default(); |
| /// let res = h.for_str("abc", "acbd"); |
| /// assert!(res.nsim() == 1.0 / 4.0); |
| /// |
| pub fn nsim(&self) -> f64 { |
| if self.max == 0 { |
| 1.0 |
| } else { |
| self.sim() as f64 / self.max as f64 |
| } |
| } |
| } |
| |
| impl Result<f64> { |
| /// Normalized raw value of the metric. |
| /// |
| /// It is equivalent to `ndist` for distance metrics |
| /// and to `nsim` for similarity metrics. |
| /// |
| /// use textdistance::{Algorithm, Jaro}; |
| /// let h = Jaro::default(); |
| /// let res = h.for_str("test", "tset"); |
| /// assert_eq!(res.nval(), 0.9166666666666666); |
| /// |
| pub fn nval(&self) -> f64 { |
| self.abs |
| } |
| |
| /// Normalized distance. |
| /// |
| /// A number from 0.0 to 1.0 showing how different the two sequences are. |
| /// 0.0 indicates that the sequences are the same, |
| /// and 1.0 indicates that the sequences are very different. |
| /// |
| /// use textdistance::{Algorithm, Jaro}; |
| /// let h = Jaro::default(); |
| /// let res = h.for_str("test", "tset"); |
| /// assert_eq!(res.ndist(), 0.08333333333333337); |
| /// |
| pub fn ndist(&self) -> f64 { |
| if self.is_distance { |
| self.abs |
| } else { |
| self.max - self.abs |
| } |
| } |
| |
| /// Normalized similarity. |
| /// |
| /// A number from 0.0 to 1.0 showing how similar the two sequences are. |
| /// 0.0 indicates that the sequences are very different, |
| /// and 1.0 indicates that the sequences are the same. |
| /// |
| /// use textdistance::{Algorithm, Jaro}; |
| /// let h = Jaro::default(); |
| /// let res = h.for_str("test", "tset"); |
| /// assert_eq!(res.nsim(), 0.9166666666666666); |
| /// |
| pub fn nsim(&self) -> f64 { |
| if self.is_distance { |
| self.max - self.abs |
| } else { |
| self.abs |
| } |
| } |
| } |