- y1 y+ }' ]( |- x6 k; r1 h@app.get(7 k' n% U8 L( _
"/takeawayReviews/",( M8 b, @4 }# a! E. K
response_model=List[schemas.TakeawayReview]," _+ i$ k5 n- R/ u- x* E x5 k
tags=['外卖评价语料库数据接口'] F6 H- Y: r. ~/ S% a# ]- [# W
) - V: L, d! R9 I5 w$ Udef get_takeaway_reviews(db: Session = Depends(get_db)): 5 t4 _; T7 |5 J db_reviews = crud.get_takeaway_reviews(db)4 g! s+ _ ^$ M" g( V8 }* E( N
return db_reviews/ U; k) n$ N7 u6 z- G' F
0 C. g7 A( {( k; m& P2 q# S# O . m* F1 ^5 \7 X4 T, Q" U- z@app.get(7 H _7 t% W/ o! O/ J; ~+ ]
"/chineseLyrics/",8 F) F( h- g+ ]+ \/ g
response_model=List[schemas.ChineseLyrics], : P8 \; @5 x3 V( K tags=['中文歌歌词语料库数据接口'] 5 H) D" Y8 k& T/ j0 K) v7 {2 M) : z8 x7 J2 z( _: | J! jdef get_chinese_lyrics(db: Session = Depends(get_db)): . Q& Q- J2 R, l db_reviews = crud.get_chinese_lyrics(db)- s* w0 c3 V2 }
return db_reviews! y. E1 j% _# R. x
; d* R" O4 T' q/ h* g5 a8 [# b8 [ * P, J1 Y* }' ? M! J, c@app.get( 7 z& \ `4 F. P" N( D9 \- ~6 h* J# u$ F "/COVID19News/",& n A* h3 v# [( C3 V3 c5 s: d
response_model=List[schemas.COVID19News], ; {! q1 i1 n+ L; g tags=['新冠病毒新闻语料库数据接口']" v X/ R1 d; P0 T4 w# g2 }
) ]8 e# ^/ Y% c- \
def get_COVID19_news(db: Session = Depends(get_db)): + w( n) g8 V! ?' e+ U db_reviews = crud.get_COVID19_news(db) . z' k- W6 ]6 V! v. U return db_reviews * W% X7 w" N0 [% r) \% @& Q7 n) [# K: d. i. x5 U. u2 `5 }% q
8 Y! S2 q! Q" e1 V5 H7 u! g
# 为每个用户设置uuid标识符,并存入Cookie : J' a7 f. R9 O* H3 adef create_user_uuid_and_set_cookie(response: Response):; z2 q6 w! |& ^5 s* ]
user_uuid = str(uuid.uuid1()) K: n7 Y) f! b- M; [) e
response.set_cookie(key="user_uuid", value=user_uuid) ( v* t. P) j6 Z3 z5 h return user_uuid + L$ j3 u8 M K7 _0 r) o# ~$ _( q9 C9 ~- D# ~
/ x' {( N- ]6 ^1 ?: J: z# t8 R
@app.post( 9 V) E; w+ z, P( T "/calculate/preprocessing/", , N3 o4 u2 I2 M/ J" ] tags=["计算模块数据接口"] 6 H& e/ X5 l9 d3 W8 |2 H- ~1 @, \): `' ]) Q' U9 s5 |5 o
async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams,& q* s8 v; W: S0 W( @0 n- E
background_task: BackgroundTasks, 7 q+ p, @' v5 b. F/ H response: Response,5 A* K \' F7 z2 M! H
user_uuid: str = Cookie(None)):7 [# D( n% I( M8 t; m* ?1 W& }
if not user_uuid: 1 s+ X% I% H! X8 b user_uuid = create_user_uuid_and_set_cookie(response)) Q6 c* J9 L) W; z+ K
' p: T0 Y( f) i
global topic_model_training_tasks" S N: Q% Z1 @! N) J( g( C
task = TopicModelTrainingTask(text_preprocessing_params) : l y3 r# r8 F. d% F2 l$ U topic_model_training_tasks[user_uuid] = task * r: y+ p+ K7 K" _ * z0 X0 l1 T1 ] o$ V, h background_task.add_task(task.preprocessing) & ?9 J8 ?3 o0 B. t1 D& P return {"message": "已添加文本预处理后台任务"} " p6 {% S' f$ i( d+ y: f& M( H & y# |! `0 f! u% ?6 u$ N$ k8 O8 k! J. }; L8 G3 s5 i% e
@app.post( ' Z7 a; a: G) R9 L* }2 X "/calculate/nmftraining/",, j$ S T. a. k! d, L7 A
tags=["计算模块数据接口"]1 s# ~3 ?" P$ h* |7 e
) c0 e. A- Y+ G4 _# f& b
async def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams, / J# c- l/ R7 C& p& b9 U3 _ background_task: BackgroundTasks, & c' r" C! `; p' x. v8 Y! v response: Response,( c$ v. L! L/ n; n6 @
user_uuid: str = Cookie(None)):% ?/ r2 m$ ~6 ?
if not user_uuid: - ?+ e1 ~; V5 z/ d) R user_uuid = create_user_uuid_and_set_cookie(response) - \ n- r, U6 y1 A2 @( p+ e z( @3 w2 ?4 K, J7 Q/ j- o
global topic_model_training_tasks/ W& B( `( O& |7 V
8 L" h c) s. ^7 Y( z7 D1 F2 p
if user_uuid and user_uuid in topic_model_training_tasks: 8 i5 G" l: ]! x+ a* a task = topic_model_training_tasks[user_uuid] % V- T3 p: v' F! z3 \' z if task.text_preprocessing_progress.status_code == 2: ; r: g: E, B6 z% N0 M& O background_task.add_task(task.nmf_training, nmf_training_params) / Y* f- k) y6 e6 l1 p6 p return {"message": "已添加NMF主题模型训练后台任务"} , v% E4 a- z: [1 e- w+ k else:7 X7 P& F* @6 q4 N! e
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!"). V( k! ^ p6 i7 z
else:" B& I3 C" S2 E; u
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ) i g% h* i! n# I* Z. X) l. T
2 z" |6 O; F" ~/ u@app.get( ' w: N! H' O) D8 ~9 g "/calculate/nmftraining/keywordsearch/", 2 F4 c0 k% J, D u. S- z# ]# `" d/ U2 ^ response_model=KeywordSearchResult,/ S5 J# G, s' U; \8 z% [
tags=["用户交互"]! j( @7 v/ Z- k+ Z" c9 _
) # L b+ @( y7 f8 u) f; p' C: Vasync def search_keyword(search_text: str, 4 V( E2 k" K. |. m response: Response,! L" D7 g: J+ ^% o0 g% j
user_uuid: str = Cookie(None)): & \ Z+ a7 ^! Q) `6 E$ Q7 z if not user_uuid:1 R' T" s; L9 j. l6 D, o0 H& N, B! z
user_uuid = create_user_uuid_and_set_cookie(response)/ E1 h7 m' q7 o8 g
8 b4 W ?4 X4 k# W5 i8 r
global topic_model_training_tasks ' Z! B+ B3 t" ~3 ~) o2 N& u0 F2 d6 l6 O! W; @" O( _+ q. Z
if user_uuid and user_uuid in topic_model_training_tasks: ; c0 [/ e6 U9 e+ d task = topic_model_training_tasks[user_uuid]9 R+ l9 L4 E& Y1 H
if task.text_preprocessing_progress.status_code == 2:8 x% k, L* q1 s$ U/ q
search_text = search_text.lower() 5 Y% T2 ^& Q q bag_words = task.text_preprocessing.bagWords- u3 ^# r# Z0 }8 r" {0 u8 D
keyword_search_result = KeywordSearchResult()& E6 _$ Z0 Y7 Z& g; R5 |/ \ M
for wi, word in enumerate(bag_words):. i! z) x% I) S3 }8 }
if search_text in word:+ h0 }$ l, G/ z/ p1 M, V/ T
keyword_search_result.word_id_list.append(wi). N6 M" a4 T5 Y# C J$ f0 ^- X
keyword_search_result.word_list.append(word)7 e, b: c3 w. F& d# p/ m( A4 u2 W
return keyword_search_result. v; i3 G: Z; s
else:- B; c9 x0 w8 @ n: }
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") - T7 @' b8 y/ N8 {4 x+ x3 ] else: ; Q2 T* b, @. c; x raise HTTPException(status_code=404, detail="未找到相应的训练对象!")5 R( J( E- L0 c3 a# F8 _: A9 W
% O2 z; |9 n! H9 ]; _% b' I$ C
& O$ Y) L Q$ K* k& R c
@app.post( ! ?4 T# A* W; U, P) h' x "/calculate/nmftraining/topickeywordoptimization/",2 f& Y- Y' B- }% q
tags=["用户交互"]) ?3 K8 e: j. \- b) E, f b* i
) ) \% |/ T# j8 L0 D1 x8 {async def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams,, b& Y% D* R& H0 a8 Y& S
background_task: BackgroundTasks, , }' ^4 Y% D" ^9 ] [ response: Response,6 b* F( t8 ]6 j9 f c- [' D
user_uuid: str = Cookie(None)): + l; w& ^% M- V4 X1 _" j if not user_uuid: # [& d: ^. d& k7 I) c) q! ^ user_uuid = create_user_uuid_and_set_cookie(response)9 @% P W$ z1 G1 T% K4 P
- N% D, x# A- \2 T, P
global topic_model_training_tasks) W( p& n N `4 A, O
8 ?& @3 Z6 s( b if user_uuid and user_uuid in topic_model_training_tasks: e3 @9 T2 d: Q7 D1 f l task = topic_model_training_tasks[user_uuid]# i. x4 F- ^3 ?+ w! p0 b, F I
if task.nmf_training_progress.status_code == 2:2 z( g) v/ [$ W h& S* c( q# W \; Y
background_task.add_task(task.topic_keyword_optimization, tko_params) 0 A& }- k' \8 \ return {"message": "已添加主题关键词优化后台任务"} 2 V0 M* e V$ @ c else:' j$ R1 n6 a3 g; U
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 3 ^/ c, u9 L, J b; | else: : p5 b3 I! c$ i6 j% X raise HTTPException(status_code=404, detail="未找到相应的训练对象!")5 {% T/ x- x: N4 @7 w
: K8 w/ Q. E0 R- \4 F$ Z+ p; v# S
. \3 z* K2 Y* p0 T. ]. n. n; M
@app.post(3 N% j& P, Y6 d- z5 b0 I
"/calculate/nmftraining/topicsplit/", G3 _5 l" t" F
tags=["用户交互"] ! }4 e N3 e( S8 A# O( M$ ~. H) . H7 Z1 R/ p# q1 y) Kasync def run_topic_split_task(ts_params: TopicSplitParams,7 j9 G$ o# {! ^) |1 Q( ?+ [6 q
background_task: BackgroundTasks, G1 t4 V( O6 {4 c response: Response,; y( ]0 T6 H" m
user_uuid: str = Cookie(None)): ' C( [5 j; s6 L# F, u5 u if not user_uuid: 6 ?) |; t* s! u' U) M) H6 k6 c user_uuid = create_user_uuid_and_set_cookie(response) * G" R. t+ `, X: G& G' W& b : B+ P, o. v7 x$ K r0 l global topic_model_training_tasks1 Q' ~. z! S7 ^* f& s4 u8 q
9 p$ b: Y/ E: H/ T2 Z8 {* V- q
if user_uuid and user_uuid in topic_model_training_tasks: $ X3 {2 P! M- P5 C1 X+ |# o* q task = topic_model_training_tasks[user_uuid] 6 ], ?8 G2 C. c5 e: q/ x if task.nmf_training_progress.status_code == 2: * O2 Q3 n$ `+ k w, G z/ n2 c6 q background_task.add_task(task.topic_split, ts_params), I% p6 U( j5 k, n# U
return {"message": "已添加主题拆分后台任务"} ' p' D( T& |8 m. o else:' t0 C/ a# \0 Y2 w5 _9 `( B# ~
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") / V6 u9 d7 U5 b/ W3 i+ v" R% O6 D else: 8 Z. t6 Q% m1 x6 v5 f' W3 Y raise HTTPException(status_code=404, detail="未找到相应的训练对象!")% l' X( g; C; ^( t: x' w2 j4 I$ K% P6 U
; f9 F- @+ k2 ?/ C
: r* q0 r8 |: X$ Q: G7 x@app.post(1 k& C3 \# t( \4 Z! B/ j6 c2 l- o% r
"/calculate/nmftraining/topicmerge/", / r; s w( o) y tags=["用户交互"]& G! [+ e( f/ m j; H/ u X
)# P% ^' }) G# V5 I
async def run_topic_merge_task(tm_params: TopicMergeParams," ?' X7 k6 @) _
background_task: BackgroundTasks, - u' Y3 e! o0 b6 b2 v response: Response, ) ?/ J( h: F1 Z9 s! y" B4 B user_uuid: str = Cookie(None)):' v2 T: M: D, D- E$ S7 c% ^7 Y
if not user_uuid:' u- H6 W0 r A' J
user_uuid = create_user_uuid_and_set_cookie(response) ! L9 u. S) I( n0 D / f) K' g( L' f% y# F) X global topic_model_training_tasks/ b7 k1 S) @2 c
$ U4 k! o3 O2 d* t/ K
if user_uuid and user_uuid in topic_model_training_tasks:$ b% J, G* A I9 {3 L0 |
task = topic_model_training_tasks[user_uuid] 2 O+ s9 j# r. E# S1 a" ^/ G if task.nmf_training_progress.status_code == 2:5 o. ?" ]+ S0 M9 @0 x$ h
background_task.add_task(task.topic_merge, tm_params)* R, v+ q" N! A4 f b
return {"message": "已添加主题合并后台任务"}0 E: [4 d. s6 d1 z3 W, [
else: + C% \; c T+ p* i+ w( `& o% F raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")2 z6 G) o: [+ x0 M* s! V
else: 1 V7 H1 O q. D# ~ raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 3 t# S; l8 x" w# S6 [/ ^2 ?' i* r! j# F8 o) k
4 W( a0 N' R" o/ _0 `8 X @@app.post( * G7 Z" Z' R/ R3 T; x "/calculate/nmftraining/keywordinducedtopiccreate/",1 W2 W3 R p& Y) ~) R" M
tags=["用户交互"]0 F& L0 j W. |5 A3 z% S V
)3 J$ H* K0 Z- a8 ]5 H
async def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams, 7 S5 ^& \7 c0 p- s! a$ b# n background_task: BackgroundTasks,3 B9 H" l. t+ _) z: w
response: Response,' ^2 F% L6 K I
user_uuid: str = Cookie(None)):/ w+ Y; S6 Q+ d. C* V! Y
if not user_uuid: , }1 j7 D( k4 E" \* q! v0 [ user_uuid = create_user_uuid_and_set_cookie(response)* n0 E* Q" H3 ~' t% B
$ m( A" R% A2 Y3 m e6 o: G1 A global topic_model_training_tasks' I% I9 e2 ]# ^) Q
9 H- Q8 z( U7 R if user_uuid and user_uuid in topic_model_training_tasks: 3 F; u$ p) X& N7 J0 w/ U! z task = topic_model_training_tasks[user_uuid] ( A, c/ t& O$ } if task.nmf_training_progress.status_code == 2:# @& ]1 ]! x$ J$ z, V
background_task.add_task(task.keyword_induced_topic_create, kitc_params). U* L& W& m {) ~: s5 p
return {"message": "已添加关键词诱导主题创建后台任务"}9 s, W! x+ i2 g+ R. G( I
else:1 ^6 I& v' r$ A; |* x9 d7 F
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")+ b* @8 H, Q( b% ^
else: 0 i# O# Q$ v/ |) C* x- |% h4 G raise HTTPException(status_code=404, detail="未找到相应的训练对象!")2 A% k5 R- o% q
( l$ O4 {* w+ v" R- } 7 y% w* R* }" s9 f7 Y1 O+ z@app.post( 1 {. }1 b! |) V7 r' i' N6 K "/calculate/nmftraining/documentinducedtopiccreate/", 5 L5 N, \; L2 K; e1 Q' m tags=["用户交互"] " m: W0 C' O3 ~ y) t* v c) . k* Y2 i, k" \' o/ N& t3 Lasync def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams, 6 ~ I3 V0 }8 b7 }3 E background_task: BackgroundTasks,, y6 q* X4 `2 g
response: Response, 1 }3 k. T! T' E. @ user_uuid: str = Cookie(None)): & N( j3 s2 j1 O+ g if not user_uuid:, W) j! N% a( [6 E; C
user_uuid = create_user_uuid_and_set_cookie(response) & I( w/ N5 F6 U8 o' E& ?! H4 P& ^4 o' y1 [* N
global topic_model_training_tasks 0 s& g' I* S! y( \ J- N 0 M: s$ a9 M/ U; i8 r if user_uuid and user_uuid in topic_model_training_tasks: - O! a/ D' A. @3 g- x task = topic_model_training_tasks[user_uuid]7 ^( a& l) l7 ?. ]# w
if task.nmf_training_progress.status_code == 2:8 |$ O" L) u' q0 i1 x" A- D; n
background_task.add_task(task.document_induced_topic_create, ditc_params)8 |2 n0 Z5 v* v, I8 d: o. b
return {"message": "已添加文档诱导主题创建后台任务"}, ?4 R# D( A$ ]5 |
else: + P# O+ R, C% k' q( d$ t raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ) A' O1 y( d8 l0 { else: * G, h8 t6 E. h1 c- k raise HTTPException(status_code=404, detail="未找到相应的训练对象!")+ H+ N" r. o" D) i# Z
. V5 m) M# c0 L \1 Z" O6 ^1 D# d: F, E( v& [+ S( H
@app.get( 7 M; M/ k/ T" |$ Q2 i "/calculate/nmftraining/newdoctopicdistributionpredict/",% N3 [2 I' e4 X2 [/ D
tags=["主题预测"]8 {. R% U7 F; A' i
)! R) T! z' t/ U; b
async def run_new_document_topic_distribution_predict_task(" X2 W% l( Y) g! r& g$ L
new_doc_text: str, ; }( `& ~ t/ O7 ~3 z0 k+ F background_task: BackgroundTasks, + K) O5 Q& }4 o" c G, | K response: Response,/ S4 `9 R5 k5 C
user_uuid: str = Cookie(None)): - ^2 }7 ~7 g/ d6 ^+ ]! j) a/ h if not user_uuid: % }/ w. P# a r( K1 {- h/ m user_uuid = create_user_uuid_and_set_cookie(response)1 }+ T, [( o5 f* N7 V2 Z
4 Y$ E9 ]$ Y4 p6 `6 y
global topic_model_training_tasks0 @+ y7 u8 M, `6 I9 `) G) u
( r7 v8 B: s5 A4 L! ?- N+ x# J
if user_uuid and user_uuid in topic_model_training_tasks:0 o9 L' o. x; L
task = topic_model_training_tasks[user_uuid]) a5 S1 U% T6 y3 e5 `/ X5 _
if task.nmf_training_progress.status_code == 2: 0 B4 f1 K3 u [ background_task.add_task(9 |; o; E4 A3 X1 e5 Q
task.new_doc_topic_distribution_predict,) C/ }2 i* Z* Q4 X, t. N; G
new_doc_text ; k9 y0 \' |: d' B, Q ) n t" t: Z& }# ]* d$ u1 P return {"message": "已添加新文档主题分布预测后台任务"}0 u; N3 l; X, A* i3 R V/ d! |/ a
else:. m- M# ?3 [. d8 s9 [8 v
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") * ?# Q$ j+ c" h' C9 Q! V else:! t% r% ~/ u" t! K8 B: ~3 O
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")( f1 K" I7 c" w! d7 r
+ e2 {) X" ? T' z: D
4 C1 F* _0 b: N. g Q( l@app.get( ' T: ?" f3 o a% L( L: g+ l* v "/calculate/preprocessing/progress/", 9 `' l% Q8 r1 W3 q tags=["计算模块数据接口"],9 d& j4 T8 p9 |$ I
response_model=TextPreprocessingProgress+ C3 ]0 p6 `5 B& x
) * Q1 ?3 u0 r G+ X9 N9 Kdef get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)): 9 E) B' r! [! b' W4 l! {2 l' E global topic_model_training_tasks3 Y+ c( B3 j$ f6 y6 x
1 N9 |# p' f, l3 ]$ ] k5 f b
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): * s" w# H+ J- P3 D! T# ] raise HTTPException(status_code=404, detail="未找到相应的训练对象!")7 I- U }* H* K# l1 i
return topic_model_training_tasks[user_uuid].text_preprocessing_progress . V/ X- \) Q" N6 w 1 g8 v5 \0 J& e) i1 _0 X {& K! t7 E0 _ ( I1 Y0 f: x* `7 b3 g# w- e@app.get( 7 D! A9 G, z. e "/calculate/nmftraining/progress/",' D: I8 C& p3 E9 r! Q2 G
tags=["计算模块数据接口"],# B; ]& Y& d) p0 y1 C, G
response_model=NMFTrainingProgress # w9 j1 P5 X% `% a0 M. b$ w) o1 d) 8 a+ }! ~( x6 f! y( adef get_nmf_training_task_progress(user_uuid: str = Cookie(None)): ' y, _5 Z+ d* o5 k9 r% i global topic_model_training_tasks# O8 j& K+ D* h. f
, ^4 D, `* J* k% ~1 B if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ; D$ N0 Z @% j. j raise HTTPException(status_code=404, detail="未找到相应的训练对象!"), ?" [$ X: Q2 M& C
3 t! {8 l) I9 N% L0 Q: S# E task = topic_model_training_tasks[user_uuid] $ G' j' P, P/ ?; l g! S if task.text_preprocessing_progress.status_code == 2:! }6 q( h& b8 ] t
return task.nmf_training_progress # |# A% K# q0 Z7 B# r else: , h% A) U4 x2 C7 J$ C raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")/ r x- Q$ C6 P. `
; l* i$ E/ ?2 T* S' U! ?$ Y
/ H& H; H5 h( i4 b7 ? l& t@app.get( 7 M& F g( v0 h, O "/calculate/umap/progress/",+ p5 d- J) y% n
tags=["计算模块数据接口"],/ _. G/ Y7 m4 n1 r
response_model=UMAPProgress+ T8 v: s5 ^- s
) ! g: l& e2 e* T: X& xdef get_umap_task_progress(user_uuid: str = Cookie(None)):3 P2 l0 {8 u5 \
global topic_model_training_tasks, {" E: @" B9 C6 c- o9 L9 l
0 t3 v# \, o, q6 d if (not user_uuid) or (user_uuid not in topic_model_training_tasks): . o% N! \( y; j& V3 C) d5 c raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 4 Z: D, }5 z$ i' M; d+ D3 r' ~6 ^( Q
task = topic_model_training_tasks[user_uuid]. a! }5 x+ A7 `# T! E- S; _' J
if task.nmf_training_progress.status_code == 2:& i# l$ ?" b5 q$ _! r8 u, b
return task.umap_progress 3 I/ T5 Z* V+ K/ W( k- k else:( p& _8 G$ B! h) u0 q( Z
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")1 K( v2 A+ I1 b8 I, G
7 p) e0 t( r0 P " H2 ^% F3 J7 y5 F& k@app.get( # e5 d% Z2 N& J8 V "/calculate/nmftraining/predict/progress/",# F3 `) O/ j! t+ D
tags=["计算模块数据接口"], , t3 }6 O) r& ~! d- s. n% ^6 E' v response_model=NewDocTopicDistributionPredictProgress & R8 n# B3 Z- O. ?) # P4 s3 w) O/ D0 H& \def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)):4 {; u* w' \% P9 }& ^" l5 j: d$ y
global topic_model_training_tasks5 [/ q! n9 v, Z. |
# I* I# s, W4 `8 p" _0 X5 Z" n
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): / L9 C! a5 k- B) K raise HTTPException(status_code=404, detail="未找到相应的训练对象!")7 B! o, }8 \8 c+ m+ r$ r4 e( h
% c; H0 W* ^7 R% B2 {: _: t7 ^ task = topic_model_training_tasks[user_uuid] ( x7 @) t2 |3 W* U/ { if task.nmf_training_progress.status_code == 2:9 R3 }& {+ z3 w. ]# p
return task.topic_distribution_predict_progress7 B3 D' M* q" ~* F
else: ' Q' }! I8 a+ t/ i' [ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") . L' d" P9 N0 w5 [ G0 H0 ]5 G) r4 P+ y7 ^ 7 h& T7 z9 V2 C- _$ }( ^@app.get(; Q( j% m, [5 G. r( x, O
"/calculate/details/document/",; D4 k& q4 J7 _% n
tags=["计算模块数据接口"], ; P- e* i7 L1 i- F response_model=DocumentDetails% V. Y2 U" g7 W$ I
), `7 ~% H# T6 T8 M8 n/ ^
def get_document_details(doc_id: int, user_uuid: str = Cookie(None)):; f) S0 E; o5 `4 i# [
global topic_model_training_tasks * c- }1 T8 q( D: Z4 G, ?2 x6 r/ x! j( P4 U
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):+ u! K: K* F6 f4 k$ g3 v) ~9 n+ X9 g
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")8 a. G3 M5 f) ]3 q$ o# a, A
a" w3 p+ a) G" v" e3 n* V
task = topic_model_training_tasks[user_uuid] # ~% s, s( R$ N: J if task.nmf_training_progress.status_code == 2: 8 k2 \9 ?4 O) g" @ return task.get_document_details(doc_id)/ C' j' O( ]# V$ v
else:; \ ]- D7 A) C' t) t) I3 {0 |
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"); }( I4 N6 p. `0 n
, z9 e' G K$ N$ H: Z6 i! s, h. d" C% K$ I" g& u7 Z
@app.get(! l4 R( W# F9 M$ [
"/calculate/details/topic/", + k3 x0 X4 i: K# \5 ? tags=["计算模块数据接口"],3 n$ F! e; e H5 k
response_model=TopicDetails - `" A# r. @- l, O), n4 x6 a D1 N" U$ X
def get_topic_details(topic_id: int, user_uuid: str = Cookie(None)): % R- ^6 l3 b5 S/ l& i" C9 v2 l global topic_model_training_tasks% u3 r- F. B3 i# p2 }5 I
2 r1 I& F# H2 M if (not user_uuid) or (user_uuid not in topic_model_training_tasks):2 W: ?4 w0 @. I9 ] M
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")* U: R; f: _4 B9 r' f
2 e! z5 Q% e& C. C( I( A
task = topic_model_training_tasks[user_uuid]6 X/ Q7 L; e6 Y% z4 d% u
if task.nmf_training_progress.status_code == 2: - O. s L9 e8 ]( S, R7 r& w return task.get_topic_details(topic_id) ) B( h! z! Q$ o$ y0 { else:+ u( N) S* ~! ^& z# i$ ?
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 4 v7 Y6 s" ^5 D! q* z4 }8 k3 _0 t2 B$ w
- P! G( ~0 d- g" W& d2 e@app.get($ t2 M H2 p6 p& x. @
"/calculate/userinteraction/info/keyword/", 7 u" M; h$ K8 A0 e2 b) S tags=["计算模块数据接口"],0 j# S) V, H/ ?- K( p7 A3 c4 F' J
response_model=TopicKeywordInfo . Z; P0 m7 f# t; c5 c) . ^1 J! d% U8 \$ n. S w7 Bdef get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)): 5 p. t" j0 J7 E global topic_model_training_tasks6 p: L; ?0 F0 X# { c5 N* P: f
$ t5 Q0 R5 _* p# t4 X( s9 S
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): [" C7 J$ Q0 v9 @0 z) m
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & v) b% P; h* C4 X' Y 9 K, ]; E3 e' F' ~0 P: {1 r task = topic_model_training_tasks[user_uuid]* j) R$ t/ q) W9 p9 Q+ E
if task.nmf_training_progress.status_code == 2: ' \: I+ o/ E/ R' l' q+ L! _4 j$ | return task.get_topic_keyword_info(topic_id) 0 x! T8 r9 ?( R$ K* X( `' V# l else:! E* h3 ]: K6 N' |8 p
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") / R4 T# k% f4 D' J3 |. E# E* d4 ~/ p% @6 p6 d& f
# R k9 ~9 X$ ^4 d+ K@app.get( 4 |9 D% X- A H B! S8 B& @' { "/calculate/userinteraction/info/topicmergekeyword/",0 {; ?& m& H6 K8 W, s
tags=["计算模块数据接口"],& b( a/ Q6 l+ ^8 J3 e( T% y" Q
response_model=TopicMergeKeywordInfo8 l: h8 f% L7 k4 T- h5 Z0 I7 z5 f
)" r7 J0 v1 M; Q: C& M" z2 h3 q
def get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)): # y$ s8 m' r5 Z6 c+ [ global topic_model_training_tasks 9 h8 d" e1 I! ^$ b) o. D9 x1 H; b* f2 g& M6 L; ]
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): . n- c, o! ^- @' z raise HTTPException(status_code=404, detail="未找到相应的训练对象!")2 c& Y! ? O9 P, _
" j" i3 D' E! U0 v( w- G
task = topic_model_training_tasks[user_uuid]& u1 r# L$ A9 ~& Y" {/ l3 }
if task.nmf_training_progress.status_code == 2:- ~$ L$ [7 W8 f: E
return task.get_topic_merge_keyword_info(topic1_id, topic2_id) ) o9 Y0 Z% [0 @, f# K( j else:7 r, v7 W1 F! @
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ( k5 J9 f6 z* i) a' s* v/ u# O- K6 R# u+ X8 l$ Y; `
! D- m( M7 J5 \2 a
1 # W$ x- S# e' i$ ~% ~3 F- q2 8 r* \# w( K+ R3 B" l1 q; |$ k" U; ?; Q4$ X: l& u4 `0 O
5. D( ]# _9 t& X' c/ h- G4 D3 r Z& w
65 P- N8 }* H7 |8 F6 @. V
7 - m% J! ^5 ~: K8 R8 H; i: m( S2 Z6 V3 p
9* f0 W- g; y% s1 b& p
10 , l7 [4 y8 v( [3 l3 z11% H" f4 l$ D5 d2 H" g. l2 N- p3 r
127 i. n. j& [' J, |
13 u! x& }) i Z9 Z
140 Z! t, O: w8 M6 }0 M# n
158 h6 ]. I& f q: t6 c' r
16 & w( q+ P+ Q' q17 . M8 H, h( A; ~7 k# q18' ?, G j, [, Z- X" {( F- u. J! Z7 v
19 7 r2 }0 d/ I4 L- g20& ]* @# ^; O/ O0 \, g9 h
21 6 Z2 s2 ~8 w* t+ _2 p22 # J+ U1 j+ i+ _23! |, ]2 p7 }$ @
24. D0 N% g" c5 A- C
25" r: b: c7 }3 k* |& y
26 * i& j$ H5 w& B5 _7 f27. Z9 }0 j+ u3 p! @8 t
28' A% z% P) q# R
29 1 F+ ], c8 @( d. B# n# O30 4 F0 v3 f! v6 ], ]3 E* s317 c+ B2 `, w1 F, h# ]$ c2 B0 e
32 ' w+ Q# \2 s! S" z, S' H33 ) p' n9 n4 R2 _3 B* J% W9 z34 $ F7 y7 D+ C3 n# E35 ) X! s1 t% P( }6 B1 q36 ; ?& d' ?: K3 ?) h+ Y! w* h37 5 n: B$ e. L/ o( w7 I/ p& v1 m38 # |" X2 z! Q! h1 e; B398 |0 F8 |4 p; R) A+ i
40 k) v1 W* c5 y- G, J
41 ' ^0 a& O6 x0 z# Q4 g42 C7 N. H7 y+ k% i$ {, h: |+ i43! u' u' I4 w3 N: e/ J+ W
446 h) c& h* p( J1 c4 P
45, Y2 f/ S, u! n J+ R% i' j
46' N9 C9 `9 ?2 _4 y+ W: o
47/ A# H7 R% e" s2 P
48+ J; c' f' ]6 M2 k6 L q$ x3 B
497 x3 ]8 p: T$ q" n" d
50 : {0 d5 k: r4 v' i51 & p! w$ R/ N8 n" m Z52" g5 n! D8 V( _
53 " m, K% S% f. q8 D: R0 e: F545 G1 \* L4 _4 [# i, s: n
55 , ^& L. |4 e1 }' P9 b& f$ a% P56$ d5 b* C7 I$ s z) M/ k
572 ~0 F# X8 U0 J- ~: ~+ G' h8 M
58. ?* G1 I) G, K9 V9 O, m5 l
59 & h) g+ p; Q9 t, d" j60 4 o3 ?1 ^$ e$ S) o) L4 [& P61 r$ u8 D2 D; j. \
62 + Z7 t' ~; `7 K2 D1 V63+ u! a& Q( r, t% |; Y
64 ! G9 H2 D. p7 q$ H650 S: C d y5 @6 i: l; p
66 W* D4 o t$ G( r67 $ T0 ^8 w" d1 y' H68 ! `0 ?5 S' S% g69 7 P6 J1 h- E8 q6 W) U70 # L9 T. [0 y& j+ d/ B% Y714 m7 \5 Y5 ^; h. Y
720 w. C) t1 n/ g$ P
73& A; d/ K5 a2 [) N* X9 a
74, [# C+ d% V8 }" [% ^+ c: Z
756 u8 I" |$ |3 F$ a5 \
765 X2 }1 Z- C* |( ?2 @
77 ]7 b* t i/ N- T: G2 d4 E# M' @78 9 t5 ~+ ^; O2 l9 C+ T- w79' j0 k, G1 q; W; L" `7 S. f
80 & J& q; V. x! C$ U% k- m8 j81 $ S3 h" M, C, ^$ g1 E0 _3 z82 7 `7 d2 `& H4 Z: d- [9 h2 D835 h0 M; O6 I# E" O$ V5 s# v" L/ `
84 ; t& X' g( V& ^( p7 M9 r85; n9 Z. @) E* L+ {# a
864 V9 t$ b7 u( y: C9 e: Y
87 % e8 u' J% Z6 d88) U' d" ~3 ?$ ?/ W; D
897 R) H8 V% l* S V7 g% U
90 , P* l( e2 m3 D1 W$ F L/ ?4 n91 # x- T6 a/ h4 K$ D r' p# v929 n) J# K/ f; J1 Z6 [
93* d; A' y* e' S, }% Y
94, a2 w$ u% Z; ?0 d! {7 b g7 s
95 " P/ G) f6 O% O' V3 j7 }966 ~. n. C K! ?5 I3 ]
97 $ E. ~; E, D5 _5 V98 3 c' r& D! Z1 _& r: `" h' T2 Q99 / T3 r) [, @. ?( X( ^100 ( x3 T" l- B/ \( b8 D. I1015 s' Z4 y% i! D+ ]
102+ [2 L& y# R5 k3 p' [% i9 P( C# `9 x
103 # H% o# l! f8 e3 H2 |3 g$ J6 d104 , }2 }& {: _ k# G- y105 M9 F0 R5 o6 [) c+ N1 @
1063 G6 V& H$ _* h- }: ~9 e
1071 }+ x# {+ _- Q& t) N* A# I
108 & U7 `3 e, O6 X: J6 o+ b9 |109 - @+ z2 o, L# h110 + d8 `$ f5 e/ B111- R% Z8 i! S) ?
112 & K9 r* M2 n9 c$ J% _: Z0 Z. h1 @113: q" U6 z5 z( s, x. A
114 . _3 e1 ], H7 d, V" k4 t115" D: j9 J: Q r' V! _3 `, n
116 |9 Z! k' s v5 Q3 T
117 4 D- e* B9 I: Z+ X% f1188 H8 H9 B' v" y. a0 w. w
119 - T, o* p! t; e120* d& [2 F% _ y v6 ]* S
1210 o6 d( W9 p# c' g1 J) Y* Y
122 7 u' |/ M( B/ j& L2 o123% A, u) P% ^! M3 S8 E& B
124# u3 h; u) R9 w/ h7 T; H7 X
125 % P# \! A V2 V) _* o) U3 \; @126 6 f# c) t3 K( K9 i Q127' @$ L* Q4 T1 o6 c; Z
128 8 {$ s4 [2 ]) G8 ]( O( J3 @7 A129 y* b( Q7 ?" z& v130 6 @, ?+ T! D" N$ M131 6 P. Y1 I5 p# [% C% `' B+ V& Q132 3 n, A9 R( f: ]# R0 p8 ^133; d& t7 N! s( s6 h! ?) R# r
134 $ a5 u% Q; B6 V5 l( E0 V135* W) |7 P+ W/ C6 m; U0 _2 ]
136 9 }8 k) k1 a9 ]) H/ }6 T137 + Z' [7 k& E" \& a138" L3 E) \: ^% P. g& I
139! X3 ~( \4 ` o3 d" W9 l
140, |( d1 u4 s# L, e
1417 ^! j# Y; f+ _& I2 m# @
142+ m0 _5 K) ]/ {% n9 X3 c5 N/ E R
143 9 @% U0 z; g; L+ L7 |& I0 H5 d [144# {. v+ c; {6 t" e
145 4 ^+ A( v: a0 C- N6 a146 1 b) a* u- L* q% L. r- u# ^147 * G+ c, b' j. q+ Z5 {148 v2 r5 O @. _6 | ^. h1 h149 8 M7 N3 T/ }8 c% ?150 # B. V2 I2 N& \* |0 w+ c1 d; V- B151& L* C6 D" o- l$ F* r+ K
152 " U$ B' w% y* }! E- f3 R153 : Y# k4 b* U9 y- d154 : l: W2 R- M$ g6 [0 A$ p155 " F4 @& A& i4 I3 p: {156 5 b, f/ m& Q1 v157 4 a \) q8 m! ?/ ~* u158% o6 A4 Q% ?- d3 P* G
159 # ^2 k5 Y7 b$ s! c# B160 ; v. h- I( [. d f' {1610 J$ A3 ]3 d# a4 Z i: [1 _
1628 e1 ^, S) p8 ^
1630 }0 I p+ L/ b( _% j* Y
164 + v- [5 I5 q K" N: ?5 Y1657 e( E1 I; M, k
166 5 {) h: @4 G* x& K, h! i& L167. j+ ~5 |* _2 P% b" A
168! G; N$ h) S( v& d
169( L% w. v% q9 m5 h9 [" ^
170 # \) D `! \, {8 d$ Z171 + X# X7 c2 O+ e% P$ M& J' i+ I1721 [" H9 u+ m' z) @* l$ m! d
173 , m! c8 x. C. S# n174# E i% W. J1 x+ v
175 0 z R1 O+ S4 |( C& a176 , `3 y8 |# T5 i2 X177 / e: J4 Z+ m3 g8 D2 U e6 f178 ' A& \5 s9 j( x0 a1799 \5 V7 a* z4 ]
180 / V( \+ m% u/ y `+ a5 e( V4 X4 v181 ; S2 V; |2 `( t9 z5 O: Q182 0 Q" T8 N' B' W1 V1838 Y1 v: G+ O4 E4 @9 L; i S
184 , H( B5 J' [3 T, e) E185 & p4 v1 F4 @1 [! D& R1861 j6 F8 X6 T% f& n& W& L
187& v" }; f: M& t
188 9 y4 \( B1 S( I9 {- `' s9 |3 b; u189 ( M0 W0 c3 `' U: X: i# C4 [3 |( [190; T' _: D' ]$ i5 Y
191! n+ ~, X. I, Z4 c
192- ^7 ~ T6 s* U, q% S. \* m8 m
193 * e6 L/ Y9 ~" G" ]' O$ i194 , P# Y. J* X: `5 V. P0 z u) E195 " Q6 B2 I) o7 h5 c1966 N. N: n( r& C) I; `& @
1979 P4 K( d y/ v5 k
198 ( Y2 O5 \, J9 f1 y9 e: c/ o+ i' d199 0 f# l, i5 m T6 ]7 J( O2006 v: J; }: s8 C2 h3 J. N
201* O% J1 H# j* A8 F' c
202& y& j) I$ R: ^& b
203 " I+ N R' o7 h3 p204 ( J* E- v) Z! y3 J2059 o* Y b6 L' \3 o
206 7 J+ F% N+ k& ^# `* y! {2 G2 _# b207 9 F7 W0 W0 `/ d0 e3 V208 # m! t' h! q. l209" X# J- Z3 A$ l( j; S& I% J1 J
210 , n3 v5 n/ i% R9 w, Q211 6 w# [$ x! k7 Q9 N- M212 / q8 w# m9 E0 w213 5 r& |( C) j& [3 R. w214- W7 S3 O- \' I, e' c
215 ) d# `' O6 T5 {# L: u; F& r! V216 5 p' H4 |7 m' T7 f) z217 m4 [% Y& l+ x# U3 m218 q2 b, ?8 t5 x! W$ |+ @
219 $ f9 o( ^6 V* ^8 a" [8 V7 w2207 K+ B- f" ?! c* Z
221 % Q, z# X8 n3 W8 `$ B222: B' `+ _. J( V( b+ r t
223. b/ B2 f$ @$ H3 ~
2249 `7 e: P& R' G3 e9 N, r
225 7 e5 o# E' Q6 u" d226 " l9 M7 M# h/ `. R! v4 Z227 5 H) e, T8 O% j228, ]( Y4 `) q* ^, {, u" T
229 6 t+ x6 ?% n; M/ @) Q% a3 J1 @230 . a! m# C4 z1 V7 a. |" R231$ @& y' K# ]% x% y) w
232 2 \, X& ]7 E4 g7 |2336 {+ f8 v9 i- f4 y& c
234; m) C+ K, ] J; m
235 0 n: Z6 c6 j( X, g! ~# Y236 ' w1 \8 U7 }- n2 } m" z) ^2375 b9 k4 ?$ ]2 V! U0 q
2387 G8 M7 ^$ x4 J7 s9 z
239$ _. T4 e% V: ~' |& H1 f- l
240 9 m* L, H# y. q- R9 F* O241 % H$ z2 I, l$ L! y9 y4 E242 9 P9 F/ n Z( P. s2 U9 S, B P) h243& [% ?0 K; g6 C2 c, c1 ^
244 / `, e/ D8 l+ L: M245# M4 P |3 {0 V4 o, m' x" j
246 Z' ?# R& d7 i247 " i6 a+ V; R4 v: ]5 f6 V3 k2485 |2 i; B( b7 }. [$ X) K6 k
249 1 R4 ~; L7 [7 M( z F! `1 ?250 + l& P+ L3 f5 P4 T. q, P- K" G251 ' G+ m+ V" f4 l$ f( ^5 d1 `! k: v252 . i' D" F1 R5 f$ g253 - d- i9 u' x% {+ d. _254 7 B7 j& X4 a5 k% Q/ |/ z255 * P, t8 X+ L' E% r- g256 + E: Z1 Y/ i8 s257 2 Q: D' ~; n4 n5 t258 # f5 b; I! ^7 z9 S4 U7 S( D259 . Y6 H2 u( O+ G. g, T260 - { l, p* G' F. ?' Y+ `) s261% N& M! p% G$ i; u5 r
262 $ O4 r* u; N9 Z/ l$ J" n" i) T2632 Z' G+ y7 ^3 }( N* f6 n, d3 O
264 2 ?* r* P3 ]: K% M5 l2655 F% ]; l. e; c c) q( P
266 / G: X" z/ ?: Y/ {0 O267 * Q4 w/ d1 k8 x1 e5 s: }$ s$ [: e* U2684 }2 b6 l6 I6 _1 W; d
269 + k" e+ f0 h) z7 q0 n7 r2708 z- g) z1 S' `8 \; W) E
271 4 g- l4 I, u; `# y" h, r0 b2725 l& N* I3 q7 \% t6 R
273 5 e' e. x1 ? e+ }9 D274) ^) u4 x: h- n0 C' [6 d& y
2756 _& h( v" U! r; X1 [) n
276 " r+ R2 I1 y- n: Z: ^277 2 ~: \$ l) M& ~9 c278 ' U6 Q; {: q. {279/ z0 I: W2 H" \2 ~ g
280 . F( B5 u d3 f# ^( f281 6 L/ L3 E3 p2 ?4 ?) O282 E# o/ s3 I% X7 }2 A
283 " D1 m3 P' t6 r- \8 o284 6 ^! }* g- B1 }/ y3 o Y! v% R285" s. B' S& E$ [& m& w+ Y
286 & w' y! p7 E8 M: v; r8 a' Q287 $ O8 q3 U; M3 b# V$ A& h# b288 ; \9 `5 T# [# M6 @289/ h% t( h- y6 Y, b5 z
2902 Y! n( J. y0 k9 C1 X/ P; M$ _# Q
2917 V- S. t( o e; Z; t, J
292 # N8 }+ r8 D# Q9 i3 d* o+ b4 p; b293$ I) I* v; o9 x- H2 o9 C
294. s8 K: f2 W# |) \
295 3 t; `: j# `% I: ^296 & U" O' M: G1 s% t ~3 G* v" z297 1 X- A4 b$ C8 Q5 a9 ~298. w9 j0 w5 ~7 l
299 7 V; e( z5 j A: J: P7 V300 . l k I9 K+ ^5 G3 R% [" ~ w301 b! f9 j* q' _7 e302 8 z c0 t5 d `8 }7 f% g1 A0 C303& @4 U3 ?( e5 X4 P; ], J* p: d
304 ; L, M! Q6 ~4 `8 y$ `" R- p$ p8 L3059 b/ y( i- A. u+ s
306 7 W' {, g J& d" M1 |/ S" J307% |, \3 D- M$ P: ~
308 4 }9 v3 n- e9 w+ @. l( y3098 E8 U- }! w* p6 ?6 N& l3 R8 H2 k
310; i: ?) |4 N0 z% Z5 M
3116 c! ^6 G5 _+ Q' v" c
3123 H) c1 s& U; {+ `9 H1 H& Y
313: r: a% o4 t+ e8 {4 J2 U
314% F9 V5 o$ n( Q4 h5 K
315" `2 O* m. A. \+ {
316 , B/ |8 M- R. j [/ v317- I, X* D }7 Y: a3 m- D! u
318 9 F! l- I+ l( P& E" r* ~' }. B319, f: B! E' l- l: |! ~' y
320 * t% M% ~/ }0 y0 W% w/ P8 O d321 8 q4 f7 y& r, B% N+ n2 l0 m8 D322 . t' F3 `+ s3 @' p k- ?323 : `. Z. l3 ?" c, }) D( v3 g324- s1 c% B! u3 Y$ D- E
325 n0 r1 C. R8 ~1 ^/ \, g; z. L
3261 i8 n* v$ V1 V K. l; M
327 ) \0 @ L+ p& Y328+ ]+ ^& v: I- j% O1 @
329 7 W5 o( }! J$ Q4 Z330 # S7 q& |# ]7 m( |5 n* L. p& z331 f. g- b3 T. ~1 c332 ; c3 H& h# {5 k& H; a+ @1 O; x0 q333 - J1 N5 O& i/ u334 2 S9 v! V) h% Z, L% W# c# ^6 R335; R5 {( }. e) G* q+ p, z
336# U- z. w% T' b# v z d
337/ T: S B% v v4 ^
3384 J# p) m4 c5 Z- ]
339 , F5 V9 C, l/ o' M340 " \* H' E, L9 b9 Y& g' e3414 v; P/ f8 m5 M! ?2 s
342 1 Y& g, P% ]4 f! n) P. r343# @& ?* |; [ b: K1 d
344 . c0 i% c* G+ f345 ; V0 P4 t! b! t0 M3 o346 * f3 V, e7 C, N9 R) v8 Y J347 7 E5 W. ], A+ r4 b- ]6 \- J348 4 ~! O+ z) h0 j: N9 J( ?3490 { l3 Y3 l a9 ]5 S ~) U5 ^2 e
350 : l& g- N* S* {% l3517 Y; T. }. K) S& J
352! g3 k+ b/ Q) Z8 k+ S) C0 P) Z
3532 N: g* f3 }+ Y9 R" A5 A* C" w
354# x4 {/ ^ a; X3 O
355 : J6 t7 [$ B: S1 x, c356 # G, q4 d i' \4 x$ J357 : N1 w/ t. ^; G E3 L4 _358; w k3 J! L, Y, T+ S1 l
359: D) [$ A) f4 t4 h2 A
360 9 i( ~4 p* [2 [7 s f361, K. K u5 j/ H b/ o$ n: c: y8 r
362: \. z1 z- d/ r v. U
363" J% G5 s) A! y; E2 j7 h Z
364 3 C/ a) Y- p& r3654 |9 ?% `" h) a0 i! K) B5 b
3663 a" h. D6 c$ T9 [* V: n. K# a
367; U, L0 _6 b) X0 A4 V4 ~
368 3 u: L3 U- o. a7 c3 b- S8 m" ?; N369 7 J9 @) O D' q. ~5 Z, e! |" Y! D6 X370 6 X! r! C. ^ q- o371; d0 k- A3 U- u) t0 b1 t1 `/ z
372/ R9 B \+ y. Q; \
373 1 | A/ g+ d* f* }/ q, u& X8 O2 z374& _) ? `/ f$ s0 ~* c$ l
375) ~1 W6 e$ S- h, u1 z* u
376 . X# N9 Z ]; b377' o2 j5 B, N& X3 a1 F, W' q! ~
378 # I* k: v6 P# r0 |379# s. K0 X* v2 x0 X: n5 Z b
380/ d+ ]0 o2 V- E' S0 ?
381 + x1 u$ j5 n. o' S0 u, H$ |382$ s- C& L' z+ T
383 / z8 o$ ]4 Z) H( X384 . R; X% }/ }7 F j, ^385: [, x4 n7 I6 u- g! A9 r/ E" N
386* p$ y' D y/ Q, C' a
387$ T8 P7 ^+ E% I7 n
388 ]8 |- f( X5 l9 Z L! y3 {9 h
389 9 q3 T6 h& k: U: l0 v% h) R7 i$ L390 7 t: a1 k6 ]1 n! ~1 U6 C! j' @391 H! T& Z5 N+ N2 u, K0 d# P3928 E% G1 A( U- T3 H
393' E& ]( |) W0 P! A' o6 l& w
394 7 h- x( N. V" o395 , C+ I1 P# t9 ^6 r* d396 9 K8 ]( J c8 a0 c397; g3 S" l2 [) i
3985 y" z8 e3 n2 t C! |0 P0 l2 [
399 I$ ?" C5 f( `7 Z% y400 # j" i% b( a5 ^7 Z, _/ _401 ' m/ `1 M4 @2 I" E402 C/ X. B" u8 {$ r: l# p+ \
403 / c L# u8 n7 R, ?' J* f, C* n8 A404% D8 Y$ q1 o& n' P
405 9 A* J& ]/ H# _0 \2 s/ C406. t$ M# `# u! q9 z' |* [
4076 w3 q: h- e x6 H! ~: z! c
408 ( V+ n4 A8 o9 j' H. j1 A; O% n409 2 {: g, G% Y! C1 b# d L410 / M3 f4 P/ _9 [( G411 3 T0 r2 P2 e0 I4 ^+ l* n: e; A+ c4129 q/ R1 f8 g3 F+ t% z
413 Z( e8 t- q4 m! D
414 $ }6 ^. Z; c! D+ h, Z3 ^( w0 h" z415 0 N' `( y0 o1 m' s0 n6 D416 * g5 Q; k( k) b& Y: h& u& y- t417 5 x8 n! g' b- N418 # x: Z4 C& x" V$ n0 W4 L, R t419 G5 Y6 D# t3 A& B# {# i4208 U) O4 I; _, x; R. I' e s# b
421 : N: B$ i$ f. Q* F# |" t# V422, |) ]# }$ v E& y
423 " \# \& D" ~8 f! J J3 A$ |424 , p+ o; |# j+ K* V425 5 [; _% r3 a! Y426 . l1 O% B3 `" U427; q. G" s& B7 P' { a
4282 g' D% p: x% R+ i% I5 a) w
4294 S0 d6 E' N% Z4 G
430* G2 a5 D( N/ g- S
431 ( e! s3 ^/ K' c9 M7 _$ ~# @0 T432 9 B/ W2 X* V8 w4339 `/ e4 s2 f% x1 i: S; d+ Q
434 }, H( v: P t7 u435 - p% t9 Z+ t8 n5 h$ {436 $ ~1 R4 j/ q8 K7 h$ n437 ; ^# Q9 {( G; n4 D, o438 ) ~- U% ]) ?( k( n' v+ U439 & ?& I1 |- N5 ~% Y. v' P4406 S, K! D) b: W: B
441) D+ f! E& _. o2 L5 _. j- q% {
442 + h: B% @2 g4 z, W3 u443. H5 M1 k0 `7 w2 }6 o" W# g" r
444 1 f9 m3 k# l; h" L3 ]2 r5 |445 h# k2 v' ?# L
446; M5 ]6 A6 l! P" f
447 * D) S8 H# M1 }9 U3 H5 A' |448 / ^( K7 l; q h5 V& i7 f449 % h7 S0 L3 y( Z- [" w1 _450- Y" ~8 B0 G. ~, C, C
4515 T, b8 r3 C, ? h" A
452) L4 \: H) l* D$ x$ D
453 : H2 E& y. d( n' `( A6 D454 ! Q) V* S. y+ u7 Y455 $ n& U) ~) B! j# D1 f456& u& b/ e0 n0 r, N- J, u% ?
457( n( G' O/ V7 }1 i. P2 k9 ]- r
458 \/ Q: o- ?! I) K459: j) x! o& _2 n, {* S& @& I6 h
460 , s1 ], B; \5 V2 ]: e461 + k# a, }% b+ u462 , O# s/ V8 h" ^ X3 Q6 ?5 \463 % P9 X9 j7 s3 {- W1 m2 b+ K464 3 i& |0 k$ s) ~5 B465) g2 g, V; u1 L7 ~+ k+ v3 [# |
466 & r; d/ \* u- ^& K. v467 2 Y- X; S; l0 q) s- V! k: _468 6 T3 _( t5 [6 l5 G2 O! X469 & {1 U T( X) Q" F. D470" o+ @# n p* x# v
471+ ^1 U6 h) ]7 k2 t. I
472- T8 y6 H- p( q1 e+ `
473 % \1 p/ j. ?' S" g; W+ ?474 ; k; V! h9 P. @- P( K! ?475' `& q! y. }' S
476 1 L* j9 c( g b9 [* l( p7 u; H) _ ! f4 |( c3 c% J# D2 _* @; s9 A; N4 n+ m I+ a. a
' I6 d- w& _( p8 J4 U/ A
# N- ^! k. \7 J9 \& B0 B$ z9 q: c 3 r, e6 M' s. ]3 ?1 z6 k) L( v1 g, V4 v