tf_idf_vectorizer/vectorizer/
serde.rs

1use num::Num;
2use serde::{ser::SerializeStruct, Deserialize, Serialize};
3
4use crate::vectorizer::{compute::compare::{Compare, DefaultCompare}, corpus::Corpus, tfidf::{DefaultTFIDFEngine, TFIDFEngine}, IDFVector, TFIDFVectorizer, TFVector};
5
6/// TFIDFVectorizerのデシリアライズ用のデータ構造
7/// これは参照を含んでいないため、シリアライズ可能です。
8/// `into_tf_idf_vectorizer`メソッドを使用して、`TFIDFVectorizer`に変換できます。
9#[derive(Debug, Deserialize, Serialize)]
10pub struct TFIDFData<N = f32, K = String, E = DefaultTFIDFEngine, C = DefaultCompare>
11where
12    N: Num + Copy,
13    E: TFIDFEngine<N>,
14{
15    /// ドキュメントのTFベクトル
16    pub documents: Vec<TFVector<N, K>>,
17    /// TFベクトルのトークンの次元サンプル
18    pub token_dim_sample: Vec<String>,
19    /// IDFベクトル
20    pub idf: IDFVector<N>,
21    #[serde(default, skip_serializing, skip_deserializing)]
22    _marker: std::marker::PhantomData<E>,
23    #[serde(default, skip_serializing, skip_deserializing)]
24    _compare_marker: std::marker::PhantomData<C>,
25}
26
27impl<N, K, E, C> TFIDFData<N, K, E, C>
28where
29    N: Num + Copy,
30    E: TFIDFEngine<N>,
31    C: Compare<N>,
32{
33    /// `TFIDFData`から`TFIDFVectorizer`に変換します。
34    /// `corpus_ref`はコーパスの参照です。
35    pub fn into_tf_idf_vectorizer<'a>(self, corpus_ref: &'a Corpus) -> TFIDFVectorizer<'a, N, K, E, C>
36    {
37        let mut instance = TFIDFVectorizer {
38            documents: self.documents,
39            token_dim_sample: self.token_dim_sample.clone(),
40            token_dim_set: self.token_dim_sample.iter().cloned().collect(),
41            corpus_ref,
42            idf: self.idf,
43            _marker: std::marker::PhantomData,
44            _compare_marker: std::marker::PhantomData,
45        };
46        instance.update_idf();
47        instance
48    }
49}
50
51impl<'a, N, K, E, C> Serialize for TFIDFVectorizer<'a, N, K, E, C>
52where
53    N: Num + Copy + Serialize,
54    K: Serialize,
55    E: TFIDFEngine<N>,
56    C: Compare<N>,
57{
58    /// TFIDFVectorizerをシリアライズします
59    /// これは参照を含んでるため、それを除外したものになります。
60    /// デシリアライズするには`TFIDFData`を使用してください。
61    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62    where
63        S: serde::Serializer,
64    {
65        let mut state = serializer.serialize_struct("TFIDFVectorizer", 3)?;
66        state.serialize_field("documents", &self.documents)?;
67        state.serialize_field("token_dim_sample", &self.token_dim_sample)?;
68        state.serialize_field("idf", &self.idf)?;
69        state.end()
70    }
71}