; W$ ?" T$ M+ @( C" e" Q/ ] ) {2 `: V3 s( M" j: Z" F@app.get( + {4 [; r. i% F. w8 J/ `9 d d. o "/chineseLyrics/", 9 T) y# M" U6 i response_model=List[schemas.ChineseLyrics],1 q0 n8 M! ^1 z$ I4 I1 n/ P
tags=['中文歌歌词语料库数据接口'] 2 | ]2 x6 @- G)9 U3 H6 c" g5 k2 F6 h
def get_chinese_lyrics(db: Session = Depends(get_db)):4 h5 \3 V: |+ L
db_reviews = crud.get_chinese_lyrics(db) 1 w* u$ x! ^1 Q7 m( \ return db_reviews : ?+ z$ j6 Q1 w' [, M# x # d7 |6 V; \0 U! O0 W- ~& x/ K& ^3 `& g, k: o7 N
@app.get(7 z) G; Q3 w% i. F! e6 I( m
"/COVID19News/", 8 [0 O+ L& _4 ]) t8 ` C response_model=List[schemas.COVID19News], : m8 M3 o$ R/ X& d7 | tags=['新冠病毒新闻语料库数据接口']8 y6 ^" s4 G) Q
)" E& _1 O0 O3 H
def get_COVID19_news(db: Session = Depends(get_db)): . j0 T. U2 M B( t6 l6 J0 }' U db_reviews = crud.get_COVID19_news(db) 0 F7 ^; s. L1 L% ~) ^ return db_reviews5 I; w4 @$ L; K& J) @6 G
: n& {5 c) r; x6 z v9 A& k/ Y- y/ b" k8 O" o$ s# 为每个用户设置uuid标识符,并存入Cookie Z5 J( u5 @# S# ]def create_user_uuid_and_set_cookie(response: Response):0 m9 w4 s0 k- f" {0 O Y
user_uuid = str(uuid.uuid1()) s5 R C9 v' w* j( H$ j
response.set_cookie(key="user_uuid", value=user_uuid) R0 G, I, u0 E% { return user_uuid $ Z( X* y% D) u4 P) a+ O5 w9 t p3 d& |( X* o4 |
. J4 z8 V1 T; n( n5 l6 n5 G9 x& c( G
@app.post($ I0 s1 s( a" W
"/calculate/preprocessing/", 8 F8 k% `4 |- N: A5 I% p tags=["计算模块数据接口"]- G( u h& c6 @8 z5 ]
) 0 g$ A1 R* F: P4 q: O. h; \async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams, F5 e9 y5 v: _/ w4 c0 p
background_task: BackgroundTasks, $ W! }& }5 z: F; o5 G" v5 o7 ] response: Response, ! u9 H+ ?, ~! m0 O. S user_uuid: str = Cookie(None)):+ {) z& B y# E, e8 ^
if not user_uuid: " Q3 F3 b2 [* ]5 q# { user_uuid = create_user_uuid_and_set_cookie(response)8 Y6 @; G" f9 |% r3 E
/ X+ X( C6 D) L9 I# N }+ N
global topic_model_training_tasks . T6 c) B' f( u6 N. N$ j+ e task = TopicModelTrainingTask(text_preprocessing_params)! Y0 H. s" L/ Y% _. z) P2 F6 S
topic_model_training_tasks[user_uuid] = task( X* T6 t% {6 `) U W
: @3 e) E. m# a6 E' D# g% n, ^ background_task.add_task(task.preprocessing)' K$ ?- E( p0 N/ \0 o
return {"message": "已添加文本预处理后台任务"}! |, a+ K5 S, G; H! H; g. H8 N
7 Y% \; i& b# o5 B4 ]0 C: o" K4 s& i7 l
@app.post( 2 _1 Q. D9 j+ o# o4 ` "/calculate/nmftraining/",1 A4 ~7 M) k; S- D* d1 b
tags=["计算模块数据接口"]; O/ w9 H1 Z Q$ p* W8 k" R1 z
), N% B- D4 f7 I* L
async def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams, & G0 f1 z8 w* K7 A: d' K background_task: BackgroundTasks,/ x; I2 r4 x3 W4 L4 z) D; B
response: Response, 1 r9 ~$ k, L* v9 Z2 ` ]: Y6 o" { user_uuid: str = Cookie(None)): ; `$ C" d1 I* J+ h' o if not user_uuid: 0 T: {6 [. z" C" J+ X( r user_uuid = create_user_uuid_and_set_cookie(response)5 Y) I& O @& o
' L8 l9 _% I% M2 F6 \9 v3 L
global topic_model_training_tasks & R: y* z5 L' U- N, D / G$ U: V% M- D4 o9 ~+ d+ p" Q if user_uuid and user_uuid in topic_model_training_tasks:9 r$ Z" }$ N( f- R' p' {
task = topic_model_training_tasks[user_uuid]2 R5 e) u& {( Q: L+ d! q( D
if task.text_preprocessing_progress.status_code == 2: # _* c# o# `/ o" ^5 E background_task.add_task(task.nmf_training, nmf_training_params)1 D3 p3 Q5 o, f& l% K; Y% H
return {"message": "已添加NMF主题模型训练后台任务"}. k' `; R1 O- J" D. |2 X4 q
else:) ~$ I& A5 V, H
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")) \0 Z2 [# }* k0 t1 Y, K3 A* }
else: - w B6 K) p4 G, _3 \5 p raise HTTPException(status_code=404, detail="未找到相应的训练对象!") / X% Q4 V, a. m( u) g2 s7 X4 ~! z . F" N. j' i, x' n! i& d0 Y& i 3 l _& A& E( S9 n# H7 |! U@app.get(. \. X! p" s& \4 w
"/calculate/nmftraining/keywordsearch/",' L* u; V! Q. F% W C3 p
response_model=KeywordSearchResult,0 C. i+ ?' G9 R7 F) q7 |- z
tags=["用户交互"]; V0 n9 w3 l$ r v
)" F2 E. |2 d1 n4 C
async def search_keyword(search_text: str,( _# l( H" [) `
response: Response, . h% a! N' U8 N/ B8 _ user_uuid: str = Cookie(None)):! |$ Z# V+ X( d# F( j0 \9 ~0 M" r
if not user_uuid:. G0 ^3 @" f1 L, ~ U5 t
user_uuid = create_user_uuid_and_set_cookie(response) % O% t# G( A6 t: ~0 K! r8 J( y ) Z0 ^' k: v6 Y; D( M+ o+ t global topic_model_training_tasks 6 w0 ]# j/ b/ ~$ {* V# u3 e4 A: e
if user_uuid and user_uuid in topic_model_training_tasks: ( C- ?; y7 M7 r( q( z" ^- Y9 _ task = topic_model_training_tasks[user_uuid] 4 b2 d) P6 @, h. t3 U if task.text_preprocessing_progress.status_code == 2: / ]; ^ t, C# J0 Y* G ^; r search_text = search_text.lower()3 e; R+ f1 U5 y+ B$ j; A7 D( i
bag_words = task.text_preprocessing.bagWords: I" k0 n$ M8 G
keyword_search_result = KeywordSearchResult() t' [3 [# ^- X7 R for wi, word in enumerate(bag_words): ) S- j9 B# `# ]1 o% x' R- s if search_text in word:: G# _$ Q% ^" N! v3 t, K. s0 a
keyword_search_result.word_id_list.append(wi) 5 n6 G3 Q, D# f) N5 ] keyword_search_result.word_list.append(word) / F3 g3 Y' ]6 a& T/ m; }! C$ e. r return keyword_search_result ' r# Y) S+ N% O, J: k, F else:9 ^* t" r2 Y- H% S
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") ! T; w1 a& N* s8 [3 o H+ Y W else:, e3 ~8 S q# ]5 g$ Q
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") s& {, N! _9 I: T; _ ~
# o1 P. u; X+ ?: v0 R
4 ?) k2 ?- E, a- m: I$ A6 E$ N
@app.post(& Y4 p" i. w; {+ F$ R) W5 \/ W( H* k
"/calculate/nmftraining/topickeywordoptimization/",- I8 Y; a3 ?. a0 a
tags=["用户交互"]0 S; J* g/ E i. ~* l- \
) * i; I9 e! s1 Y! b5 }' ?- Rasync def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams,9 [6 @2 i, g7 D
background_task: BackgroundTasks, ( L; @3 L( A5 X4 |1 W. M response: Response,9 b) i0 g, V; i5 M
user_uuid: str = Cookie(None)):* y9 A' M5 C) l
if not user_uuid: " n' K3 z" n# M/ a, I user_uuid = create_user_uuid_and_set_cookie(response) m+ n( k2 B3 C$ { " u9 r, z1 I1 m global topic_model_training_tasks . x, Z% a+ G& z 6 T- J" B, ^( ?8 {: y9 ` if user_uuid and user_uuid in topic_model_training_tasks:5 p% s) V& B6 \! |+ H
task = topic_model_training_tasks[user_uuid]1 R" ]' R. l: y! s
if task.nmf_training_progress.status_code == 2:1 ?) T+ \/ p% c
background_task.add_task(task.topic_keyword_optimization, tko_params) # J9 |6 g% Y+ |2 P return {"message": "已添加主题关键词优化后台任务"} ( R x0 `; N4 Y6 F( a/ ` else:9 B; I9 L8 R' t2 m- G- ]( P
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 4 h' W( M! a5 `! y4 x7 [( f else: $ M6 n: w) h: G* ~0 O raise HTTPException(status_code=404, detail="未找到相应的训练对象!")3 N* r; v4 }. v% `7 D2 ]4 C
! E0 W5 A; Q% r, }
( e2 ~( x# j( B" L5 `
@app.post() V' R1 R( ^/ Y3 e. Y
"/calculate/nmftraining/topicsplit/",$ H( Y* d/ z+ a" r7 ^
tags=["用户交互"] 0 h% g: \7 R7 _0 y0 R), {: C1 e' L: X, A& X( _
async def run_topic_split_task(ts_params: TopicSplitParams, 4 J# q. s8 b7 G) v; | background_task: BackgroundTasks,, N" n2 S% n3 v7 V3 P$ r# `
response: Response, ; I% U: D0 K2 a G/ z* k/ f user_uuid: str = Cookie(None)): ' ^5 ]1 w1 A o if not user_uuid: % n% H5 h( ]& L+ H0 F6 p+ M user_uuid = create_user_uuid_and_set_cookie(response)1 Y1 }. P* e* A# U( C3 G# e
- U2 H* T' h/ R/ T) g
global topic_model_training_tasks: ~2 }) z3 Z' C! T1 @3 a
S! i A: M4 O) n6 V# e! z
if user_uuid and user_uuid in topic_model_training_tasks: . d! S0 e. m0 ^5 X3 b. B task = topic_model_training_tasks[user_uuid] / e3 P: i" O: F# c3 e5 v7 H if task.nmf_training_progress.status_code == 2:3 y, [7 l% X: P. Q, S$ A
background_task.add_task(task.topic_split, ts_params) 1 E& }8 P4 @! _( n& J$ d return {"message": "已添加主题拆分后台任务"}. b1 R: b; G6 I# x3 T9 s; m
else:+ d5 i2 z/ t3 L, G- @
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") % t% |& x0 ^2 k$ k2 Z' a else: , q x; N4 Q {) k! {! m2 u- I( M* i9 C raise HTTPException(status_code=404, detail="未找到相应的训练对象!") . f8 C) G e2 i+ V. X 4 [& t3 _3 {& N: P - k% s4 @- I q) w( C9 n@app.post( 2 F% v1 h' P( \- j+ x* f. { "/calculate/nmftraining/topicmerge/",3 C) Y+ t, R C, Z% g" @7 s
tags=["用户交互"]0 _/ d) H6 U1 v, [
) ) ]7 e, O8 J/ L, Xasync def run_topic_merge_task(tm_params: TopicMergeParams,' d1 k: J0 n x9 s& h, O( r" p
background_task: BackgroundTasks,$ k* ], f$ x [4 F) k
response: Response,! U0 S* N! Q# v0 i
user_uuid: str = Cookie(None)):/ k' I+ W4 ^$ Z+ o" N6 l
if not user_uuid: 9 ^( s' ^8 a- `5 k user_uuid = create_user_uuid_and_set_cookie(response) & b b$ m7 a$ Y2 D) ? 3 f- @0 b( Q9 e4 J5 p/ u& G. y7 } global topic_model_training_tasks3 Q) c1 F7 H% u j3 L* A
( J0 E1 a& X9 b; y7 w" O8 N
if user_uuid and user_uuid in topic_model_training_tasks:+ [2 s+ o3 O: t4 f0 R/ F9 t( w
task = topic_model_training_tasks[user_uuid] / v+ P0 f6 x' V3 i if task.nmf_training_progress.status_code == 2: + o6 L! g; V7 M1 n background_task.add_task(task.topic_merge, tm_params). V& N2 V) e4 J+ R, ^+ {7 k# t
return {"message": "已添加主题合并后台任务"} & d0 {9 D0 `; C: ^/ S6 ^. o7 x else:% P$ J. W& B/ p/ S: H) Z6 J
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 4 [3 B* ]. h D% y" m- T else:, f: k ~9 ]# Z
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") $ L: ~ ^( M9 v$ u+ T/ B- I, a2 W" B8 S0 G( Y, E% q
" ^0 i5 L. E6 v0 ~. k9 W* t* V@app.post($ m7 y& H1 i. |4 B4 p% A
"/calculate/nmftraining/keywordinducedtopiccreate/",0 j: c* P( o( N. n7 n
tags=["用户交互"] - J- R& @$ h0 m) * U5 H' @6 I( masync def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams,. U/ S+ \ M; H
background_task: BackgroundTasks,$ n; T# X% x' E/ G) z, u
response: Response, @/ E `/ n% d- ^/ F
user_uuid: str = Cookie(None)):' k( F& B1 c+ i0 q1 J A2 {/ F; z
if not user_uuid:& `7 Q/ W3 Q' i
user_uuid = create_user_uuid_and_set_cookie(response) X' Z4 o6 P! m1 K. q% u$ Z1 B' t$ p3 A8 k1 f" o/ U& @2 b+ `
global topic_model_training_tasks" C1 r' |4 _/ b# F* ?! i0 s
1 y4 w( v+ t8 h) a# f* W if user_uuid and user_uuid in topic_model_training_tasks: * ]* ]& o# J; _! \, d% r task = topic_model_training_tasks[user_uuid]+ r5 K' G9 v/ {( h$ n N3 J
if task.nmf_training_progress.status_code == 2:" W% y& ]& L. g
background_task.add_task(task.keyword_induced_topic_create, kitc_params)! D4 r4 b( J" s
return {"message": "已添加关键词诱导主题创建后台任务"}" t4 p( g3 H8 }+ G" m& O; L/ }# w
else:' t- z9 T1 ^$ e; {6 W
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 4 E" _& j% J4 I- P1 r else: + M/ J# H/ [5 P/ d: i+ @ raise HTTPException(status_code=404, detail="未找到相应的训练对象!")2 ?3 O0 L% |; c2 j
4 g) t; j# f* I2 g" p' w
3 @- }3 H( {5 Q: x/ ~) M
@app.post( % z+ i. \) R; q0 {! T; F3 c "/calculate/nmftraining/documentinducedtopiccreate/",! T2 E% I7 t6 ]/ K& Z! `7 v: S) I/ h
tags=["用户交互"] 7 w2 B( c! e" L& [) H ^8 r), ~# b( X+ K% d. v" ~
async def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams,# d" D# g" {* j ?) @( o3 [
background_task: BackgroundTasks,# }% ?9 E$ [, [6 M( j/ Q& D2 N# J
response: Response,. W1 w9 h: ^# j/ D
user_uuid: str = Cookie(None)):% A6 o: G- N. ^1 `5 d% J
if not user_uuid:& f0 U, u( K: Z! N2 |( p1 p
user_uuid = create_user_uuid_and_set_cookie(response)3 Q( O" a/ {4 R7 B# t$ U4 q
4 [$ M- V8 V3 i* c7 j) F* ^; k global topic_model_training_tasks " _) m* c' n" m! {6 w& _ 3 x0 G% c1 h0 a7 o if user_uuid and user_uuid in topic_model_training_tasks:6 K, g& m( r5 p" S/ h1 Y& m: l
task = topic_model_training_tasks[user_uuid]8 L. |" \' N- l6 e M- n
if task.nmf_training_progress.status_code == 2: $ C A; S% k K z2 Q& n background_task.add_task(task.document_induced_topic_create, ditc_params)' y [7 I' @/ m" Q' Y1 a
return {"message": "已添加文档诱导主题创建后台任务"}7 Q0 M5 c2 C) n4 v$ P. A7 b
else: 6 g$ w/ ]; V3 p) C# L( v raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")1 p) x$ x/ H: O: x, p* Q
else: ' I+ w1 u6 c8 \1 v1 E, b/ @ raise HTTPException(status_code=404, detail="未找到相应的训练对象!")* D y1 t& T* U& D l8 K0 y
7 ^2 O" c# e9 L7 C2 q0 s
' z8 C. z: N5 j/ i0 g. ^
@app.get(1 {& b8 W% T1 S9 s. C
"/calculate/nmftraining/newdoctopicdistributionpredict/", ' v* Q5 @6 @% s2 N5 { tags=["主题预测"]# v5 b7 g: Q7 w
) : \. B5 W6 s7 f$ V7 ^! \+ Pasync def run_new_document_topic_distribution_predict_task(% [1 u; M+ u. G, D4 e2 l7 b3 {
new_doc_text: str,) y( r/ L9 x& r. I% \
background_task: BackgroundTasks,; {3 B, D5 d. Q
response: Response, 1 M: I' R3 u5 s h# O7 `4 I. Q5 B% l1 r user_uuid: str = Cookie(None)):& X" A7 N. o3 E+ V0 C/ t
if not user_uuid: 5 g4 B, g& u/ N) {% g+ i0 s" z user_uuid = create_user_uuid_and_set_cookie(response) ! b' B; P3 e& A+ O( z4 F* ?* @9 [5 T! ?* Z/ x
global topic_model_training_tasks - e* ]! |! v0 ]# E1 l$ y; k( V, u; P* b! u; |- i3 ^2 o
if user_uuid and user_uuid in topic_model_training_tasks: ( H2 \+ X3 ]5 c2 Q' I& P task = topic_model_training_tasks[user_uuid]! E; x+ |' p. I! l) `4 l1 x) ~
if task.nmf_training_progress.status_code == 2:8 ^- G$ t6 \2 Q7 S F3 ]+ o5 V# l
background_task.add_task( / F! Y% o0 Q* ?$ e7 w8 W task.new_doc_topic_distribution_predict,4 H9 C7 ]# Z& j1 s
new_doc_text! I; y; q5 z D6 p& o5 f1 s& `; q
)$ e3 H- i! {$ t: c9 j) j) ?4 W
return {"message": "已添加新文档主题分布预测后台任务"}) s$ q) z$ u# Q( T4 ^
else: ' T1 c, Y% {; i' k, {9 l& V) R4 i9 W raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")$ i. [2 d7 ~- U; l6 y% f3 a b
else:3 K8 w" ^, q% u
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ) z. K9 Z# }$ q" a9 ]* K: X / U; T- a# B/ Y/ y& x* A7 X ( P! |) a: Y; ^@app.get( 5 a2 Q/ z/ G% V6 n "/calculate/preprocessing/progress/", 1 t% J- v0 J7 U' P( C tags=["计算模块数据接口"],8 z# j. z o' C9 f: `9 x2 Q
response_model=TextPreprocessingProgress $ w" z: T1 k( x% A H! `0 Z4 ~# u) 7 o+ F3 w0 [5 A, h& Udef get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)):$ d. B9 H% ~2 s8 B9 L9 E4 K2 e
global topic_model_training_tasks . N! Q" L% \+ m) M6 ^& c: J p5 D6 @4 {: f; F! q! J
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): |2 D2 }* {" `; p
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")6 t8 _- z, u0 W
return topic_model_training_tasks[user_uuid].text_preprocessing_progress* r* j- F" ]& p/ l3 w) _) z2 Y
2 L' o; X8 X; T( o6 G) J. G 5 d' p( H2 q) b# E }* J@app.get( 2 l( }( j K5 u0 q4 _! g "/calculate/nmftraining/progress/", " P7 k" B4 ]4 R" w6 z6 ?3 _ tags=["计算模块数据接口"], 3 K% p8 @3 X. q4 c5 Q response_model=NMFTrainingProgress + e* X. V1 ~3 k1 T! n0 @+ G0 g)& d9 W" s1 }% |' f0 c" i$ `
def get_nmf_training_task_progress(user_uuid: str = Cookie(None)): 0 \6 u1 u0 n8 Y global topic_model_training_tasks' E- K0 l: \5 c6 o- t
( K& T5 b3 \ o9 ^- W9 j" @ if (not user_uuid) or (user_uuid not in topic_model_training_tasks):6 d4 y, d6 H8 U- p8 j/ h. i: L
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")2 ?& x' t/ b8 K6 c3 p) n
! b% l% V" R: P; Z task = topic_model_training_tasks[user_uuid] $ ]' S' S9 |4 Z, R7 T if task.text_preprocessing_progress.status_code == 2:. s8 s7 `: d7 }2 c; }
return task.nmf_training_progress ; Q2 u9 t/ H2 R t* R" r else:' V! ]) U% {- `+ k2 M* ^6 r
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")& }* h% q4 n4 G( C' ^5 ~
8 E5 J( G5 A* I; t
$ S/ K/ F: t; V( g* q. L' k" u& ? f@app.get( $ G8 D9 O; ~0 i, T! ` "/calculate/umap/progress/",* z" T. E; V$ p6 U: ?5 d
tags=["计算模块数据接口"],% x' f/ S I# t; T+ M3 Y5 M
response_model=UMAPProgress/ V8 q/ R/ f, ]
) . W$ t" t! U8 a, i( }def get_umap_task_progress(user_uuid: str = Cookie(None)): + D8 g4 A3 I, W# Q global topic_model_training_tasks; l: {" R, F, v6 p+ g
; h0 Z) K6 O& j% ]6 g% X6 i
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):) f5 V9 x1 W; G4 ~* p/ s
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 4 F' r1 i6 t0 o+ [0 m& J7 q ! Z' |+ f7 w F& Y task = topic_model_training_tasks[user_uuid] / E: ?% |) F3 q if task.nmf_training_progress.status_code == 2:. J. d/ N. }0 R0 ~& h
return task.umap_progress$ w. k) W* Y' L: u9 V9 Q: o# i
else: + a8 N1 l" E" B( f; R8 G$ ~' u, K+ C raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") % v3 x, h) J: D; {9 x' a6 E 4 S9 h& ? ~3 O$ w3 r- Y* x k- g4 S( l& u
@app.get() N k0 L. a/ H( R5 X
"/calculate/nmftraining/predict/progress/",, x* c" i5 N5 W. V: A. }6 {
tags=["计算模块数据接口"], . y3 j# A6 a4 y2 H( a/ @8 n" C* u response_model=NewDocTopicDistributionPredictProgress ( u- ]* Z3 O0 L& M& m; P( H6 ]) 4 F; y7 x/ z1 j# t- }, |$ Tdef get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)): 0 ~( K: ]& ]8 a! e; N8 S8 r9 p5 D global topic_model_training_tasks , ~0 Z1 g, p8 Q, _! e( `* z! y7 l3 A) H2 E$ _
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): , z# w9 ]3 j+ i raise HTTPException(status_code=404, detail="未找到相应的训练对象!")0 y- M0 q; H, ]
- x& `$ C- N, y7 d" s
task = topic_model_training_tasks[user_uuid]3 |% ^2 |7 J" Q! {$ D
if task.nmf_training_progress.status_code == 2: 7 R4 U0 S2 l0 ^, B2 L6 t return task.topic_distribution_predict_progress' B# Z* b% O. c2 [) u- J
else: E# k1 j% k" m7 V( F raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"). v& L, U) Z9 L
" B' c/ g% b7 F9 b7 U
, ?) @# h; F6 }+ l
@app.get( u7 _# G% |% w( r5 p "/calculate/details/document/", ) P, j1 {. `! l+ b6 y3 r& ` tags=["计算模块数据接口"],( b0 l2 e& e9 d" M- b
response_model=DocumentDetails5 V$ x3 w# [1 Y
) ) k% y4 p# d" k- W4 odef get_document_details(doc_id: int, user_uuid: str = Cookie(None)): ( s8 P( E0 A( x8 L7 P1 U7 s global topic_model_training_tasks & R" Z! b2 g: k" i2 `, h' c* m+ X
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): $ j2 I. D; d H% u raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 2 {2 Q) G0 Y% m% H : E6 [+ ^2 ?( b2 ?$ B* F% X task = topic_model_training_tasks[user_uuid]7 Q4 H* S' G# @# H
if task.nmf_training_progress.status_code == 2:( H" ^% X+ j# i+ j; L2 Y; A& G
return task.get_document_details(doc_id) + D: p" X" h3 A else: 7 Y2 R$ A# l2 S/ X, y i, ^ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 3 B; G, X# i6 H5 ?0 h5 u( n4 O- ^8 m8 h$ \, f
+ e/ L7 A8 v7 I3 ^@app.get( / w ^. x3 i! I, ~7 l. ? "/calculate/details/topic/",) ^+ D9 ]5 j! a6 M& ~
tags=["计算模块数据接口"], 7 E# @5 x2 r5 s0 p7 S K response_model=TopicDetails 0 z" R; m$ G+ J" x: x) 1 x2 u& e4 J7 z6 Y( m6 e8 G+ ^: cdef get_topic_details(topic_id: int, user_uuid: str = Cookie(None)):6 _+ k0 U7 ^* \1 D9 O
global topic_model_training_tasks + `3 \/ n! r8 l/ A# W9 i) V/ ]" K* F& t3 u1 b2 |
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ) I8 [ }5 O5 ^% s; M# Y raise HTTPException(status_code=404, detail="未找到相应的训练对象!"), B6 m8 B M4 [& D( b+ `
& l+ j2 C V9 v* ~4 b. ]1 k: `. Z& q# T
task = topic_model_training_tasks[user_uuid]% G& {) H. H8 a0 X
if task.nmf_training_progress.status_code == 2: - o* J! @% X6 ^6 d+ l return task.get_topic_details(topic_id)' i; m$ b2 F! f: {2 ~6 K
else:% n8 \- ]* P/ p/ T
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")- ]# c6 z6 v7 y7 A K$ J0 O
0 }( x5 `* V$ O/ c3 L' C% B
! Z: O L) d2 k/ o! r5 A9 g
@app.get(. ?$ g& i# s- z- T& J
"/calculate/userinteraction/info/keyword/",2 [/ P- m6 |" u* @9 A# c
tags=["计算模块数据接口"], $ {4 U z& |; T response_model=TopicKeywordInfo2 @. r( V6 D9 \4 @- C/ F) b
) / G/ o _! d9 [2 E7 p8 e! R% `# z( Gdef get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)):9 e. n. A3 B1 C
global topic_model_training_tasks9 g* l6 p% s/ p" O' P
3 X8 a2 ?7 p V+ j if (not user_uuid) or (user_uuid not in topic_model_training_tasks):0 u3 B$ D0 S9 u4 \' q
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ! K3 ~0 B8 w! D ' Y* \ l3 Z; T. }$ p task = topic_model_training_tasks[user_uuid] 7 U5 ?3 m$ c+ }0 P7 l- B# X; ^ R if task.nmf_training_progress.status_code == 2:- A9 \0 J# [' c
return task.get_topic_keyword_info(topic_id) 7 s9 Z3 h: I8 P4 p# @, N else:7 c" p3 l' B( ~2 [( X3 P
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")5 w# y: W% I# F* x# w
% K+ h8 k. d% T& T2 {/ U7 K2 T* B
@app.get(" c4 K$ p9 G, {9 v
"/calculate/userinteraction/info/topicmergekeyword/", 9 {& q# M) q! ?8 k1 c1 @ L$ t tags=["计算模块数据接口"], 8 X2 Z. p5 K' j- p) F response_model=TopicMergeKeywordInfo( u6 N( G1 K, e; k
) # ~ `* V, k8 ~def get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)): # A% l( B9 v: P global topic_model_training_tasks $ d2 i" p. W; q % l. I/ L( r7 E) p9 \6 {6 [ if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 3 p' p" s( Z5 u raise HTTPException(status_code=404, detail="未找到相应的训练对象!")" n9 c5 k( Y! j5 q0 o! v) a" t o
. l' |% _0 V- x6 i5 J task = topic_model_training_tasks[user_uuid] - m" c5 X- B9 p3 W3 l. ]! f if task.nmf_training_progress.status_code == 2: ) H. V6 l2 o9 O+ t8 i3 M4 s3 L# b* n return task.get_topic_merge_keyword_info(topic1_id, topic2_id) + M4 p9 E8 Y) H, L- ~ else: ) A; X6 k% U3 @) s3 E8 G raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") # C4 ]9 T; B/ U& l6 h- ?+ E: [1 m3 U6 w+ K+ p `1 ~
5 H7 ^ ^, v8 l& H/ k
16 G9 N8 V0 |3 U7 s, x% Q ~$ p
20 F% B5 }. O4 v" F! o; @2 I% s9 U. U
3 ; z, x" J9 U2 H0 D' T4) A/ U' \& R% U+ {7 \$ E" L
52 V, n9 l7 L, E# H* g0 `
6 9 ~' q$ Y' Q* d/ m8 t( f79 g" W+ ~1 \/ S; h ]7 [5 G5 ~
8 1 ?% s9 G, C# s; _9; m J4 |+ j5 A* n; i
10 A! |# l G; O0 D# x11 w3 ]$ G1 J3 g& z* M
12. S! @/ ?3 I. t1 E( K" ~1 M/ v
13 , V5 X8 W/ _& b! W140 t( Y! m4 z5 F( K
15 4 [7 h& X) V3 B c4 \; p0 v ^6 ?16 , K/ F$ d( q" U L) Q173 F4 ]/ A5 t: w: r
18: Q1 L) n3 i# |9 f' ?3 V8 \: Y
19 . d5 g! J6 N0 w* L7 p! t202 B' ~0 E" M" W2 s$ m/ o9 G
21 9 e2 _8 R# D5 F& Y( Q3 |- w+ j22 c1 }/ E5 \, i2 n9 ~# j7 V
23 $ `" |2 Z1 y" `7 v& D- M24 " S% I) Y( D: r2 m$ v! c25 4 l5 u0 m0 v d9 G26( W) Q [$ h' |; h- s( _
27( u0 W0 d& G' l$ Z* a6 Z
281 I9 F3 e# p e' ?6 K9 M
29+ P2 t: |( w& h `# a" i. \
300 d0 F# W" E% T. Y8 ~ C
31 ( g$ J& o9 A3 u2 Y2 N( @* o32 6 S$ f; e: N$ v ^* A33 ; S1 \- [! D' ]34 - Y& O4 b6 c% F" r, g354 m5 u4 Z# S& X1 U
361 e( Z7 }) R6 Q
37. ?) m3 R% H9 u$ U6 B0 U: L A
38 ( h, v. B3 K0 j W6 c, n; A+ q# }39 ) M+ u% S- V3 B5 ?" A# N40 ! ~( G( M# L, f1 \41; P1 |, ?$ u4 ^- ~- a0 d- g
42 9 P- T7 q) k' u* p! A- F* ?43 ) i; K# p1 U A; N: k/ ~44% C& t+ Y9 F2 z; [; T) ~4 L
45( F% C2 Q& o5 ]% y6 I2 W4 S2 G
46 ' `; J1 h/ ~$ G5 I3 ]) a472 _' l1 `+ Q* A X
48 " b$ K; h! U8 n9 v' `. P49 s$ s1 k( d* n4 r+ i: g, ^: r; Y
50 0 V: s: y' E# t- K" f7 Q51 ( f2 i5 r) S. T521 w* |' o# F; _& }$ o- [
53) ^& @, K0 r' D4 |! J$ Q+ ]. E
54 4 r( X; P3 h# b1 z3 {8 v, C' u& ]55 ) o: {1 o; v: D562 m- C- S: A+ y: ?5 B2 | j2 p
57+ x9 o1 F' m: x
58) O& @' U7 C2 ^' h* W k
594 n0 w- r, g' I2 ^$ D7 u' }1 W
60# i) v1 N0 l0 g2 O: e) p
61 ) F' Y* v* C4 v$ K3 t62) @1 T7 o, X8 c. U9 P3 H. Q% I
63 1 }6 m1 H' t0 e4 l5 T64 ( {8 C6 n! ?4 O \1 X65 ; }8 m* U: \. @: Y4 W66) \0 d$ a! Y* `0 \! F
67 % x) I" A- U5 Q' c68$ c1 `; s- G6 K" b
69 $ ~) l {- `' f S70 9 k( T0 A( C8 C* Z717 ?# B4 F a" K+ K
72 / s9 v6 y; u: @$ U73 # O2 s7 h4 k! n' M( D' ?- K741 Z% M1 q2 B% C$ ^" N2 s
75 9 u' p4 A0 e1 H. z761 v0 E; {; d$ l
77; v% M# A& j! y! n7 E9 |
785 T! @0 r) ^% l {
79 , A a& v# M: r80 ; ]% H0 g3 u/ U+ S2 Q2 o1 k# \81/ r- s$ H v) R5 ~, S! N. t
82 ! q+ m4 t7 i: D& E+ D( G838 f4 ]' R$ i4 v( g" S) o
849 G% j/ ]" ~ O4 Q
85( ~+ ?% x2 D. M; x$ I+ z2 l
86 " {$ C) Y0 R6 @8 j' @6 ^87 5 \: B, H9 T% x# p& N- @; D88 n5 a0 s$ R3 a, ], M
89 - ?: o& S! j& y: ]' D, J7 j# |( L5 `90 6 i* f' a6 Y+ o! P( c91* @, g! f x( |: s# s& u+ r# D
92 : M/ u3 D! i( \6 f/ s93- w2 i$ w0 j" f( ~
94* x$ ~/ x5 _3 l, @$ n2 Z) W+ H
95$ f) `6 l# D0 T
96* T% p$ g5 E: a3 s8 l* q5 R9 |3 e5 X
97 + x5 q7 {; I3 v/ N0 s980 u. U6 ~$ `3 X- o6 g O
99 M. ]1 H& {3 L0 ]* G& \/ P& M100 ! t; r" _ f3 E0 n( c1 d101 - ^2 Y, |* P8 [102 0 d) r4 ?! c# t103 6 v/ B1 S7 ^& |% q! E9 Z* m104 1 L$ N7 ~1 g& t3 b1 I, `105 1 p* Z0 P3 g7 g3 L2 k9 c106; @2 }( x9 g3 d- {* {
107# W# L& c4 F6 }. E
108/ U! p8 ?: i) h6 X4 L) o: j2 [8 z
1097 f+ S' R% h- ]& R5 \
1108 T; S& J1 S8 I/ M& {* s+ {
111 9 B# b: r! ]! v3 w( S* t9 E( @112 8 V4 c& t/ Q) _% i, C7 Y) m113 + }. p* _& G' N( O4 C1144 o' [5 F/ {$ }6 L$ q
115 6 |; E4 s: B3 B1 J9 w7 o ]116 5 I, R8 b; V) U8 B6 ^117 * _1 z& U1 a& S- `5 g118, n+ A7 O7 x# L `: m
119- f* P% l0 f# k4 Z; S5 @1 q
120: V) s% `& U% }7 N) V$ G
121 + A5 |0 r0 J2 v0 D122- m4 F K' T: t- m! N
123 , _, s$ i9 g% e' Q+ m124) {9 x8 Q) G8 N; [, c' }
125 9 w" `9 i; O4 x126& X8 H! b# S+ U% d. E8 K
127 9 Q+ y5 n# t: V! e, D5 i) W128 # M1 H, v! f' W- V7 H3 A+ Z' q129 ' X! f8 A5 V5 R+ Y* A' V& w: I6 d130 ( U% E' S o* \0 e; `! U- _4 X131 7 ]1 g) L L0 G132 ! M( k1 t8 g% C0 C& d6 ?( s3 D* l133+ y- h9 K7 G7 j7 Y
134$ g+ V! q& W5 G# U
135, V) Z) U1 G. B4 y9 q7 v
1365 o+ |' c l$ t" i$ J) P
137$ u4 v3 w& k1 t( k: M( k1 j
138 : ], N2 \ q$ P, }; r139, [2 ]+ G5 H8 q4 n9 A3 j
140 4 B" N2 |+ j' B% g) ^1416 a0 c" g+ r& P9 ? L5 T- Q; v
1427 K% g1 X1 O7 w( N% t$ S9 T& o
143 4 }# S+ k0 E0 O4 p$ v2 Z" A144% R) N9 K; C( H* f, x8 F
145. Q+ A7 [( Z4 p) N
146 6 Z3 l9 s' ]8 K9 f147 . ]/ R! I, O, ?# N# S& R4 s148 ( M* K# Q: ?: w$ [' r' i149! W) E+ G# d: C' s; i
150 # D+ k' F' v( b151; r9 s% O8 I) p8 h" m
152& f7 u) O6 M4 f
153 9 i' O- a" R8 U! c4 ^! S5 j, I2 n154 / x; x+ `1 l, ?9 Q1550 C! S% \/ d) v# ?9 n, A
1560 A% t4 B# G7 o* x
157 : j: ]* U1 a' I v8 X) _. A158+ l. ?$ r( E4 E
159 5 w. B4 c; }3 I/ |1605 v) W: H4 f' n B3 M
1612 l$ k: L4 U6 _
162: b; ^8 Z T0 A9 x
163( t0 J! K( }; Y# N0 R
164 9 V1 m C" o" h' E Q0 F9 B: `165 1 o. l8 V4 V6 |% `: j166# y8 X5 {$ s& s7 E/ ]1 |
1678 M1 H+ [ P" y7 D
1686 D+ H6 ?! D# l; y+ B9 n
169 Q) S+ n, y' w/ E! s1705 R( c/ ]" ~/ h7 _4 g; ?
171 1 P+ H7 T9 a% @1 {! N9 o3 Z172% R) R$ p. M& G
1734 v6 W0 o) j. G
174 # k! v5 ^% Q; M2 K+ q1 Y1 D175 + o% y$ ^9 T* d. c/ m176! h% r, _4 f* v) `* r) r
177( R5 X* s" C" M$ B4 y+ K x0 x
178 ! {& M/ ?& V5 v( F) x4 p& Y$ V4 p179, h# k$ \" O4 Q: `$ |" f
1801 g( f) u4 A2 E4 Z: {# J
181 % a9 v2 R0 f6 Z# k+ ]* n182 ( F( z% z0 R+ u$ d183. t0 E4 K% q! u6 t3 i
1849 {5 w' |8 q3 r; G1 |) m& x5 z& R
185 / D- p& ]! c* M. p- H+ S3 k, D3 Z186, E8 x1 i% G F' j
187% y+ a/ s! y! X# d( m5 u
188 # e7 r% r+ @- }) A3 b189 O/ j( A$ h* Y7 ]0 w2 I6 L1 g190 ) D2 |3 G1 s2 l$ r J1916 }6 |, @, \& C- }% y1 {% Z! ]- a
192 3 ?; N8 W" R( F. m. \193( ?# z, B% F$ V$ E7 J
194 $ R- r: w, d3 c. G6 L8 s/ t6 s0 c9 P195: o1 z. ^- ?9 X# E& E/ d
1960 G! m# t2 Q! r+ P3 J0 K8 e5 {8 V: F
197$ @+ B2 b! b$ F+ C# W0 O! Q
198 % m/ r$ D, W) Z/ |199( E0 {; L; y- s" T [/ w, Y9 W2 S
2008 N! K) j8 @' ^' G) c
201* y k4 `& e- P3 W7 x1 b) z8 b. E# x
202 ( G9 H% h. @, t& ^$ u/ ~203 . _# u6 |+ Z" X# ]! D7 j( o( a204 & M" z4 o+ M/ A5 a+ W; p# r205 / l/ N' ~. r' _, f206: X- R, N" G; M% E& v0 ~
207. Z( W+ z/ g6 U% `0 R7 Y2 \
2089 ?+ O1 S/ n, Z2 d2 u+ N
209 b# w6 \6 i1 v, p* j0 R% p) ?210 2 S3 X" s c+ n+ u2 I2111 o% M1 n" |2 k% _% i4 ?# G
212 b# x- ]! U' o% ]5 ~6 N213- s3 c: N# [: D- C( e, @
214% M+ u3 Y4 b& i/ z- b' n
215 6 |. Y, [( U v! g1 g8 w216( L2 {( Z3 P4 M' N
2175 v- P* D P9 D- K
218. J; |, d% U: g; @; a
2198 p7 z; q! @" B) _
220* {+ h. K! l7 V$ t5 U
221" d! r* G. u% ~1 V. A$ x. T) Z
222# N- S2 S0 h" \9 H9 S; n. ?0 D
223 $ o9 C1 ?: O Q$ F6 g* V2245 f/ m+ P3 N- \
225& x5 @' ^' [$ j3 u. l9 x
2264 l. I8 i8 A7 Y! x$ x2 m& h1 P
227 % T+ O3 S9 j3 E ~& G228 7 V( m6 @9 u) h# u229 & n2 ^( b6 l. L3 d' Q230 0 l, O2 {8 ]8 b# o: q0 O231 ! V: h2 r M$ g3 S232 ( G1 D& t; E! f1 c# ^233$ Q% F7 @- p) U: l" W! W
234+ P9 l' h: C/ e, C7 T: p8 m+ N
235; l1 N7 f7 h/ V
236 5 V7 @4 W4 I! ], H237 0 k& Q" L9 p9 M- L+ R238 ) F& u* t2 h5 s239' T5 `! q& X, Y* ]+ F
240( g: g: p8 _4 U
241 * [/ u" s3 }9 }: N: i& T2429 U K0 k8 y( O* M+ _% [
243 * {% ]6 _6 w* ~244 ( _3 F$ W# A( G245 ! s* m, H; i( Y1 @9 i! D246" b9 Q+ }. Y* i; X
2479 ?* M* H* C' W7 u$ r1 f8 Q7 J' N4 t
2482 f( }( A5 S- k! @
249" _9 f. D9 a, r0 ]7 W
250 . @* g- `& L, D/ a251 ' k% V- H9 h, j5 R252; b5 U1 c8 S" n2 Z
253 4 m# @+ q5 Q/ m+ {) X7 S q8 q m254: G" ?; E' |( h6 c( N1 O
255 ; m. m7 }' e' g$ A; G0 b256& {' a4 l8 u( k L$ a3 D
2573 X# V$ ~8 b; ?7 x* b
258 , l4 x: Z* Y | B* y7 V3 ]. J2598 e% _0 p& r" a+ h7 b, g
260 9 |8 d! ]5 B: `) [261. }- H1 k1 M$ ~ S
262 4 F) H8 w+ l" o; C" ]263; Y% }7 U; N2 @# e
264 2 |4 s% D( ~. z a8 J5 v- D265; M' Y6 i) N/ |9 J- I
266 " e) W( d6 o" l- V) y267 [3 B. E7 ?4 J6 w% @# N2 f$ l268, c! o& m) ]8 P
269 . F. \! M# R) w O, C: h270 % Y7 {1 U0 S$ p2 f271 ! v: z+ j7 d9 Z$ l& B z5 n0 c& N8 ^/ ~2722 [# r6 O8 v% J! D- U [+ Q e/ W
273% t$ U3 w+ f2 p; r. R$ n
274 ; O/ K/ I1 R: T% ?. j275 + b1 p* m- B- Q" D8 x276 9 S3 {/ I# }1 K$ {8 ~# s277 $ ]6 c# V+ l: N' I# J4 `278 ) z4 z( q" Z) p279) |, Z2 H+ n( D: M! e; _% H2 \ |
280 # U7 y3 Y2 `( V: i- v0 o- X281 0 y) ~+ w* s5 `- ?282 ) t# b9 c% l9 ]. M, N2832 X; t# f- d9 p( O0 r" {8 V) r
284 - j8 p& b$ U2 e! Z3 h' p2858 f9 {2 [$ p4 I) K
286$ j+ _& l) Q3 V2 F0 f8 v, O
287 & j, U; B+ a3 W% O' z) r1 V288: p! b' b; H: j" K/ x5 C
289 . T$ f6 v1 `- z' M( n: I9 z( }290; ^3 i* e) z, F8 ^
291% r9 y+ x+ u( g* ?, {1 c6 a/ o) n
292 " `! L& w# Q$ Z3 j293 ' F4 g6 _: m5 r! ~294, p& o( _* H2 f* {! A; c
295 , z! s- l# J$ g/ Z2963 d8 e2 ?+ {! a ?1 w U
297' S: y& g/ e. t- W0 K" Z
298 " i2 \! \: Y, L n: D% G299( d2 ^5 b: E# K6 H. q
3005 u! X( s1 R9 \- P3 M& R6 Z
301 * h$ d: W# k8 A0 z0 v9 I% i$ h302% a6 {5 B$ T" }% |" R& Y
303% H2 e$ p0 a1 v3 `% w
304; [' J! y8 Q$ C# L; P
305" e k( x/ ? ^) y
306: I t5 d, @. U+ ?# a5 X+ Q
307 + e0 z: a1 B6 U; M( u1 G$ t308" t4 `; Q! P1 B( ? n
309/ g# P q2 G4 O4 ~4 `
310! m- s) D3 Z G5 r e- u3 J" C
311( t5 j7 @, c( w: y$ [' x# O( i
312 % @1 h7 _! W! O( [( u313 ) P* w5 b. i0 K314; f" Y# @/ r1 f
315- p' Z1 }0 g/ |* x- \8 d
316 , E, t6 v1 {" ?: l. E: Z! ?317" M0 s C/ O1 H6 w; ^3 O
318/ @. T3 O8 j0 O8 P$ J9 e+ ?+ Z
319 6 P) z% |: v' V3 j1 g- j2 Q320 % t* O1 _% Q1 B) w! d5 F9 B- @321 P4 g2 r) d. g; i2 G' _1 u322 8 H3 G6 p; W5 I \! J0 N5 F323% z! e7 j3 ^2 i& W* l
3241 d ?6 j2 E- u8 {
325 ! V4 a- o' @" W) ~% z0 S326$ L9 u0 q1 i9 f( W4 f
327% y8 a1 x- j, u
328# A* _; g: n) N9 c2 ?
329 1 r. X& M6 k& k( N& ]330 - @5 D7 I n) D331 ( p. ^4 G4 e" m1 h3328 `9 ? v4 A0 a( ~0 g
3334 q8 R6 e) f2 u) `
334 # ~+ t, P* A! e! g7 J335 ; f! M. q% S4 k8 _336 ; x/ i" ~3 j" x( ^+ p4 j& a6 I337" [) g# C" |' o; O2 r7 }! g+ k8 Y
338 , e: M D. j: x! @) x+ I% g339 1 {" }; x# T! x3 ~6 I340 - q! L9 A# K1 f0 ~1 l341 3 b$ `0 S# x I7 n5 C* u342" g+ I% F$ R3 {; ^1 H4 w4 H5 A
3431 e, o6 A8 L% x7 K
344 , l' h# t7 H4 F, I8 B5 Z345 $ v8 _% R! E! Z346 # B$ q4 T& W/ G, V" x. I3472 B3 C, l; N3 o
348 e% S7 v7 Y7 _& O349 3 A+ q0 r4 U, ?5 n9 L! \1 Y350+ N& J( ^( I) }6 M! B0 D9 {
351+ o1 @% n. W( ?- s' D
352 . x7 y4 u( u2 D353 4 {7 S u2 L# I3545 X" z( J" U9 g8 k& z
3556 k7 ^7 M( L. M& x
356 # i, y C, A* Y. O ~" t- K357+ z' A) E% a( J% E9 O& y6 f0 e
3583 t+ u& j/ ]8 ?. G, S% @( }, B8 b
359+ o8 a6 u+ F! r3 x
360 & E! q V1 u9 U2 v7 S" _3615 w/ h( [! U5 u1 g$ D
362 6 q8 P2 T: @+ h; W$ x# l363) f( u0 v- Z0 v0 }4 ?* q9 ]1 P! u5 Z$ j
3644 c' t! N @7 Q' m1 j
365 / _1 g: `( L: K6 x( v366 * w4 U7 o( t% k( M' S1 ]367, {% B; T. O* n3 @. w H
368 + U( n! B+ K! G' V; ]3 U369" s' I# ^. l' k: B, v! y- B
370 , J1 R6 }) x5 w371 F, N. I4 |+ |* i1 A' m372, I+ h2 B, F7 j2 z' b/ {/ r
373' ~* ?- @2 j/ T! I: n
374 0 q# S. z$ C" A* u375: }2 [" O% `3 s8 h! c) W* X' d4 B8 G# k
3762 X4 V! r: T9 z! T' R, N
3779 A; D; U8 [7 Y' y- i
378 0 g3 D, k. c: K! L, I379 * f; a2 j" l+ ` f380 + `& ^ F# F' p( X381 3 A1 t% c* J' m* Y3 b. x382 ; s+ {: N7 e8 X& q383 + N; ^7 x! w# K( F8 l, v384$ T0 G8 C# ~2 W& t9 A0 C' r
385 8 E; U& @/ S) q, A$ T+ F386 + }: o9 v; J, |: n: e) F0 f3872 l' _! w0 c/ [+ @
388& L9 i1 ]) M3 c. v
389- M0 P8 v# V- N( K- R; w& L
390 & @: H/ j1 o( t; _0 C0 b391 4 Z" T6 g+ g1 Y$ _3 d2 C _392 4 C, j0 @! P* Z& F* e+ \393 & j/ w' J3 U Z5 G( V/ [394 1 s* D ^+ \' p395 2 J6 J) r) A' K( K3965 `+ f7 J! u" @$ k4 x; g- a8 Q
397; R2 B* B0 `, z" D* c2 k+ [
398" ^; B& `% o7 p
399" J( ^2 [7 h) Y0 N, W ^" `' t
400 9 W( u8 }2 ~/ E# j% O401: W; N6 B, H& u7 D$ Y8 g
402+ U. C8 Z8 Q8 }1 y
4030 j, C# \. \9 E4 m. k
4040 W0 K6 V' c8 g9 m
405 % O0 v$ C# a* C8 ]* t/ m" K406 , m' s& q( M' ~ ?% c, }. \; d407 9 a/ L/ d" ^0 m408 y" i0 _- X& }) v! ~
409 6 o* h/ |/ H& h9 I* b I410 ; N |. b A% c! f& J& e3 t411 - p4 I$ L6 S! i& U. J( x$ L( R% ^4121 n1 p( ?) Q% x4 A* _
413 : g' p& _- Q- B* Z& z- @414; K, b& O! M% O' g
4154 h+ }' k+ U$ I
416; s& E6 N N( R! o& x4 C
417 5 ?' ?+ k$ o; [5 C/ U. b$ \4186 M1 @- X) j2 {/ M! A
419$ }. i3 S! W, p/ }- y
420 ! ^1 _8 @; a! d5 L7 @5 q. R* m) @421 & P* F+ ~, T+ R& H+ k3 w4 z422% G0 s2 {7 G' K5 }
423% E1 b& W) p4 B' `
424 # _3 W& s; [5 \4 f425 7 D! V7 l/ g/ X' @) P% t, C7 a426 - |, o. G4 J; {) }' N9 |! \! ?427 4 l! N4 Z. F. x+ z428% @# ~+ l, v2 _- i: M
429 & t# w$ J2 J2 k: K+ o5 B4 G430 ( _! @7 B' O( D* ~8 V/ D& r431, ~" `- \& q: T i- k1 m
432( x$ a6 h e: }
433" m6 O1 I: E, l
434: I& R% g* X* n
435 @" E. \+ P [! q4 m/ G& s
4364 _- ?7 y+ _* z% u! |
437 ( ?8 z! h1 U" y" x* |( j0 n438) G3 i5 l# X* P h/ F5 z' w- d
439 , S) k, p; O6 l- B440. |& y* ? v5 f, g& E/ n
441 8 F. E! i+ O7 Q( P( J4425 k/ K, }4 b, y+ S+ F2 n! |8 T0 V. A
443 * k3 R& V1 Z9 m5 D+ J4442 }5 g0 y5 e7 u" G1 a
445; I8 J3 n/ g, y& V
446. J" P2 X; C& L: E# C( U$ s4 X
4474 ~3 a8 @" ~# R+ C0 ^4 b7 ?, j5 Q
448" Q! h2 x% }, q- J. _6 E
449; L! k+ C! H$ S$ M$ Z& i; t
450 & Q* l* i! ^ U9 B: R5 C451 + D# t8 K( G: q" i$ y. ^. |452% \6 V) M( U9 C2 D* d/ Z
453 1 w5 \7 a( u! ?. W454( t, o2 E; C$ y, i, O9 I$ c
455" U# F* s" _7 B3 Z
456# w: |, ?; b4 I5 k3 M
457# M# U3 K* N" D' a4 ^
458 . O1 v5 p! ]7 l4 V3 b0 T4597 g8 e+ a5 s& V$ ^" g# g4 q7 U% E
460 9 z% b" U! Z& b) f, z% O0 O461 0 x; x3 h' H1 \1 d3 H. }' }! ?: A462( g: r1 \. Q' U0 I
463 ' i' X. C O* B2 x, w) w464" c3 m# }- N0 d, j( [
465: U7 c! s& H$ n r1 X- \
466 4 i6 R& A0 a8 X( F/ @- e467 ' S" A; d* K9 c B" J468 o/ m2 d8 X- G: f469# |% _- O0 k6 [1 {* n5 L1 s3 S E
470 r5 a: g, J' ]4 i' }1 u7 O471 7 U; I1 N) l1 A* W' r4727 m$ L/ P7 ]. F1 w: h! c
473* D& F1 J7 \5 p' n, U0 H+ u: Y* c8 E
4743 B: B( n) @; l; S1 j% {- ~5 k+ e! N
475 & b) `, R4 Z1 L$ p% h4 [476; M4 p* w# d2 W6 ]
6 f0 O# w/ } u1 M9 p# w
- E7 K) r+ U* @
; [! S" W! x) P0 z7 ]7 G% z8 |7 u8 ^ k) m
8 [; f9 q* d6 u0 n: t 8 S0 s! `: o: M$ h) N7 P, `+ X! N$ q$ i$ g3 s) M6 p; u7 t
+ H0 \& q: Q/ P+ r" q5 g. E: s