Update process_interview.py
Browse files- process_interview.py +28 -30
process_interview.py
CHANGED
|
@@ -243,33 +243,31 @@ def identify_speakers(audio: Dict, text: str) -> List[Dict]:
|
|
| 243 |
logger.error(f"Speaker identification failed: {str(e)}")
|
| 244 |
raise
|
| 245 |
|
| 246 |
-
def train_role_classifier(
|
| 247 |
try:
|
| 248 |
-
|
| 249 |
-
vectorizer = TfidfVectorizer(max_features=500, ngram_range=(1,2))
|
| 250 |
-
X_text = vectorizer.fit_transform(
|
| 251 |
features = []
|
| 252 |
labels = []
|
| 253 |
-
for i,
|
| 254 |
-
|
| 255 |
feat = [
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
utterance['intensity_level'],
|
| 260 |
-
utterance['speechMax']], utterance['speechSD'],
|
| 261 |
]
|
| 262 |
-
feat.extend(X_text[i].toarray()[0])
|
| 263 |
-
doc = nlp(
|
| 264 |
-
|
| 265 |
-
int(
|
| 266 |
-
len(re.findall(r'\b(why|how|what|when|where|who|which)\b',
|
| 267 |
-
len(
|
| 268 |
-
sum(
|
| 269 |
-
sum(
|
| 270 |
])
|
| 271 |
features.append(feat)
|
| 272 |
-
labels.append(
|
| 273 |
scaler = StandardScaler()
|
| 274 |
X = scaler.fit_transform(features)
|
| 275 |
clf = RandomForestClassifier(
|
|
@@ -284,30 +282,30 @@ def train_role_classifier(speakers: List[Dict]):
|
|
| 284 |
logger.error(f"Classifier training failed: {str(e)}")
|
| 285 |
raise
|
| 286 |
|
| 287 |
-
def classify_roles(
|
| 288 |
try:
|
| 289 |
-
|
| 290 |
-
X_text = vectorizer.transform(
|
| 291 |
results = []
|
| 292 |
-
for i,
|
| 293 |
-
prosodic =
|
| 294 |
feat = [
|
| 295 |
prosodic['duration'], prosodic['mean_pitch'], prosodic['min_pitch'],
|
| 296 |
prosodic['max_pitch'], prosodic['pitch_sd'], prosodic['intensityMean'],
|
| 297 |
prosodic['intensityMin'], prosodic['intensityMax'], prosodic['intensitySD'],
|
| 298 |
]
|
| 299 |
feat.extend(X_text[i].toarray()[0].tolist())
|
| 300 |
-
doc = nlp(
|
| 301 |
feat.extend([
|
| 302 |
-
int(
|
| 303 |
-
len(re.findall(r'\b(why|how|what|when|where|who|which)\b',
|
| 304 |
-
len(
|
| 305 |
sum(1 for token in doc if token.pos_ == 'VERB'),
|
| 306 |
sum(1 for token in doc if token.pos_ == 'NOUN')
|
| 307 |
])
|
| 308 |
X = scaler.transform([feat])
|
| 309 |
role = 'Interviewer' if clf.predict(X)[0] == 0 else 'Interviewee'
|
| 310 |
-
results.append({**
|
| 311 |
return results
|
| 312 |
except Exception as e:
|
| 313 |
logger.error(f"Role classification failed: {str(e)}")
|
|
|
|
| 243 |
logger.error(f"Speaker identification failed: {str(e)}")
|
| 244 |
raise
|
| 245 |
|
| 246 |
+
def train_role_classifier(utterances: List[Dict]):
|
| 247 |
try:
|
| 248 |
+
texts = [u['text'] for u in utterances]
|
| 249 |
+
vectorizer = TfidfVectorizer(max_features=500, ngram_range=(1, 2))
|
| 250 |
+
X_text = vectorizer.fit_transform(texts)
|
| 251 |
features = []
|
| 252 |
labels = []
|
| 253 |
+
for i, utterance in enumerate(utterances):
|
| 254 |
+
prosodic = utterance['prosodic_features']
|
| 255 |
feat = [
|
| 256 |
+
prosodic['duration'], prosodic['mean_pitch'], prosodic['min_pitch'],
|
| 257 |
+
prosodic['max_pitch'], prosodic['pitch_sd'], prosodic['intensityMean'],
|
| 258 |
+
prosodic['intensityMin'], prosodic['intensityMax'], prosodic['intensitySD'],
|
|
|
|
|
|
|
| 259 |
]
|
| 260 |
+
feat.extend(X_text[i].toarray()[0].tolist())
|
| 261 |
+
doc = nlp(utterance['text'])
|
| 262 |
+
feat.extend([
|
| 263 |
+
int(utterance['text'].endswith('?')),
|
| 264 |
+
len(re.findall(r'\b(why|how|what|when|where|who|which)\b', utterance['text'].lower())),
|
| 265 |
+
len(utterance['text'].split()),
|
| 266 |
+
sum(1 for token in doc if token.pos_ == 'VERB'),
|
| 267 |
+
sum(1 for token in doc if token.pos_ == 'NOUN')
|
| 268 |
])
|
| 269 |
features.append(feat)
|
| 270 |
+
labels.append(0 if i % 2 == 0 else 1)
|
| 271 |
scaler = StandardScaler()
|
| 272 |
X = scaler.fit_transform(features)
|
| 273 |
clf = RandomForestClassifier(
|
|
|
|
| 282 |
logger.error(f"Classifier training failed: {str(e)}")
|
| 283 |
raise
|
| 284 |
|
| 285 |
+
def classify_roles(utterances: List[Dict], clf, vectorizer, scaler):
|
| 286 |
try:
|
| 287 |
+
texts = [u['text'] for u in utterances]
|
| 288 |
+
X_text = vectorizer.transform(texts)
|
| 289 |
results = []
|
| 290 |
+
for i, utterance in enumerate(utterances):
|
| 291 |
+
prosodic = utterance['prosodic_features']
|
| 292 |
feat = [
|
| 293 |
prosodic['duration'], prosodic['mean_pitch'], prosodic['min_pitch'],
|
| 294 |
prosodic['max_pitch'], prosodic['pitch_sd'], prosodic['intensityMean'],
|
| 295 |
prosodic['intensityMin'], prosodic['intensityMax'], prosodic['intensitySD'],
|
| 296 |
]
|
| 297 |
feat.extend(X_text[i].toarray()[0].tolist())
|
| 298 |
+
doc = nlp(utterance['text'])
|
| 299 |
feat.extend([
|
| 300 |
+
int(utterance['text'].endswith('?')),
|
| 301 |
+
len(re.findall(r'\b(why|how|what|when|where|who|which)\b', utterance['text'].lower())),
|
| 302 |
+
len(utterance['text'].split()),
|
| 303 |
sum(1 for token in doc if token.pos_ == 'VERB'),
|
| 304 |
sum(1 for token in doc if token.pos_ == 'NOUN')
|
| 305 |
])
|
| 306 |
X = scaler.transform([feat])
|
| 307 |
role = 'Interviewer' if clf.predict(X)[0] == 0 else 'Interviewee'
|
| 308 |
+
results.append({**utterance, 'role': role})
|
| 309 |
return results
|
| 310 |
except Exception as e:
|
| 311 |
logger.error(f"Role classification failed: {str(e)}")
|