' n% f2 ~9 q& L1 [' K" F2 e4 A+ Q& M% c }
@app.get( + }1 V0 H1 `; v "/onlineShoppingReviews/",6 k1 \0 l2 y% F2 n( V
response_model=List[schemas.OnlineShoppingReview],# T/ \+ x- B4 x
tags=['电商购物评价语料库数据接口']3 {% ?' X' m6 f+ S( E
) / Q; P/ }; u" i8 Rdef get_online_shopping_reviews(db: Session = Depends(get_db)): % ?9 [4 ~' _, D' B% O, @/ I db_reviews = crud.get_online_shopping_reviews(db) - }7 l Q# n& C9 j" i4 t* I return db_reviews2 W7 ~4 W" a& p' u
0 p0 d2 q$ K6 G" @. x* m 1 o+ N$ s! e0 Q* `@app.get( & v. l% v" b+ j& H; o; V" h+ S "/takeawayReviews/",. P+ B: d: y( \! F7 C/ O) x
response_model=List[schemas.TakeawayReview], e- ]1 H( F5 a }) _- d0 O X* y
tags=['外卖评价语料库数据接口'] , @1 g- s$ O( Z t6 L4 R) + Q1 C( U: a/ Idef get_takeaway_reviews(db: Session = Depends(get_db)): $ P+ f/ A: U0 ?6 X* G4 _1 ?) S* a db_reviews = crud.get_takeaway_reviews(db)9 b: g2 [' g( J% C# U
return db_reviews4 i# U' U: _6 ^
: r: x ]3 K5 u3 T5 k' ~
- {- `( a7 x. O, @
@app.get(& x% K$ ~+ h. t+ E. u7 V8 G2 I$ r
"/chineseLyrics/", 5 M0 H" e" j/ T response_model=List[schemas.ChineseLyrics],5 n7 N" t2 E: p$ t. F8 y! J3 f
tags=['中文歌歌词语料库数据接口']& l' I5 J0 A% y. `
). I; P" Q& E6 C+ K0 z, _( I
def get_chinese_lyrics(db: Session = Depends(get_db)): $ S/ n& }1 y2 s) @ db_reviews = crud.get_chinese_lyrics(db)7 I6 p' Y1 `$ n/ ]
return db_reviews2 n% E% R' O! w: \7 |- e
" B$ |; Z( x& K. {6 d
0 g, p) V1 r. U) q( P$ E3 X1 G
@app.get(2 O+ A& x+ p) {5 s" y
"/COVID19News/",6 ~, Z3 _0 J: v
response_model=List[schemas.COVID19News], 3 J5 |* A. p4 A# r6 s0 e3 P9 F9 h tags=['新冠病毒新闻语料库数据接口'] w) y6 q) A' p& A4 M: E) , g% }! K, {& m+ C! j6 Sdef get_COVID19_news(db: Session = Depends(get_db)): 1 ^% L1 Y! t& ~& H# K% T db_reviews = crud.get_COVID19_news(db) 4 c. M v n& q7 ]5 u return db_reviews & y" o7 H1 q- C+ k+ j d& v * l7 w4 T& L n7 l I, C9 D& S1 k5 ^" f4 H/ i% b5 K
# 为每个用户设置uuid标识符,并存入Cookie : P9 u) C# d) N( [def create_user_uuid_and_set_cookie(response: Response): 2 A( T2 @, T6 m m user_uuid = str(uuid.uuid1()) ' |. F; ^; Z3 h response.set_cookie(key="user_uuid", value=user_uuid)! S6 T* h/ A0 |- n
return user_uuid 7 b) ]8 i7 L0 ^# D- ]" P9 Q / T8 R) V# t9 X1 b8 _& W) w! z( g' ?9 y: X! T
@app.post( ! P3 Y" c* `# N "/calculate/preprocessing/", ' q& Y$ T+ m7 M/ q" j tags=["计算模块数据接口"] , k2 X* d1 C, b; ^)9 S6 X) e& g- ~2 w5 K y2 a
async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams,0 s+ _! O/ e5 W( j) G
background_task: BackgroundTasks, 6 ~! g/ ~ ]" z& n9 B" n# { response: Response,9 x/ y/ S" C! b2 H3 g
user_uuid: str = Cookie(None)):4 D1 I( z. T; [, ` J
if not user_uuid:' w$ B, G V6 N# a5 `7 _
user_uuid = create_user_uuid_and_set_cookie(response) , b5 `7 M7 l* R7 }; Z& A1 l- c, Q3 w! w5 J7 y
global topic_model_training_tasks" x/ I9 L6 z6 v/ T
task = TopicModelTrainingTask(text_preprocessing_params) ! U. j4 Q& ^6 c i; f topic_model_training_tasks[user_uuid] = task 1 _% b( W0 ?. b0 S% D, _ / e0 A) W2 @ X. v+ b, E4 ` background_task.add_task(task.preprocessing)& u Z' Q. _3 N) `2 P* x
return {"message": "已添加文本预处理后台任务"}6 x( e& H) G" S; X, Q
8 F; X. f9 [, u# ~3 r2 P1 w# S6 `8 I: _: l8 m
# g) a. O& j- f7 {/ w@app.post( - ^; w u: j) X; o3 ] "/calculate/nmftraining/",8 [3 ?* s$ P) t& T' z6 j0 r
tags=["计算模块数据接口"], ~& v1 R l+ \# {% N' r) J" l
)/ Y) T5 ]* D( e. U2 c
async def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams,/ c. p3 ~+ u F% ~) {
background_task: BackgroundTasks, % U! A1 c5 i: A; y response: Response, % F- X5 M& l. E: m+ H' m user_uuid: str = Cookie(None)): + P7 x, s" i, D( p4 s y if not user_uuid: % J8 X3 D$ D* V( ? user_uuid = create_user_uuid_and_set_cookie(response)$ `6 @; w; e( b/ U4 v
, W: V$ S0 q( _9 \ global topic_model_training_tasks# X3 L# x1 h! J/ w$ S
/ J" u, ^+ ^, F! A% ^5 t9 A" @
if user_uuid and user_uuid in topic_model_training_tasks: 4 K+ m6 {: }1 o& n task = topic_model_training_tasks[user_uuid]# h) k3 U' t! y* D
if task.text_preprocessing_progress.status_code == 2: ' Y7 l4 b2 j: s- J background_task.add_task(task.nmf_training, nmf_training_params) 3 D! l8 v6 R p9 f- l return {"message": "已添加NMF主题模型训练后台任务"}- o$ Q) Z" s" j
else: " ]7 @3 M) T: e: h w raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") ; ^! X# U! k, G( J. r) [+ Y" W else:% n2 \4 J* D1 U4 t. z$ ]6 ~4 h
raise HTTPException(status_code=404, detail="未找到相应的训练对象!"), H* j) ~2 f3 a2 U9 s( r( Z
3 @" ]7 f! x) s, c 8 r3 J8 e! J4 J2 {# c: x@app.get( ) j8 {5 J. F3 I3 j& U0 y, D% P "/calculate/nmftraining/keywordsearch/",. V, G' j2 V$ O6 \. q, P
response_model=KeywordSearchResult, , g; l, @1 ]: J1 g8 [/ P0 z- ? tags=["用户交互"] ( Z; ~. Z$ b: O; c4 `8 u& E% w)1 n+ w( K5 g; o: m- S
async def search_keyword(search_text: str, , {/ ]8 f7 _; v, R8 N! f response: Response, 1 R4 t# p U0 c) g! b3 T$ z user_uuid: str = Cookie(None)): + E5 [ I) s, h if not user_uuid:! N. R3 ^# i6 B; l. w4 Y' }
user_uuid = create_user_uuid_and_set_cookie(response) ; N8 x& _) R! i% u* L. s / A8 H# O7 W) s* I global topic_model_training_tasks & M5 f- p( {+ Y: f , g% w) i, i' {6 Z- y+ E if user_uuid and user_uuid in topic_model_training_tasks:- @- G& Y1 L0 c* Y- u
task = topic_model_training_tasks[user_uuid]1 ?, I' M. u& w4 o: K
if task.text_preprocessing_progress.status_code == 2:9 |' l; r) b5 R5 Q
search_text = search_text.lower()4 C! Z. K5 s# ]. w. ?9 B
bag_words = task.text_preprocessing.bagWords 6 v; K; o5 J+ x/ R2 U' V% w keyword_search_result = KeywordSearchResult() & X) Y# I2 n8 s; p for wi, word in enumerate(bag_words): 7 z' g! i8 U7 U if search_text in word: & V9 b, @; ]+ W$ B- p keyword_search_result.word_id_list.append(wi) # Y) c% Q6 R6 B- C* z/ e keyword_search_result.word_list.append(word) ! b5 `5 G5 d3 O+ h return keyword_search_result& b& a8 [& Y3 S# Y' u
else: ' [$ z% l8 w2 R8 d! W( X' B raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") # y8 s1 V1 ]; H* y. M2 p: b else:0 }' E1 K" _1 Y$ }; g
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") . l) d8 O9 C2 |; p3 e# a; N' d6 Y* `' v
/ k( t6 f5 @1 e5 e@app.post(( k5 E5 P J/ G) B$ p `, Y
"/calculate/nmftraining/topickeywordoptimization/",* U& l0 @1 f; i9 C. r5 ?
tags=["用户交互"] ; y4 ?/ |9 k; i! x4 D)# g- k1 o& _( `7 _! Y$ }! l" V
async def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams,' n2 ` c6 B6 `. o+ _
background_task: BackgroundTasks, 7 T& Z& v" ]; p6 n$ G; K8 v, E3 ? response: Response, m6 P3 o6 F r user_uuid: str = Cookie(None)):# v! w& J8 t3 |, P
if not user_uuid: ; m4 f& X0 v( |1 w8 Y1 s. q/ y user_uuid = create_user_uuid_and_set_cookie(response)2 U. N: `: d: N p6 Z7 K5 ~, e
9 Z- Y6 u" O8 h& n" o global topic_model_training_tasks , |- p$ @* z# @/ ?6 i+ r6 `; \8 q# C9 a
if user_uuid and user_uuid in topic_model_training_tasks:# |& D& a5 u1 g/ R5 N6 x1 p* v
task = topic_model_training_tasks[user_uuid] $ `' F: h: e3 s9 w! d: y if task.nmf_training_progress.status_code == 2: ) V2 s% W' O% b& j2 b$ L! b background_task.add_task(task.topic_keyword_optimization, tko_params)/ L. g- m; j f) E
return {"message": "已添加主题关键词优化后台任务"}* _. x+ l E0 |) F7 s7 p
else:0 k6 A6 L; l4 }$ D/ `& w% m: ?
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")+ [# a" N! _3 [0 w4 q* f1 L/ l; S
else:. I# O1 k2 c% o; ~# x
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")! F/ Y; u# S* B! [" E- ]
. J) w$ q4 o$ b: ~' e( W/ A/ t% V2 h! D+ n
@app.post( + P z7 ]: _1 b& @( t "/calculate/nmftraining/topicsplit/",( Z% I* O& z5 q* K0 m j! ~
tags=["用户交互"]$ H9 A+ i k" X: {3 W
)8 J/ h& p( }4 b- F! B
async def run_topic_split_task(ts_params: TopicSplitParams, - K( {' L# U- _* P3 E background_task: BackgroundTasks,# G6 c) z/ {, Y$ ^
response: Response, 1 ]* x2 g$ {5 z2 c# D) k, s6 D user_uuid: str = Cookie(None)): 9 _/ q' m* u7 \9 T% Z8 K if not user_uuid:- S0 c$ N: R/ N: J6 E) q( U! F
user_uuid = create_user_uuid_and_set_cookie(response)8 v# p9 V5 o. m
4 I- V9 t7 i' c/ j. I2 w7 e7 `
global topic_model_training_tasks % _& Z! O4 @) S! u $ R. I3 w6 }! z0 m if user_uuid and user_uuid in topic_model_training_tasks:: e& e+ P, n, V6 N0 I
task = topic_model_training_tasks[user_uuid]$ g8 u5 O, l) ?0 t
if task.nmf_training_progress.status_code == 2: 2 t6 _$ @; n: [& n background_task.add_task(task.topic_split, ts_params)' j) `; K7 N' D+ P) P6 v
return {"message": "已添加主题拆分后台任务"}1 D F6 X5 o. K0 k, v; a2 v
else:) _, N3 n* e- n, C8 t1 z+ T0 a& A
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")3 o3 X) X9 L3 h5 U% ~! q
else: ! p5 m0 A, b6 Y& U raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & i' S7 E: D( B0 F; t' n; T ' _, Y3 R" W E3 _! q* J, A% d/ H6 ^. f, e
@app.post( 9 c: c( `$ I1 }) d: P2 c8 V% _ "/calculate/nmftraining/topicmerge/",( _! D( f! p2 [$ H3 ]( p# W7 I1 O
tags=["用户交互"] 5 r) ^; m. d1 j+ a0 \)6 i4 {, S6 ?: \. d/ R) ~
async def run_topic_merge_task(tm_params: TopicMergeParams,& R. t9 c; O) R
background_task: BackgroundTasks, 8 K( b0 D' S- k. X* p: i. \ response: Response, # M! k) Q* v- q; Z3 U user_uuid: str = Cookie(None)):% U; z* }; a" y3 H
if not user_uuid: ; H0 C# F6 p! p user_uuid = create_user_uuid_and_set_cookie(response) . B8 a) x' f: Y# p5 h2 D& ^9 p! M- J9 ~! n9 U/ {
global topic_model_training_tasks) m; D' p3 Z) u: l3 F9 F
6 \' e! ^6 W1 ? if user_uuid and user_uuid in topic_model_training_tasks:$ J v* g+ k1 ?/ y7 G! `* O3 K
task = topic_model_training_tasks[user_uuid]; {! }& `3 X# S4 q
if task.nmf_training_progress.status_code == 2:/ {) k! {& X3 @* Q
background_task.add_task(task.topic_merge, tm_params). ~7 r7 K( ~9 n k% S0 \9 S& ^+ y
return {"message": "已添加主题合并后台任务"}) x3 k& Q# x* J" E& I, a
else:' G+ J# V* O. d; M' e2 a! ^/ `
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"); L( W' M/ H0 F6 A1 N
else:5 r' b! O" _ l, I1 |& ^
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 0 V( J I' u# ]" X5 h0 x" o; t u5 u1 n6 L7 {6 C# h9 N4 f i) B
: F* T) _0 ?" l/ a# S0 {9 x8 J@app.post( 5 t3 v7 H4 |) {: k: A- k8 j "/calculate/nmftraining/keywordinducedtopiccreate/", 0 [9 f1 w1 T5 K5 D tags=["用户交互"]1 d/ r" g, m. i `! n8 y
) % q+ J5 O3 |0 |9 B4 D- Vasync def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams, X6 P7 ]5 H% |# k3 ]' X4 ]$ V
background_task: BackgroundTasks,+ |! T% z7 N3 T' O3 F+ C
response: Response,. Y9 G. M4 i; e4 j% q
user_uuid: str = Cookie(None)): - j; j. h. Q- H- \, d/ E/ q if not user_uuid: ) B( |9 l) i6 {: t user_uuid = create_user_uuid_and_set_cookie(response)+ [1 z3 r5 y! ]7 j/ G* Q: B( _
. T; _7 Q: _5 p7 z
global topic_model_training_tasks 3 v, }, c3 T" y- h K) f- j$ u' M" ]
if user_uuid and user_uuid in topic_model_training_tasks: " t2 E* V6 a& D2 H task = topic_model_training_tasks[user_uuid] 0 }% [$ b, i5 Z8 Q4 d, } if task.nmf_training_progress.status_code == 2:6 z. T) o( v- R! D& P
background_task.add_task(task.keyword_induced_topic_create, kitc_params) # u% Q+ c6 @2 z2 a" a& \ return {"message": "已添加关键词诱导主题创建后台任务"}# G$ N1 I5 p* i
else: 6 S; m* S& Z6 S raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")3 f! L2 E$ Q3 X9 M; F6 h, z
else:! d0 r* J+ E$ ?) B
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")3 f$ k' o) u; v o, z ]/ I! ~, F2 A
/ R+ h3 ^5 G# A' m) y8 ]. A; t+ u9 f N f% z+ y# c
@app.post( 1 l4 `" E5 j: s6 N- @ "/calculate/nmftraining/documentinducedtopiccreate/", c) d& p) l* | tags=["用户交互"] 4 G! O ^9 g) v/ t: a) " k3 A1 g" b8 wasync def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams, % e8 D) d" R M6 {2 G+ E5 m background_task: BackgroundTasks,) d5 n0 O* z7 `. V1 v l
response: Response, 7 Z u8 W0 m2 f @/ r user_uuid: str = Cookie(None)):$ l, y7 ? ^/ ? _
if not user_uuid:$ j' T2 n- a, }& Y. {9 ^
user_uuid = create_user_uuid_and_set_cookie(response)- w) o" \( W- G' K% r4 k' \0 M
3 |7 g+ z: I3 c3 H7 |1 I- q* t' |
global topic_model_training_tasks u) Z) R9 i. c% R' n 2 n& H; V: Q+ O1 h2 ]" F0 Q$ S, H if user_uuid and user_uuid in topic_model_training_tasks:6 T/ m0 Y7 o0 X# e6 x1 m- [$ t
task = topic_model_training_tasks[user_uuid]! W4 i) U" P$ U7 k
if task.nmf_training_progress.status_code == 2: 0 m8 Y+ Z) d+ y+ g# a0 l. x! N background_task.add_task(task.document_induced_topic_create, ditc_params): M2 I8 w( u0 G
return {"message": "已添加文档诱导主题创建后台任务"}4 l2 |/ L( d7 d; e
else: 7 V) E H; S3 ?; T raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"); J2 f& \" t& F1 A2 M1 o
else:& Q4 i/ r8 p4 M
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ' Q% Y: T; V) F3 ` I, z8 B. o( i8 }5 L I5 ]5 T" {& ]* i; ~' `
@app.get( ) k6 O7 e5 e4 L1 U' |$ T) v, I "/calculate/nmftraining/newdoctopicdistributionpredict/", & c3 |# y( ?9 c3 d. E( b tags=["主题预测"]$ R. w0 j4 G3 M/ Q6 z9 j
)& d. Z) f: @! ]. M/ C* I0 d# k
async def run_new_document_topic_distribution_predict_task( z6 a7 T7 }2 T new_doc_text: str, " ~: _) S4 t4 Q8 H background_task: BackgroundTasks, : n3 s9 ]" Q( Q8 E5 h0 n' N8 Q response: Response,: @' Y& H# a5 E2 b6 U! V5 ?( E
user_uuid: str = Cookie(None)): $ ^" d8 @- @5 ]# w4 `& a. o if not user_uuid:- g m' v H$ ~: P6 {
user_uuid = create_user_uuid_and_set_cookie(response)( z& o; [! }! }: H3 L0 G2 p
( L# o) i2 R. \" [# e* `1 l global topic_model_training_tasks ( x, d; W' I9 H" P2 r+ { " Z! i6 E' H5 I4 [ if user_uuid and user_uuid in topic_model_training_tasks: $ y: k. J2 p% i- r7 i task = topic_model_training_tasks[user_uuid] + V. c$ R9 J: C7 A8 { if task.nmf_training_progress.status_code == 2:* h! R1 U. C5 K$ |! a5 T; u3 [
background_task.add_task( : e9 P! m0 T$ a/ G- _# E: V5 G' I task.new_doc_topic_distribution_predict, & S" L% w$ D& u- A new_doc_text 4 z! R% i7 n. N0 l @ u ), b! L5 o0 e1 b$ n2 w) q
return {"message": "已添加新文档主题分布预测后台任务"} H B( S p) U1 \
else:! i9 v2 ?$ v, x- o6 h: h' o& a" w, z
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")" W5 O5 J4 }. j0 I/ B6 [
else:7 v% y0 y& S1 P+ ]' F" s! \. c# N; q
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") z4 y" \: [3 [' }7 O1 V5 D2 g2 a ! k- ]; P1 s2 Y, E0 {% w$ l4 e+ p$ e8 n% _: S
@app.get( ( }% L$ Q/ z' q9 z3 N+ p2 ~ "/calculate/preprocessing/progress/", B+ }6 v7 _: G
tags=["计算模块数据接口"],/ l. e ]3 ?+ L# k
response_model=TextPreprocessingProgress) J8 ~: Z. [ V2 c
) " ]4 |/ _7 d" _/ O8 ]; K- W- q' |def get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)): ; D+ w0 T4 m6 a" x' n6 N) i global topic_model_training_tasks ' c7 @/ F b: m% P' j( Q5 Y1 f( T& y7 |( z
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):/ R; F. ^$ K2 ]1 U9 s
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") Y. }5 l7 C9 a, [0 Y0 r
return topic_model_training_tasks[user_uuid].text_preprocessing_progress0 i4 R4 M; `0 _! L5 C1 X3 \
6 _3 j5 y& M" Z/ ^- x3 k. |* |( E( I; s2 Z. j5 n
@app.get( 4 q2 y9 r/ }. h8 L% ` "/calculate/nmftraining/progress/", ! `$ l7 F" p- y1 N5 }: V tags=["计算模块数据接口"], 5 J* o; u: G5 Z% m response_model=NMFTrainingProgress ! v- d3 A* O# p+ ]# |) ) ~: n7 h6 b( O+ y. b& k" ^def get_nmf_training_task_progress(user_uuid: str = Cookie(None)): 4 D/ \, i) X) R5 N& V* u global topic_model_training_tasks% d# |0 A. M: o! Z9 A( T3 v
( [2 f* J/ ]6 A& L if (not user_uuid) or (user_uuid not in topic_model_training_tasks): $ c. a' r+ c& I# d raise HTTPException(status_code=404, detail="未找到相应的训练对象!") # R5 j) c) U+ }7 T, F4 u( W Q$ A2 g( t( i4 N task = topic_model_training_tasks[user_uuid] . k3 {+ Q& z1 h- W" d if task.text_preprocessing_progress.status_code == 2: ' \( s& t, k8 _: ^- r5 @' G z/ ~ return task.nmf_training_progress 7 |0 Q& ^& |* w else: 6 s) Y& n7 O! W7 ~- t raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") V1 B% ?" w8 Y3 h' W) f
7 H7 m" e G# f, x$ J& l
% c* d6 ?1 V- F; ]@app.get( 4 U9 }2 r+ ~3 H, U "/calculate/umap/progress/",7 l! l3 M" l# _5 t/ @& s
tags=["计算模块数据接口"], ( A6 m% G. `) e response_model=UMAPProgress 9 ]* G! m5 @/ I: u) $ {; a5 g2 o" ~/ L/ cdef get_umap_task_progress(user_uuid: str = Cookie(None)):( ^1 K- V7 L+ h6 ~( T. M
global topic_model_training_tasks1 E# a% m& W# J4 b
1 g) E @/ j! \8 u( G' S0 @6 {: |1 k
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 8 d @+ |% F G raise HTTPException(status_code=404, detail="未找到相应的训练对象!")& I9 @# F- m) V+ C: a( c! ?, y
- m9 w7 _0 i( m0 ~
task = topic_model_training_tasks[user_uuid]% P. \7 [/ G- P3 T( o- B
if task.nmf_training_progress.status_code == 2: . F' U# a7 c: Z# k; T: B return task.umap_progress + c# i" k8 E0 t2 h! ] else:- i6 |1 o4 o0 ~) b, b. }- i6 k
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") # |2 u4 P+ `8 ?) y+ G1 r' P$ q$ k6 `: Q( g7 F
: b* A3 N* U8 D* B% [3 I6 A, q2 O@app.get(% m3 Q* `* I$ ^" f
"/calculate/nmftraining/predict/progress/", s2 L) ]& l) S, E' B, T- q tags=["计算模块数据接口"],+ } M5 J* {; u* m) q4 B( V8 S
response_model=NewDocTopicDistributionPredictProgress* f* N, A1 _* w9 K
). h) u3 S( D: u; u- |3 I
def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)):- w2 g: b( Z' E7 Z
global topic_model_training_tasks' N: H2 z$ p" Y0 Z" _0 ?( a
$ W& L- W7 a' j0 S) m5 I1 s if (not user_uuid) or (user_uuid not in topic_model_training_tasks):2 P6 a1 u' O: ^8 V+ o
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")& B: h" y5 T, c8 Q; X7 E
% O" Y9 Q1 H1 l$ F d task = topic_model_training_tasks[user_uuid] 7 c' f( N. m) |9 L& U2 X2 i if task.nmf_training_progress.status_code == 2: : A+ G3 V8 D+ Z- w( d' [0 s7 L return task.topic_distribution_predict_progress3 W3 L7 r: R! j, O! J+ _8 D; h' w& \
else:- x! O, Q8 @, y3 x+ }
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ' Y' J: U8 _- c* n9 o- y+ v $ K+ N0 r: K: A5 Z0 ^, J n% D; A: F3 b0 e
@app.get( - n G4 u0 a/ ]6 ~% U/ X5 |, \ "/calculate/details/document/"," ~2 V4 r9 C2 S+ Q, l1 z4 p& Q
tags=["计算模块数据接口"], : ?: ~( ?6 _" W response_model=DocumentDetails 0 F9 ~8 p7 a* k7 ?6 `8 X! g) . b6 T. c/ B# T4 ~$ ^8 udef get_document_details(doc_id: int, user_uuid: str = Cookie(None)): 0 g* t0 V- B* ~8 w+ J global topic_model_training_tasks1 Y( Y7 V0 Q. h* R
[" ^; L8 g2 E if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ( L% o& O7 p% n/ u raise HTTPException(status_code=404, detail="未找到相应的训练对象!")5 O, F4 t% I8 U! d( e/ h4 T
% L. p+ X* {. }* t- [ task = topic_model_training_tasks[user_uuid] ' m* W: f( L6 d1 E7 J4 P if task.nmf_training_progress.status_code == 2:" @& {3 y) L% t6 T) v% l9 e8 L- m
return task.get_document_details(doc_id) / d9 _/ [ w% } _7 A else:) N# T6 c8 L. e* l y( V# n
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") , \' I8 O* _/ L! V" e% u4 s" p& s$ ?( h- _4 b# j; y& r0 ?3 \
3 I: z a( e$ \# S1 ^@app.get( + T: @- ]3 u& S; Z$ Z# R "/calculate/details/topic/", ' i2 W# @, F+ g, r* A9 a6 X2 Y/ p tags=["计算模块数据接口"],; V" }2 T$ X& P8 G
response_model=TopicDetails $ C y0 G5 d. W9 ]% I' N), c" `( g: u& a' m& y4 G8 S
def get_topic_details(topic_id: int, user_uuid: str = Cookie(None)):5 Y G) ?5 O- o1 F" {
global topic_model_training_tasks / v! E: d; ^+ a* T, G- @3 p, {1 o. A- f% Y: J
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):0 N/ m% O% P5 k0 ^; J. T' o
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 2 C0 b* V2 u, d. X d, ~, G - |) L4 _4 o3 A# a8 P- m% ] task = topic_model_training_tasks[user_uuid] 9 B% ?4 P0 v: J7 f if task.nmf_training_progress.status_code == 2:) T0 i1 H: b4 k; t% @
return task.get_topic_details(topic_id) 5 P% `1 g; j2 x' R) N else: + U' t- n. }" D3 [ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ) t4 T& x5 q, w. C. z4 d5 W0 Q; j4 |; n, ]* R- K: {
6 d4 [# m% {5 Y: ~$ G@app.get( . f( F( i# R# f# U6 v- B "/calculate/userinteraction/info/keyword/",, J2 K# ^0 ~) j. h
tags=["计算模块数据接口"], " y! o4 n' U8 E7 q( s7 U8 s response_model=TopicKeywordInfo: W/ o4 N" Z# i* b% ^! e1 W3 ~
) - P+ _0 y/ g9 C# e& s1 h& X: cdef get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)): ! ]( C% {, e: y. H+ A! `8 ] N global topic_model_training_tasks 5 f2 K2 T9 y N* }/ N* |+ f \; z; C5 t) a4 g. H z; i( I4 r
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):& j2 x V4 C% W: Q) i: P% D
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")# a# Z; k- c+ q2 S# A: e. t
3 h# R1 ^) S$ e7 |0 v0 b task = topic_model_training_tasks[user_uuid] & w. M5 o( I5 Y% u if task.nmf_training_progress.status_code == 2:+ {0 R4 t2 `9 V5 |8 c' U
return task.get_topic_keyword_info(topic_id) + A/ n% ^0 Y% J9 H, r else:% |2 K2 U! S9 I' A- K0 O9 s
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ! e9 I, x* `7 }0 b4 ?0 t% [" [* H1 `& T3 L' D% [1 r6 l( }- I
, `' ]7 R6 r+ E6 g( A@app.get(' {1 ?3 J' v3 G# C+ _8 b
"/calculate/userinteraction/info/topicmergekeyword/", H2 z* k6 j# ~! k
tags=["计算模块数据接口"],, h6 J1 I7 }( h. H
response_model=TopicMergeKeywordInfo" ~* r7 M! u3 G; _4 K1 S
) " I4 z$ _1 n: w5 b6 Rdef get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)): 0 l$ y7 t/ d7 F: ?. O global topic_model_training_tasks 0 }- k( }* x1 ^# f# j5 Z% e- s Q5 W
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):5 u2 ~7 R0 C, O2 D0 Y+ Q
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 0 u4 g* t* _& H : B- \ Z) ]1 ]3 o task = topic_model_training_tasks[user_uuid] % y. o6 D! b! s if task.nmf_training_progress.status_code == 2:+ O T$ Z/ B6 P, M- [$ G
return task.get_topic_merge_keyword_info(topic1_id, topic2_id) 5 M- S! Z" |' m' X/ Q! i else:; U4 j& i5 @% m; v' H6 }
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"), ]; V: D0 A3 C% }! G1 V1 [
+ A; q. K& O- v6 N; t- i0 c* q7 t5 K) _; M
1 " R: O4 C( s9 c; ]2 7 {# B8 w6 w ~3 ! M1 Z* b& B0 u; E( t+ G$ ^: J40 T; h6 I# Z: E+ W8 _
5# \8 U. ^' z' J/ x$ F1 \8 R: A% D
6) ~0 M$ M: F$ C$ ^( A5 r* {! c
7 ! j9 i/ X2 I0 r5 \5 z/ z8: d; H3 f6 k, l0 s: f/ E
92 o: ], `1 M$ U: H
10. p3 I4 o% ?. o& {# [9 l3 j
117 x1 w6 y" ~9 i' ?8 H5 y, Z
123 [- R% i! q7 V6 ?5 n/ {- B
13 h P4 e8 u# M: E( V8 f
14 B, v$ Q/ J& r; x
150 }1 R& f7 c$ Y
16( ^' N m, `& v& S7 L
170 {, S n4 @2 `# |0 X
18 - t( t4 m1 G' z& @, A U19 3 m" y; j1 I. a" R* u20 : m/ x) K! B! I4 d0 @219 S. z4 ]3 F; _ w: L5 k
22- T4 y8 F+ v. g4 _% D3 O# e
23 % z* C) e9 _! |+ X9 s7 b s! B1 k24 8 ]+ e* V6 k5 i3 x7 i4 H25 / W- ^/ I* U$ y4 B. S* `26 9 z r2 {" T( g4 ^# }% g27& u6 F/ E* g' |1 ^( r7 [; r5 T7 @
287 A: q9 y5 `$ i1 `
29 % S3 Y6 _) L0 G7 a' t30 % E. N. R3 o% T* ]- M" m" a31 6 y0 v/ Z( a8 ]+ y7 a32+ d' i$ _( d: ]8 G) s0 J, B- i
33, L, s1 t( _/ K- \2 R
34: G5 m# o: ^! Q5 ?4 v
35 - K3 Y# J+ k4 D7 P36 ) X; Y1 H- i# O [0 [0 n37 * A2 ]4 ~% O. H# y38 & G; l$ F/ ^1 a( C9 j- o8 v39 0 F4 J8 R6 O6 P404 @5 G% z1 f0 e" i
41% Z) x, ?6 f# a+ V5 D3 f* t
42 ' v: h1 A; M; I& J0 q. `430 u/ x4 }" L& }, R9 k1 J# B% M/ ]) G
44 : v5 s& S4 o+ T: x; s N8 ]45 ! j6 R% n: a7 ?. n9 B4 {* R, L e46 ( F3 Q, ^: h# K2 s/ ]& u) p47" i7 o/ d! I( N0 x3 u% W* n8 x
48 3 t' ^4 e: f* V K, f$ P49 2 s( C+ i8 U5 T' o% b2 U% ^7 h50! ]# Y( K! N* |6 b
51. A7 u+ f5 B" V
52: l; d! P4 f+ M/ g
533 _. }5 v1 ?) O2 Q8 H+ l& b
54 $ F. ^/ [2 S7 q; R% ~55 $ _ R' y& L( k% y! a: I& k/ p56 ) b8 A% H7 Z7 b57 - [/ ]0 w' m8 _- a$ C58 & b( P! y. J! f5 X& J59 8 r% m+ Q7 k7 B" [, J0 z60 W6 f9 p, V+ d' _8 O% [& u) ^' q61 + _# c+ ^% v9 R* H. L6 J62" |% o2 K, |1 Y( v. I) {1 }& C
63 : m' L* u* |' k/ Z3 k, `- q) q" L- n64 0 Y2 Y' x4 P/ b/ S65; c$ a) a l& I. r3 z k7 j0 j
66; I, c: {& [' R& Q. Y
67% W0 n$ l' k7 @% l
68 ; w4 p- ^' s# U8 s) ^( G# K69+ o! ?6 i. k3 k7 ~! i i+ ?8 f
70; d$ l: y" q- q( E( M, C. }
71 2 ?( k4 ]1 F5 B0 {9 o. R0 c72 ) n& d; H9 F% {73 6 T0 ?6 ^ \+ N# Z6 C74; _- _- I+ D- x' o) B
757 [( R1 |, b0 c) d' \+ k4 y1 p+ t% p
768 p/ e, r% W, r; H" S* |
77) P: g% C1 G5 P
78' l+ a- _ a7 V
793 ?/ N0 Y/ T$ d( L# {
80/ i% O. u' w+ k* m" a4 L$ N
811 d& l n7 j! C4 y# L& g. D
82 % |" a4 j& ^5 y3 l& \/ o* V83* H. z; y$ ^0 j0 v2 l. \
84 1 _2 X/ w8 u* E- t+ C! P3 k2 J* a( k85 4 Z4 p/ D& h! k3 \0 y" X86 ' ]' Z4 [+ b O& f9 U, L87 8 t/ b# W6 U8 J1 s7 |# W- [8 B88 . V! H, w8 {$ i$ M" K* h, n- w89 % Z5 a) @% P: W902 `* Y! o5 u$ ]$ r7 G: c
91- L8 ]3 O" u. e2 _' B$ j% q
92# P* g2 b, ^# A, X- o- k
93) T8 M" y/ z9 U- D
943 N0 d* Z6 M8 K, h/ B
954 ]/ l Z, l5 z+ c
969 ]6 S8 R8 q9 g( [
974 y' ^/ G5 N& i+ D/ f
98 0 c! y+ `4 v6 T% V3 T9 s994 n* t) w% K6 d+ L2 P
100 r2 q- J: M E Z, Z
101; |# `7 D2 X6 q+ |5 t
102 : T r7 P6 t& H# N) v103/ L8 D) ^4 n8 R7 F
104 5 T8 @2 H+ @4 O+ D! h* c105 h7 V4 K0 f! Y* p( \8 c& c106 8 W( L( b9 H2 n9 z107 : f& C" T* i7 ^) ^! I/ Y: x108& }: d- W5 ^5 O8 \3 p2 \. r
109 # X& {) l( j: k: V: D1 e% N110 6 S4 M B( w2 y# I& G& H111 & t9 e- Y- g- o- n1125 O6 l; {7 K+ U% o `: O" b* e. w
113 ! P& j! ^* T% g' c' h( w) S114+ ]6 y) X) V: ?. Z
115 4 v9 N% ?0 K3 D$ T116 ) @* f: U$ h2 P+ ~3 C, N1 f* s117 ' q$ u5 ^1 k& q6 n: v. O118/ T# X. f) g, b$ Z
119 3 |: ?+ V& m6 u5 P120 4 D" g+ `* a( u1215 ?* N; x3 x1 d8 @3 j( Q
122 8 L8 u4 T% g* [1 Z123 - N/ |2 H; ~ c8 ^$ T7 x7 {% o124 0 K x {; |# }! g1253 Q8 E! X! G( b4 ~0 l) z5 g
126' ?) `, i) l8 f/ w
127 7 F t3 L) W0 M2 o1288 {/ o6 Z7 ^& p
129( F" _# _ }) y R6 S5 B" i( p% S
130. T$ q7 ~+ r0 I9 n2 B/ O
131 - I' k# b8 {$ Y3 Q132 ) }$ ]# U0 V( d+ Z, O# ~133% q7 u5 Z% @- O! C( Q
134 ( s/ P: S5 y- A6 S& c! E1355 u6 A9 A6 `: C
136) i- P8 h' ]& a. C# X" F
137 / K l. X; h0 w! M! I: R. l1382 s% `. [$ N* s1 y) t
139 * V- u" |) s& M$ R140 ! K3 i5 d" M/ Q# `0 O141 . Q, m8 t ?2 A, d, I6 T9 r* ^4 b142% A3 R% X2 ]6 z0 U* U
143 * q" C. }3 R1 d' ~144 & Y3 k6 z+ [& |5 o, I1458 S: P6 K8 a- X4 N- O- L) E
146/ y6 o# ]! S, X" s+ R
147 + p; W+ q& `# ^4 U7 \148 6 |6 E. ^1 C; ~) X149 9 k+ R+ }+ \0 p' e& O* X6 B150 * D3 N+ b1 }6 c/ ~151 - d4 T) z) J, r6 m1520 m! z, M# J0 y. O6 z
153 9 F# D; ~; l, f6 g$ _" ]154 H" H( X w# ~/ f- v2 O% P
155/ M# ]% N0 s+ m+ y2 a- a* [
156 " I( v, P, {) `" c; d4 D157 % r& q6 [+ V( k: _158 $ P/ P9 f9 I/ R) f+ |159+ v, w6 r+ A1 v, F1 n, Z1 I) T
160# ^+ Z% ^9 c1 A. h1 O
161 $ u% R8 |/ u! Q) D. |2 n# ]+ @1628 H+ E4 |* N; _/ ^
163 $ |" w( ]- ?& Z& h. h* l2 K164 7 p% M: h n: { h# ]165 9 H+ j, ~& o# O2 @8 m166 : V+ m. k! g8 j* A167 " U+ p- c( t7 l* F, C- C% j! m168 / Q0 h& z) V5 D7 p& }. E1695 Y: f( O& S) ?0 Q5 J
170. c3 w* h# L( @4 v* b0 g" d
171; ~' ?& A8 i' {1 e, Z2 S6 A
172 $ _" z( ~+ ?" R' L: b3 O9 m173 / { Z+ h: d( |7 ]6 r4 z174 ' x9 \5 C5 z' y; }( w4 M1758 H2 O o5 U! y( J; d' ?
1765 K( T; x* B( M5 z ]$ g9 V
177 7 @ Z% T: L# a: D1784 I6 p: ]# t! p* l- y
179 % t/ j z" G( o180 4 x3 O* o2 J( I181 \3 V; F6 _! Y9 M: }& p182 6 V2 C8 z, l4 T. n! c/ U: R2 s1839 b/ q- Y; |& H; w
1845 J6 g% Y) f# S- B' \. [
1856 u4 q! u# x3 S# I/ N2 G
186 $ W$ h- f t5 S9 C187 6 K, A& T' p% M1 K! e+ G188 7 g$ Z0 U6 h' `/ \, }" V: A189 8 z' U$ s5 a6 v+ [- |$ w$ P190. B: D* f$ l4 K/ M8 S) Z
191, P# c' V; A2 ^! o0 a" z
192 2 I+ s( Y1 r3 |. e" v& _* G3 f193' i, v/ ?$ e! i
194, v; h" U+ p6 J: \5 r" X$ N
195' f; D" P3 G3 b4 {& C
196* m) c, F6 j) Q4 d0 z/ M# Z* a7 o
197- ^* k! V8 O, F$ K; s
198! q! v: C4 ?" u0 w
199- [: T4 f5 [1 q: h
200 1 Z' |# M* ~% O) g* h! V2 \2012 U# O6 p3 C( _: ~/ ^; G2 Y
202 $ a% x8 Y& Z' L# F. m203 & ~$ S5 f4 l! A; I+ N204 - t( u7 C2 l# J# l y+ r; H2059 i: c% d: u# e' Y m1 w: u
206' c- R& J2 Z v" q, Y
207 ! e! r& J2 S- H3 [3 M2 a208; T* Z2 O& ?* d1 S: d' j5 w
209 . R. y; ]5 {4 r I0 A- B6 N210$ W( v) N" |3 s7 N {
211 ' N9 V8 n- X# R: L212 ) ?9 x- a* z8 O4 @6 _2133 I9 q' k9 J% l2 t; x0 x2 p
214 * s+ e: Z! j/ s! B' C7 F" m& A% \ u2150 M- B# M" c6 @" j
216% |; y' z- l* t. {+ p2 y
2171 Y( _6 M( l; r! |4 V* k: ~5 P
218. Q. D, W3 ]/ F
2196 x; {. `/ }+ b
220 # l7 M' n2 }5 Y- D t8 F5 r221 3 y8 ] {( x9 z. |1 q& P( U2225 {4 \( o/ ~' Q; V+ K! F/ T0 _; Q
223' x2 _8 M5 R3 w$ {9 x$ V* @
224+ q- [( z# e- m0 A
225 5 s1 m5 u$ Z' N% [& h5 r- D5 {+ X1 W226- a) u0 s" T" v7 H; \
227# [( N1 b+ x; _+ l
228' X. `4 E* w9 K# t6 D
229 4 W; P: ~( f: B6 c8 c9 ]230 g& B4 e: m; U% s8 V& z H7 f231 ( f* d l) k+ f* Q1 T4 B$ G4 K2320 S5 j$ h7 ~+ W
233 % Y4 o7 D3 N* ^2 ^5 ?0 w5 X234. P! |) j0 X4 w5 ]3 ^1 c3 w
235" t# H9 o m$ ?, n6 C
236 + G6 K& ~* ?/ m6 T% X* t237. e% l0 A% a) Z# u% j
238 N l2 m' Z- w) m( ]* d4 p
239, |* L L! x$ R' F
240 1 D+ H' ?& `$ W4 ^* g' R241 , m; ?- Y1 k" g/ V* k" q3 `" w a8 |242) a2 h$ X& z# e
243 ) @( e9 M& q, I% Q4 X! f R244 " j5 S' D! m; k6 y$ E4 D/ @245 $ ~; @4 S% t8 j5 L! i' ^) u2468 H& c9 i$ x0 s4 z c% C, }+ S) @
247% k- X+ G5 Z0 | Y3 p+ @( O3 F
2487 u! q" f3 E; I7 R K5 y3 G) t4 d
249+ r$ u4 P3 q3 Z0 j
250+ S* ~6 N+ G( n- i R
251" K0 f' Z. b9 i1 ~
252 6 A) N- _% H, E! x$ a3 E, c253 C! t9 r. P. D& o0 ]1 X9 v254 0 E" X* V# h0 y, [3 K255 j9 o1 k t5 c: C9 L256, m( M0 T& e+ b# E0 c* x( b
257: W5 O" V' Z+ B) `; H' |; Y+ ]- ^
258. R, t- A/ S" w! @, N& Q7 L
2599 S' A- n: Q4 F& X2 ~& C
2605 |3 W; d4 z3 Z8 ^$ \, G. T
2614 m% ~0 S2 I: {: T
262 4 e7 \. l, }$ L9 g9 K- a263 ' o0 b. A# T9 X( k- h& d8 I264* Z. w3 `: H3 i5 M* E
265 4 ]6 t/ ~ [; [266 Y) M' s9 ?; h3 A
267 ( z. x2 q% q4 f9 F$ S& C1 R8 _6 b% M3 M268 $ |. F v3 B# M, D+ e$ r( v269. ^+ v0 F# v G& R& d% _7 g
270 ( b4 a- t0 L9 z1 O271) x. i+ P" x& Z* c
272% Z C! R/ d5 S0 u& z9 m+ N
273 e# n d7 Q8 {& Q( V5 F' p0 V274 1 V1 Y' [$ i/ D- f9 @5 V275 + Y9 P6 r2 T% b0 ]( A* q# G0 s2763 y7 f) e9 | F+ l5 Y
277 + C9 o1 E: z7 r& J2784 T* Y0 U) R/ w. c8 [6 F/ r8 F
279: u, X( Z5 ^; n V" e( Z
280 & X" `2 ^8 m( t281/ t( ^5 y' O0 ?+ ]! }& p; w
2826 d9 F. y5 P/ t& J+ ]
283 2 Y: T7 N ~" G, r5 p8 a, F284 . c: I. W( @: }5 N+ S& @2851 q) @' E% t- n. W6 b
286 $ u: v" ]5 [, l- V287 E+ F( G \8 G4 n0 _3 k) D' c1 B
288" B4 c! @5 x2 j ~( D" t
289 * J# T. ^: j1 v7 j$ f; T, y, W; D290# v$ ]3 s, w& b: K
2917 ?: C+ a. z8 Z7 g# [
292 , o5 U3 c) p* y+ N+ U$ Y293- ?; m! Q% P5 T n" d( L/ A
294 " y9 x# P1 `( l7 L$ @0 B2957 T D9 A0 K$ a. X3 b9 A
296+ E- g1 ?, v+ h3 R- W' t, ^& ?
297/ n! ]0 n, y; A- V' k' Z8 V) }
2981 X- W+ R" W* x3 o+ @& \ n9 F
299 ; j- N* q+ W4 k2 n! }* ^300 / V# U! ]+ D+ h `6 \' O. Y2 ?. e301 * ?; Z( x$ L% M' n5 Q" n% |8 t3023 z& l5 ~' J& C5 f# T
3038 @, j+ y! D$ N
304, `8 E; p' x, m' ~
305 % A0 ]$ C( U1 n0 }8 q @306 ' x1 ^3 u6 \; h; [2 g, x. f% w307% {( N. \ K# B' p" W: f
308 5 L2 r9 l2 Q" \ Q+ K; A, O5 B309* c1 z+ q$ E* K. y8 w# ]
310" _8 v) `5 @; K9 u; w3 p1 S8 x! y) E9 n
3112 n, ^" [+ a6 ~/ v# ]/ O
312 , F- G0 `+ V& R; M' ] m, k* w313 6 Z) F' D. M0 d9 x314. u5 q4 I ?7 K" ?6 }
315 " N% b ^1 p6 G, u. X316 2 e) x2 D$ Q$ ]6 N317 8 ^ d; D4 c- B0 Q318 j: q: n2 U2 _: }* X1 |* g9 e319' c1 H9 z" Z: Z9 {, K
320 ; x! l3 W2 Q4 m6 p7 v7 y# M3218 ^9 \8 `5 n$ R/ o. X" E: ]$ p
322 - O, i+ a y. ?3 A& w323 b; p, u, P$ a' b324 / J& c3 R% d& j' P U8 \325: ], P5 \9 O- @/ @7 N
326 0 P! r0 P8 {0 b# ?; x& @" e3273 G, s. Z: F: A( z0 _1 x% |
328' Z5 X5 w7 q8 v5 ?6 W, p. X# P
329) M) [/ e( _8 F% ?
330% [+ H5 w7 V5 K: C2 ~4 D/ k
331 : T) F0 {/ d" q! |9 V332 ) j" z6 u `% K/ [$ M/ {3336 ^2 B. k' j7 v7 ?1 E
334& A, o6 K* n8 K) K! [& e: c& F9 [$ d- `) Z
335$ S# v$ j. E2 @: \
336- y! t9 K8 g# Q8 h" o& V
337 % `; R2 R# g& J7 Z# e v4 W! f338 # P& @# k- G ^) D3 z U7 E339, `+ D: k( f! W, A( d: T
340 - k% `$ B( f+ t. k( t; g341 ' U9 R& k! K( D/ H% G* C+ L9 ~342+ Z6 ]: _( d' F( N1 ^. Q. I Z. I
343 X, o z6 L5 B4 H/ _- i& `* L3447 R3 \% J) j5 z& T" F' v7 @
345. a: G5 u: _) b- L) _! P ^
346 $ ?- }0 R% _2 o9 ?5 O) u% ?' d347+ o. \$ a# Y- w3 v, T/ k
348 0 S$ u0 e- y2 s- Q9 k' a2 |2 N349- K4 g" a! J. G# ]1 a
350+ {2 U! N z& q( K( x9 W; K
351 ' A. a5 C) [+ a! U6 ?! M352 , ?% q* J" P) A* {353 ) E' _8 j/ A3 Q) T4 ?/ C354 3 F+ }1 r- D! k+ ]2 s/ ~355 % S& r9 g! l! x# s+ P0 Q. |356% }# f3 z6 J, R/ [- x7 B8 \! y$ G2 P
357) i: D% a- z8 D: Q" ]* b/ @
3586 w# R l. I: _! m$ D9 D+ x+ r8 V1 ?; b
359 7 g; @% r! _: e/ J3601 M5 I( N! [' q$ |7 e
361 3 T) X! j. A- c" |. [* Z8 b362 ! z& a; g8 c+ n1 a5 O363, V- E3 ^: X3 `) Y
364$ C" D% d9 \. C# e/ U6 J% d
365 . C" L. i1 c7 b. L. x* A3662 c- |# c: _" o. B' r
367 + q2 v; c9 F% }4 N/ V9 w368 % u, h: m+ d) p7 x! O6 m$ _. I1 `; X3690 S# R, _0 r+ h5 A! a
370, h/ z# N, @6 N4 F
371 ' S7 r! \- t$ W8 Z, r372 " l Q2 U9 M. G( d! p; y: P373 3 M* k1 K: _: I& I374 + R; T0 N% }. n7 o375 " @$ X" H" R* n376 K0 g* S I7 C. J
377 8 }! }6 h& L' v' P4 [/ |9 b! r0 }) f378 ?# z# `) H" g- w
3790 m4 H* m1 P+ Q5 [' h% C: z( O
380 % X# k3 O5 h9 \% d- o4 U381 ! N2 c8 k" A+ @4 ?382, R' i8 j M" j& P" }; k
383 . ~! D0 @8 g% M: U+ O384 2 z: M2 J! k- x5 q% r385 , ^1 |$ o- ? u. u7 S) Q386 3 a' B) @. }3 L3871 F# R5 t$ u, L* O8 J/ z. v/ D
388 u6 |- B' _( X/ ~ R
389% K" s7 u( X3 _! u% ^
390 , K+ g9 d. i2 L, F6 v/ L3911 A% S8 M7 p- q2 R0 b
392 . W$ s M* Z1 `+ X393$ `9 a0 y2 {8 b* }7 q3 x
394- x/ ~3 m! g; m; F
395 9 m8 h% n3 D# J3 a1 G396 , \4 o3 r' y+ t" G8 D: D397. q; ]1 B. i5 B9 i
398 2 F- P2 T$ z- ~" v, U! _399' s$ m' Q+ h% N9 P
400 4 H' ?" G/ e, Q* I! E401 * x% J& T- U" W- T1 C. Q! W402 5 T* [* c; G" e' ~' X4031 T7 D: K4 Q2 c& w$ @
404 6 N0 j! W7 w: n$ D405 " z$ r: N( y3 B. j406 1 c" l1 t! Z9 }" A& {4075 r: g) y# E' B8 J1 g: @* N+ o. ?. m
408( G, `2 j3 g, @) `: F# p7 P
409 3 k5 N' p# I& N# @7 U4108 v8 }8 r& {4 \! S' M8 M# c4 `
411* ?, b, \+ R2 o
412 . z/ {2 A- Q+ e- o" W6 H413 7 U' l& }+ @ O: z! R; C( n414. ~! W q) M% K- F. O5 A
415 & k! E. P2 F8 Y) M- B' X" T9 O4164 j8 A' [. X$ `' G9 X
417 # N! v4 D& _) h. N0 u418 : m q1 I) R+ l" O! A! S( W+ j419. n7 Y1 b. [4 ]3 h
420 ! |; p& p/ v$ f5 W) I1 n2 i4212 k C4 M$ o# V
422. c( I" R# U3 j, o& v& B8 H
423" B! ^) C' X9 f, \, d/ _1 Q
424! R, q/ R3 ?: Z( Z* M
425- x' |8 y- C* d. t
426 $ B. ?5 B6 m; _5 [427& X1 l2 I' G4 P( r) U& k" Y* M7 k+ L
428 3 C8 P5 J) m1 Q/ V" ~# v* z2 z429 * P0 p( s4 `7 c4 p4306 f4 z( Y- F, g; Y8 K
431 3 Q) A4 b+ _2 C' m6 c" V432 , Z6 ^$ n, ]/ f3 G8 u9 ]" B( e. H4335 U: k# ]( y* P$ M. q
4349 O/ G" {+ H0 S0 C( r- A' e9 T
435 C: V* s& Z) x9 V; P! j# V" M, B
436* n: [) l) f( b& }( b
437 8 q B2 L. f6 j; d9 n438 $ T( i% t6 P0 t5 p O9 o' B439 j4 k M8 j8 j. i" ~1 r
440 2 |# f0 S5 S) @1 F( _ A( ^441 ' [* E* ]3 g! O$ ?442' B/ ^- m' J; q9 A/ Q. B
443( ^5 b1 y# N( a% H' A! A! P$ d
444; B6 V4 B) b0 {' K
445 : L3 S: j0 I/ P5 L4 F2 h! Y446 3 V0 @+ e1 l" U( W* T* g K4 A447 & e6 h+ y8 p3 f! A6 c" G6 B* [448% I$ Y+ o0 v& o
449. C3 Y$ i% G+ {4 X0 @
450 - g2 M, [# f4 z8 g( S: y7 ~451' c' Y% m. a! r/ y3 O" N
452, Q- J+ w: ?+ K) B1 t
453 0 F$ F0 r' }4 H) \% N9 k6 g) Y454( k3 n4 }& S# X/ c7 u/ O
455) K+ x- E( X* X0 v; W# g" A! `
4562 P' _' P* E. ^3 g
457 6 j9 v7 n( ?; f8 @2 Y458 9 c/ b/ G; z9 @# V" h459# l5 o. @+ O) j7 e
460/ ~0 Z M( a; m% }$ k+ p/ ]
461 4 o# d$ {9 f% y/ [9 V462: ~( v% n/ M7 p( i4 M1 N
463 `- J: ?" R/ M7 S+ s
464 & s7 `# e9 N8 X! e d" ]( M; o465+ u+ [! z3 m1 Z4 R
466 ) V' M' p/ W/ P$ r0 Q" h# y467 ( S# r/ r6 Y- J4 M468' x3 y3 y" b6 L# y
469( G7 h6 t' k9 ?/ A* W9 O. k
470 " T; t4 D$ T# A3 s: |) v# V471# l* {1 u- ]( V' ~* b
472 # V) o b+ e/ L& n" H473% v* L# Q2 l; a, W G
4741 S1 L8 _/ H6 T1 c
475 5 {& w7 W* C3 m+ p, W& u4764 m* n0 \3 X D# f' R
' ~; } B8 c0 H1 ~2 [9 m
7 w& J' w8 `/ | C
5 a& z- R6 D; m8 N. B+ N5 [) v
R @ J/ k& {+ T
, g* |& b/ O( c) \0 G0 o) j. \& E/ B t
1 c$ _- p& [( O4 i$ Y7 i9 [
: `! Y5 L0 Q5 O7 {
$ L% G; i9 `$ q9 S X/ a! W5 q9 P
$ e! n5 B. |& k* Y7 F. b. W
5 D2 v2 J0 A( y3 I5 ^
5 e2 l" k4 _& A; ]
6 v7 W' F) w$ N3 ^% A
& C/ k, D9 z7 y' t7 v# j# R0 p+ \& E; o
6 [! |" i$ ?2 k0 D' @+ B8 r" Q+ H0 m* p9 X7 s1 e, n9 z7 a) s
7 o. }4 a7 ?3 l% a0 W3 U) J
8 |+ x: S/ y [* ]& J2 W
3 L; H" ]( ^8 L& M3 p5 U
6 C- `- r" V( C8 R$ ?
( J ^! H% I" ?' T5 h) X$ S
, q( P. f' j6 M