iamspruce commited on
Commit
869988f
·
1 Parent(s): fc43d8e

updated api

Browse files
Files changed (1) hide show
  1. app/routers/analyze.py +34 -18
app/routers/analyze.py CHANGED
@@ -10,7 +10,16 @@ router = APIRouter()
10
 
11
  # Load the spaCy English language model for natural language processing tasks,
12
  # such as dependency parsing for active/passive voice detection.
13
- nlp = spacy.load("en_core_web_sm")
 
 
 
 
 
 
 
 
 
14
 
15
  # Initialize LanguageTool for grammar, spelling, and style checking.
16
  # 'en-US' specifies the English (United States) language.
@@ -23,18 +32,20 @@ class AnalyzeInput(BaseModel):
23
  """
24
  text: str
25
 
26
- @router.post("/analyze")
27
- def analyze_text(payload: AnalyzeInput, request: Request = Depends(verify_api_key)):
 
 
28
  """
29
  Analyzes the provided text for grammar, punctuation, sentence correctness,
30
  tone, active/passive voice, and inclusive pronoun suggestions.
31
 
32
  Args:
33
  payload (AnalyzeInput): The request body containing the text to be analyzed.
34
- request (Request): The FastAPI Request object (dependency injected for API key verification).
35
 
36
  Returns:
37
- dict: A dictionary containing various analysis results.
38
  """
39
  text = payload.text
40
 
@@ -42,11 +53,11 @@ def analyze_text(payload: AnalyzeInput, request: Request = Depends(verify_api_ke
42
  # Get the grammatically corrected version of the original text.
43
  corrected_grammar = models.run_grammar_correction(text)
44
 
 
45
  # Use difflib to find differences between the original and corrected text.
46
- # difflib.SequenceMatcher compares sequences and can identify insertions, deletions, and substitutions.
47
  s = difflib.SequenceMatcher(None, text.split(), corrected_grammar.split())
48
 
49
- grammar_changes = []
50
  # Iterate through the operations (opcodes) generated by SequenceMatcher.
51
  # 'equal', 'replace', 'delete', 'insert' are the types of operations.
52
  for opcode, i1, i2, j1, j2 in s.get_opcodes():
@@ -72,7 +83,7 @@ def analyze_text(payload: AnalyzeInput, request: Request = Depends(verify_api_ke
72
  sentence_correctness_feedback = []
73
 
74
  for m in matches:
75
- # Check if the rule ID contains "PUNCTUATION" to categorize it.
76
  if 'PUNCTUATION' in m.ruleId.upper():
77
  punctuation_issues.append(m.message)
78
  else:
@@ -80,36 +91,41 @@ def analyze_text(payload: AnalyzeInput, request: Request = Depends(verify_api_ke
80
  sentence_correctness_feedback.append(m.message)
81
 
82
  # --- 4. Tone Detection and Suggestion ---
83
- # Classify the tone of the original text using the fine-tuned model.
84
  detected_tone = models.classify_tone(text)
85
 
86
  tone_suggestion_text = ""
87
  # Provide a simple tone suggestion based on the detected tone.
88
- # This logic can be expanded for more sophisticated suggestions.
89
- if detected_tone in ["neutral", "joy"]: # Example condition for suggesting a formal tone
90
  # Generate a formal tone version using FLAN-T5.
91
  tone_suggestion_text = models.run_flan_prompt(prompts.tone_prompt(text, "formal"))
 
 
 
 
92
  else:
 
93
  tone_suggestion_text = f"The detected tone '{detected_tone}' seems appropriate for general communication."
94
 
95
 
96
  # --- 5. Active/Passive Voice Detection and Suggestion ---
97
- doc = nlp(text) # Process the text with spaCy
98
  voice_detected = "active"
99
- voice_suggestion = "None \u2014 active voice is fine here." # Using Unicode em dash
100
 
101
- # Iterate through tokens to find passive auxiliary verbs (e.g., "is", "was" in passive constructions).
102
- # A simple heuristic: if any token's dependency is 'auxpass', it's likely passive.
103
  for token in doc:
104
  if token.dep_ == "auxpass":
105
  voice_detected = "passive"
106
- # If passive, ask FLAN-T5 to rewrite it in active voice.
107
  better_voice_prompt = prompts.active_voice_prompt(text)
108
  voice_suggestion = models.run_flan_prompt(better_voice_prompt)
109
- break # Exit loop once passive voice is detected
110
 
111
  # --- 6. Inclusive Pronoun Suggestion ---
112
- # Use FLAN-T5 with a specific prompt to suggest inclusive language.
113
  inclusive_pronouns_suggestion = models.run_flan_prompt(prompts.pronoun_friendly_prompt(text))
114
 
115
  # --- Construct the final response matching the example output structure ---
 
10
 
11
  # Load the spaCy English language model for natural language processing tasks,
12
  # such as dependency parsing for active/passive voice detection.
13
+ # IMPORTANT: If you get an OSError: [E050] Can't find model 'en_core_web_sm',
14
+ # you need to run: python -m spacy download en_core_web_sm in your terminal.
15
+ try:
16
+ nlp = spacy.load("en_core_web_sm")
17
+ except OSError:
18
+ print("SpaCy model 'en_core_web_sm' not found. Please run: python -m spacy download en_core_web_sm")
19
+ # You might want to raise an HTTPException or provide a dummy NLP object
20
+ # if the model is crucial for the application to function.
21
+ # For now, we'll let it fail if not installed, as it's a critical dependency.
22
+ raise
23
 
24
  # Initialize LanguageTool for grammar, spelling, and style checking.
25
  # 'en-US' specifies the English (United States) language.
 
32
  """
33
  text: str
34
 
35
+ # Apply the verify_api_key dependency at the router level for this endpoint.
36
+ # The Request object is now correctly handled without being wrapped by Depends.
37
+ @router.post("/analyze", dependencies=[Depends(verify_api_key)])
38
+ def analyze_text(payload: AnalyzeInput):
39
  """
40
  Analyzes the provided text for grammar, punctuation, sentence correctness,
41
  tone, active/passive voice, and inclusive pronoun suggestions.
42
 
43
  Args:
44
  payload (AnalyzeInput): The request body containing the text to be analyzed.
45
+ (dependencies=[Depends(verify_api_key)]): Ensures the API key is verified before execution.
46
 
47
  Returns:
48
+ dict: A dictionary containing various analysis results structured as per requirements.
49
  """
50
  text = payload.text
51
 
 
53
  # Get the grammatically corrected version of the original text.
54
  corrected_grammar = models.run_grammar_correction(text)
55
 
56
+ grammar_changes = []
57
  # Use difflib to find differences between the original and corrected text.
58
+ # We split by words to get word-level diffs, which are easier to interpret.
59
  s = difflib.SequenceMatcher(None, text.split(), corrected_grammar.split())
60
 
 
61
  # Iterate through the operations (opcodes) generated by SequenceMatcher.
62
  # 'equal', 'replace', 'delete', 'insert' are the types of operations.
63
  for opcode, i1, i2, j1, j2 in s.get_opcodes():
 
83
  sentence_correctness_feedback = []
84
 
85
  for m in matches:
86
+ # Check if the rule ID (from LanguageTool) contains "PUNCTUATION" to categorize it.
87
  if 'PUNCTUATION' in m.ruleId.upper():
88
  punctuation_issues.append(m.message)
89
  else:
 
91
  sentence_correctness_feedback.append(m.message)
92
 
93
  # --- 4. Tone Detection and Suggestion ---
94
+ # Classify the tone of the original text using the fine-tuned emotion classifier.
95
  detected_tone = models.classify_tone(text)
96
 
97
  tone_suggestion_text = ""
98
  # Provide a simple tone suggestion based on the detected tone.
99
+ # This logic can be expanded for more sophisticated suggestions based on context or user goals.
100
+ if detected_tone in ["neutral", "joy"]: # Example: if text is neutral or joyful, suggest a formal alternative
101
  # Generate a formal tone version using FLAN-T5.
102
  tone_suggestion_text = models.run_flan_prompt(prompts.tone_prompt(text, "formal"))
103
+ elif detected_tone == "anger":
104
+ tone_suggestion_text = models.run_flan_prompt(prompts.tone_prompt(text, "calm and professional"))
105
+ elif detected_tone == "sadness":
106
+ tone_suggestion_text = models.run_flan_prompt(prompts.tone_prompt(text, "more uplifting"))
107
  else:
108
+ # If no specific suggestion, indicate that the detected tone is generally fine.
109
  tone_suggestion_text = f"The detected tone '{detected_tone}' seems appropriate for general communication."
110
 
111
 
112
  # --- 5. Active/Passive Voice Detection and Suggestion ---
113
+ doc = nlp(text) # Process the text with spaCy for linguistic analysis
114
  voice_detected = "active"
115
+ voice_suggestion = "None \u2014 active voice is fine here." # Using Unicode em dash for better readability
116
 
117
+ # Iterate through tokens to find passive auxiliary verbs (e.g., "is", "was", "been" when followed by a past participle).
118
+ # A simple heuristic: if any token's dependency is 'auxpass', it's likely part of a passive construction.
119
  for token in doc:
120
  if token.dep_ == "auxpass":
121
  voice_detected = "passive"
122
+ # If passive voice is detected, ask FLAN-T5 to rewrite it in active voice.
123
  better_voice_prompt = prompts.active_voice_prompt(text)
124
  voice_suggestion = models.run_flan_prompt(better_voice_prompt)
125
+ break # Exit loop once passive voice is detected, no need to check further
126
 
127
  # --- 6. Inclusive Pronoun Suggestion ---
128
+ # Use FLAN-T5 with a specific prompt to suggest more inclusive language.
129
  inclusive_pronouns_suggestion = models.run_flan_prompt(prompts.pronoun_friendly_prompt(text))
130
 
131
  # --- Construct the final response matching the example output structure ---