use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap};
use super::config::{
CohesiveDeviceType, DiscourseMarkerType, RhetoricalRelationType, TransitionQuality,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseCoherenceResult {
pub overall_coherence_score: f64,
pub marker_coherence_score: f64,
pub rhetorical_structure_score: f64,
pub cohesion_score: f64,
pub transition_scores: Vec<f64>,
pub discourse_markers: Vec<DiscourseMarker>,
pub rhetorical_relations: HashMap<String, usize>,
pub detailed_metrics: Option<DetailedDiscourseMetrics>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetailedDiscourseMetrics {
pub marker_analysis: Option<DiscourseMarkerAnalysis>,
pub rhetorical_analysis: Option<RhetoricalStructureAnalysis>,
pub cohesion_analysis: Option<CohesionAnalysis>,
pub transition_analysis: Option<TransitionAnalysis>,
pub information_structure: Option<InformationStructureMetrics>,
pub advanced_analysis: Option<AdvancedDiscourseAnalysis>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseMarker {
pub marker_type: DiscourseMarkerType,
pub text: String,
pub position: (usize, usize),
pub sentence_index: usize,
pub word_index: usize,
pub context: ContextAnalysis,
pub confidence: f64,
pub rhetorical_strength: f64,
pub scope: usize,
pub syntactic_position: SyntacticPosition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextAnalysis {
pub preceding_context: Vec<String>,
pub following_context: Vec<String>,
pub semantic_coherence_preceding: f64,
pub semantic_coherence_following: f64,
pub pragmatic_appropriateness: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyntacticPosition {
pub sentence_position: String,
pub clause_boundary: bool,
pub pos_tag: String,
pub dependency_relation: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseMarkerAnalysis {
pub total_markers: usize,
pub marker_density: f64,
pub type_distribution: HashMap<DiscourseMarkerType, usize>,
pub average_confidence: f64,
pub effectiveness_score: f64,
pub context_integration: f64,
pub multiword_statistics: MultiwordMarkerStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiwordMarkerStats {
pub multiword_count: usize,
pub average_length: f64,
pub common_patterns: Vec<(String, usize)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RhetoricalStructureAnalysis {
pub relations: HashMap<RhetoricalRelationType, usize>,
pub relation_distribution_score: f64,
pub structural_complexity: f64,
pub discourse_tree: Option<DiscourseTree>,
pub nucleus_satellite_analysis: Option<NucleusSatelliteAnalysis>,
pub relation_confidences: HashMap<RhetoricalRelationType, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseTree {
pub root: DiscourseNode,
pub depth: usize,
pub node_count: usize,
pub balance_score: f64,
pub complexity_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseNode {
pub node_id: usize,
pub relation_type: RhetoricalRelationType,
pub nuclearity: String,
pub text_span: (usize, usize),
pub children: Vec<DiscourseNode>,
pub confidence: f64,
pub salience: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NucleusSatelliteAnalysis {
pub nucleus_accuracy: f64,
pub satellite_patterns: HashMap<String, usize>,
pub nuclear_chains: Vec<NuclearChain>,
pub embedding_statistics: EmbeddingStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NuclearChain {
pub chain_id: usize,
pub nuclear_elements: Vec<usize>,
pub satellites: Vec<usize>,
pub coherence_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingStats {
pub max_depth: usize,
pub average_depth: f64,
pub depth_distribution: HashMap<usize, usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CohesionAnalysis {
pub overall_cohesion_score: f64,
pub cohesive_devices: Vec<CohesiveDevice>,
pub reference_cohesion: ReferenceCohesionMetrics,
pub lexical_cohesion: LexicalCohesionMetrics,
pub conjunctive_cohesion: ConjunctiveCohesionMetrics,
pub temporal_coherence: TemporalCoherenceMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CohesiveDevice {
pub device_type: CohesiveDeviceType,
pub elements: Vec<String>,
pub positions: Vec<(usize, usize)>,
pub strength: f64,
pub local_contribution: f64,
pub global_contribution: f64,
pub resolution_confidence: f64,
pub distance: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferenceCohesionMetrics {
pub total_references: usize,
pub reference_density: f64,
pub resolution_success_rate: f64,
pub average_reference_distance: f64,
pub ambiguous_references: usize,
pub complexity_score: f64,
pub reference_chains: Vec<ReferenceChain>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferenceChain {
pub chain_id: usize,
pub entity: String,
pub referring_expressions: Vec<String>,
pub positions: Vec<(usize, usize)>,
pub coherence_score: f64,
pub completeness_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LexicalCohesionMetrics {
pub lexical_ties: usize,
pub lexical_density: f64,
pub repetition_analysis: RepetitionAnalysis,
pub synonym_networks: SynonymNetworkMetrics,
pub semantic_field_coherence: f64,
pub sophistication_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RepetitionAnalysis {
pub exact_repetitions: usize,
pub morphological_variations: usize,
pub frequent_terms: Vec<(String, usize)>,
pub distribution_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SynonymNetworkMetrics {
pub cluster_count: usize,
pub average_cluster_size: f64,
pub connectivity_score: f64,
pub major_clusters: Vec<SynonymCluster>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SynonymCluster {
pub cluster_id: usize,
pub words: Vec<String>,
pub coherence_score: f64,
pub similarity_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConjunctiveCohesionMetrics {
pub conjunction_counts: HashMap<String, usize>,
pub conjunctive_density: f64,
pub logical_flow_score: f64,
pub conjunction_effectiveness: f64,
pub complex_conjunctions: Vec<ComplexConjunction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplexConjunction {
pub text: String,
pub logical_relation: String,
pub position: (usize, usize),
pub effectiveness: f64,
pub scope: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalCoherenceMetrics {
pub temporal_marker_frequency: f64,
pub sequence_coherence: f64,
pub anchoring_score: f64,
pub timeline_consistency: f64,
pub temporal_disruptions: usize,
pub temporal_chains: Vec<TemporalChain>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalChain {
pub chain_id: usize,
pub expressions: Vec<String>,
pub ordering: Vec<usize>,
pub consistency_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransitionAnalysis {
pub transition_quality_scores: Vec<TransitionQualityScore>,
pub overall_transition_quality: f64,
pub lexical_overlap_stats: LexicalOverlapStats,
pub semantic_continuity: SemanticContinuityMetrics,
pub structural_continuity: StructuralContinuityMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransitionQualityScore {
pub position: (usize, usize),
pub quality: TransitionQuality,
pub score: f64,
pub factors: TransitionFactors,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransitionFactors {
pub lexical_overlap: f64,
pub semantic_continuity: f64,
pub structural_continuity: f64,
pub marker_presence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LexicalOverlapStats {
pub average_overlap: f64,
pub overlap_distribution: HashMap<String, usize>,
pub content_vs_function: ContentFunctionOverlap,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentFunctionOverlap {
pub content_word_overlap: f64,
pub function_word_overlap: f64,
pub content_function_ratio: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SemanticContinuityMetrics {
pub average_semantic_similarity: f64,
pub coherence_distribution: Vec<f64>,
pub topic_continuity: TopicContinuityMetrics,
pub conceptual_overlap: ConceptualOverlapMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicContinuityMetrics {
pub topic_shift_frequency: f64,
pub average_topic_coherence: f64,
pub major_transitions: Vec<TopicTransition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicTransition {
pub position: usize,
pub source_topic: Vec<String>,
pub target_topic: Vec<String>,
pub smoothness: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConceptualOverlapMetrics {
pub concept_stats: ConceptStats,
pub similarity_network: ConceptualSimilarityNetwork,
pub abstract_concepts: Vec<AbstractConcept>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConceptStats {
pub total_concepts: usize,
pub concepts_per_sentence: f64,
pub diversity_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConceptualSimilarityNetwork {
pub nodes: Vec<String>,
pub edges: Vec<(usize, usize, f64)>,
pub density: f64,
pub clustering_coefficient: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AbstractConcept {
pub concept_id: String,
pub manifestations: Vec<String>,
pub positions: Vec<usize>,
pub stability_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StructuralContinuityMetrics {
pub syntactic_continuity: f64,
pub length_variation: SentenceLengthVariation,
pub parallelism_analysis: ParallelismAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SentenceLengthVariation {
pub average_length: f64,
pub length_std_dev: f64,
pub variation_score: f64,
pub length_distribution: HashMap<String, usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParallelismAnalysis {
pub parallel_structures: usize,
pub parallelism_strength: f64,
pub parallel_patterns: Vec<ParallelPattern>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParallelPattern {
pub pattern_id: usize,
pub elements: Vec<String>,
pub positions: Vec<usize>,
pub strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InformationStructureMetrics {
pub given_new_balance: f64,
pub topic_focus_articulation: f64,
pub information_packaging: f64,
pub thematic_progression: String,
pub information_density: f64,
pub theme_analysis: ThemeAnalysis,
pub focus_tracking: FocusTracking,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThemeAnalysis {
pub themes: Vec<Theme>,
pub continuity_score: f64,
pub development_patterns: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Theme {
pub theme_id: String,
pub manifestations: Vec<String>,
pub positions: Vec<usize>,
pub prominence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FocusTracking {
pub focus_shifts: usize,
pub continuity_score: f64,
pub major_foci: Vec<FocusElement>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FocusElement {
pub content: String,
pub position: usize,
pub strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdvancedDiscourseAnalysis {
pub discourse_tree: Option<DiscourseTree>,
pub coherence_network: CoherenceNetwork,
pub information_measures: DiscourseInformationMeasures,
pub cognitive_measures: CognitiveMeasures,
pub genre_analysis: GenreAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoherenceNetwork {
pub nodes: Vec<CoherenceNode>,
pub edges: Vec<CoherenceEdge>,
pub density: f64,
pub connectivity: f64,
pub central_nodes: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoherenceNode {
pub node_id: usize,
pub content: String,
pub centrality: NodeCentrality,
pub importance: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeCentrality {
pub degree: f64,
pub betweenness: f64,
pub closeness: f64,
pub eigenvector: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoherenceEdge {
pub source: usize,
pub target: usize,
pub relation_type: RhetoricalRelationType,
pub weight: f64,
pub confidence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscourseInformationMeasures {
pub entropy: EntropyMeasures,
pub information_flow: InformationFlowMetrics,
pub redundancy: RedundancyAnalysis,
pub compression: CompressionAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntropyMeasures {
pub lexical_entropy: f64,
pub syntactic_entropy: f64,
pub semantic_entropy: f64,
pub discourse_entropy: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InformationFlowMetrics {
pub information_rate: f64,
pub flow_consistency: f64,
pub bottlenecks: Vec<InformationBottleneck>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InformationBottleneck {
pub position: usize,
pub severity: f64,
pub factors: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedundancyAnalysis {
pub overall_redundancy: f64,
pub beneficial_redundancy: f64,
pub excessive_redundancy: f64,
pub patterns: Vec<RedundancyPattern>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedundancyPattern {
pub pattern_type: String,
pub instances: Vec<(usize, usize)>,
pub strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionAnalysis {
pub compression_ratio: f64,
pub information_density: f64,
pub compressibility: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CognitiveMeasures {
pub processing_load: f64,
pub memory_load: f64,
pub attention_metrics: AttentionMetrics,
pub comprehension_difficulty: f64,
pub cognitive_accessibility: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttentionMetrics {
pub attention_switches: usize,
pub focus_maintenance: f64,
pub attention_distribution: Vec<AttentionFocus>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttentionFocus {
pub position: usize,
pub strength: f64,
pub duration: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GenreAnalysis {
pub predicted_genre: String,
pub confidence: f64,
pub genre_features: GenreFeatures,
pub register_analysis: RegisterAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GenreFeatures {
pub argumentative: ArgumentativeFeatures,
pub narrative: NarrativeFeatures,
pub expository: ExpositoryFeatures,
pub descriptive: DescriptiveFeatures,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArgumentativeFeatures {
pub claim_evidence_patterns: usize,
pub logical_connectors: f64,
pub counter_arguments: usize,
pub persuasive_strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NarrativeFeatures {
pub temporal_markers: usize,
pub character_references: f64,
pub action_verb_density: f64,
pub narrative_coherence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExpositoryFeatures {
pub definition_patterns: usize,
pub classification_markers: usize,
pub explanation_structures: usize,
pub technical_vocabulary: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DescriptiveFeatures {
pub adjective_density: f64,
pub spatial_markers: f64,
pub sensory_details: usize,
pub vividness_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterAnalysis {
pub formality_level: String,
pub formality_score: f64,
pub register_features: RegisterFeatures,
pub audience_adaptation: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterFeatures {
pub lexical_sophistication: f64,
pub syntactic_complexity: f64,
pub marker_formality: f64,
pub technical_usage: f64,
}