# l; }3 k O9 M: C& p@app.get(9 p+ B* J- a% G" P6 b, Q
"/bilibilivideos/{vid}/comments/", 3 w( j: M& b8 x# s+ ^ response_model=List[schemas.BilibiliVideoComment],4 E% W5 ]8 T% O }/ Q1 D* y
tags=['bilibili视频评论语料库数据接口'] " j% m. I. e0 T) . R6 G4 x# ~1 Y; H" g# ndef get_bilibili_video_comments_by_vid(vid: int, db: Session = Depends(get_db)): 2 |( P2 y: Y* M9 m' _ C. g y/ Y! A db_comments = crud.get_bilibili_video_comments_by_vid(vid, db), T) e' ?8 p+ e/ x$ U% U: K
return db_comments 4 ^7 j5 v& g( F# w* { 3 |4 |+ X. [$ Q% M: s8 e 2 |# z7 \- Y+ }# ^8 n* ]; l( ^1 @@app.get(# G, U2 ]2 R% k# H9 x1 [* m
"/onlineShoppingReviews/",9 t! F, x' j/ {' b
response_model=List[schemas.OnlineShoppingReview], 9 }; L5 m. S4 M tags=['电商购物评价语料库数据接口']# i/ V9 p( {3 }- M
) 4 n2 v F% A5 pdef get_online_shopping_reviews(db: Session = Depends(get_db)):' l4 ^. A [1 ?+ H8 r2 q2 u
db_reviews = crud.get_online_shopping_reviews(db)9 y$ E& r5 t" q- \8 O
return db_reviews , u" Y6 U# g3 @0 F$ m( R& y5 H6 Z/ z+ U% C; E V
q; ^( p, r8 U6 h: B5 j@app.get(- E# u- R! D1 l5 ?' ? r
"/takeawayReviews/"," ?9 s( h5 l, M: P2 p' P
response_model=List[schemas.TakeawayReview], 4 j+ c9 W* I* O9 ]& x# g+ { tags=['外卖评价语料库数据接口']" K! g8 B0 F2 G
)7 |$ f( D' m5 ^
def get_takeaway_reviews(db: Session = Depends(get_db)): ; ~( @8 f; b" B9 C, ]2 a db_reviews = crud.get_takeaway_reviews(db) ! w4 _$ l. W3 m" B; ] return db_reviews * D7 n8 h/ S: \2 Q, t) r# F. U! o7 F5 Q$ g4 T" p
0 f6 X! V3 a: i7 w@app.get( ; Y; ^9 o4 W0 f1 U "/chineseLyrics/",0 r8 d8 d) e5 Y- n
response_model=List[schemas.ChineseLyrics],' ?0 [ `4 l8 i/ z0 E3 q6 d* d
tags=['中文歌歌词语料库数据接口'], Q( t1 \7 s ^' m, w0 A
) ' k9 S$ a, g4 l0 {def get_chinese_lyrics(db: Session = Depends(get_db)):! H- B) u& A# L9 F! s) L* Q6 z9 l
db_reviews = crud.get_chinese_lyrics(db). ~3 o( _; Y/ u$ t$ R. c
return db_reviews6 }: ~/ @2 e0 }. H
5 K# ]) D( J1 ^( ?, n 0 m9 F; @5 U0 e& K5 U: n: }. B@app.get(9 Q/ Y3 \, D4 t$ E$ _0 y
"/COVID19News/",3 E$ J+ i# k/ X+ E; {) ~3 ^4 x% Y. C
response_model=List[schemas.COVID19News],. k! U# F7 E4 W( D, L
tags=['新冠病毒新闻语料库数据接口'] 5 h B4 B' x) U/ F! T9 E N; e)) h* m! C/ r$ I# y9 m
def get_COVID19_news(db: Session = Depends(get_db)): ( P5 s) x$ u% `: h db_reviews = crud.get_COVID19_news(db) ' [: s2 I' N. e. G9 \3 U" j return db_reviews . `) |+ H! C. H " A% h9 N5 t! ~! L1 b( n0 _- M5 q6 K# O$ y
# 为每个用户设置uuid标识符,并存入Cookie- c) K+ T/ e6 n! ]5 _
def create_user_uuid_and_set_cookie(response: Response):- w1 O- K, h: S8 ^. n
user_uuid = str(uuid.uuid1()) % r3 y1 _0 b- Z! h/ Z9 ] response.set_cookie(key="user_uuid", value=user_uuid)7 W( [) \* ?. d
return user_uuid : }4 }6 i6 ` r. n " M7 y3 H$ k% Z% Z6 i; j) J+ b% Q& P( [
@app.post(/ ^3 _7 W( G' I4 O+ l9 A
"/calculate/preprocessing/",% D( I* k* D5 U) V
tags=["计算模块数据接口"] 4 X t! S: d8 f B3 J$ y) 4 D b# A( j* qasync def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams, L1 n2 e* S# m& m# d( {3 | background_task: BackgroundTasks,: W) j! W" S! P' p' Z, t
response: Response, 4 C5 d. ?6 E, g/ A, |, f" Y user_uuid: str = Cookie(None)):5 r3 m$ e! t2 N9 Z% c# l
if not user_uuid: $ h. H( e# n7 c6 U( L0 k user_uuid = create_user_uuid_and_set_cookie(response) 5 G, B. z# K3 N- K# S! R / N1 g7 H9 j! l; ]$ V global topic_model_training_tasks2 p9 Q; O8 w. \; a! \( G
task = TopicModelTrainingTask(text_preprocessing_params). Y4 n: h; }% W! e, h c' q
topic_model_training_tasks[user_uuid] = task8 P* M6 ~8 M% b E
0 }3 }8 B* U* w c* d# m6 U background_task.add_task(task.preprocessing) / a) _4 f3 H" B+ r \9 E return {"message": "已添加文本预处理后台任务"} 8 ~/ j D) r. ~) Q. Z5 z& P8 v7 e: E& D2 X
$ E! y/ S6 W+ L5 H) z9 v: ~5 b
@app.post(2 h/ B1 d% ^9 H& Y+ c. p/ c: |
"/calculate/nmftraining/", ; H; R7 U5 ^4 c. `) Y tags=["计算模块数据接口"]& D# Z/ ?& X( z- ]6 f) m1 V
) - D% ` }$ W4 b0 Q6 W1 r, H& b: Zasync def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams,% B0 x( \$ ]# E, R- w" \
background_task: BackgroundTasks,0 M0 U1 y- e3 s4 O1 U
response: Response, , }# s9 }" G0 T! V user_uuid: str = Cookie(None)):' p% f' {6 H# n1 n" t
if not user_uuid:# i; F# U7 g* u0 ?% m0 E
user_uuid = create_user_uuid_and_set_cookie(response)3 A7 A4 O$ q7 g7 c7 P" k; c& P
2 N8 E6 p1 |- B: b% a global topic_model_training_tasks 3 y, n% ], z" o: L1 {7 f3 h- t' a
if user_uuid and user_uuid in topic_model_training_tasks: 6 Y: V( j( Z& Y6 W* H C5 I task = topic_model_training_tasks[user_uuid]' }- b! W: w* U
if task.text_preprocessing_progress.status_code == 2:8 U# v/ z3 T6 S! c' M& M
background_task.add_task(task.nmf_training, nmf_training_params)# {4 Z4 h/ v/ C# ^) l3 w
return {"message": "已添加NMF主题模型训练后台任务"} . J( [" I5 [8 L0 q; ]. m, ^( w8 G else:' d/ @, ] Z1 n+ Y9 f- F6 D
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") . U3 b1 x# i @2 }, V V else:3 K3 f/ n5 x# L! h3 q; k
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") % c+ f) m* k' S2 J/ w- i / q# s; y* o: i* _" C% @- V: l5 C; c1 Y
@app.get( / z* [& [" A' z& @8 t! u: w2 V "/calculate/nmftraining/keywordsearch/",, c) n' z5 Z1 V: J, W5 ?0 @( e
response_model=KeywordSearchResult, ' @1 s; j) W5 G. R1 Z$ W8 p8 [6 i tags=["用户交互"]& z+ M) l* d+ A
)0 Q% R: K: {& _" U5 {0 ^* x
async def search_keyword(search_text: str, : W! G! ?% _7 X7 c2 n9 c, D response: Response, ; W4 ]/ l- t$ U* z# q user_uuid: str = Cookie(None)): 2 \ Y8 [. j: @9 c* Q' N if not user_uuid: " U/ M$ o w: a# [/ f user_uuid = create_user_uuid_and_set_cookie(response) 9 r4 P" A5 F2 @% b7 o# @ y* j4 O% E( G7 a+ t1 Z
global topic_model_training_tasks ! e/ G; ^. z2 A; |& t) I ' h0 Q% C% [. v* Z% p if user_uuid and user_uuid in topic_model_training_tasks:% t, t( D( e( B$ U3 p" r
task = topic_model_training_tasks[user_uuid] 1 _/ L0 Z6 q4 R m3 D0 `. b if task.text_preprocessing_progress.status_code == 2:, C9 B* J0 k3 [' D7 i0 E2 I
search_text = search_text.lower(); a9 ]# z3 P3 ?! q! X) U
bag_words = task.text_preprocessing.bagWords / _% v0 c4 i; B' u/ N5 d1 c1 I) J keyword_search_result = KeywordSearchResult() - `7 e F' t7 R for wi, word in enumerate(bag_words): 0 ]6 g$ z% e% j. c0 J! p* C if search_text in word: 1 S `, f. s' e( y3 C0 s keyword_search_result.word_id_list.append(wi)* A( v$ W& p! ~. ]* \" k0 i$ B3 Y
keyword_search_result.word_list.append(word) # p. F& @; U6 y; \+ E6 f# P return keyword_search_result) g" d( t3 l6 m) {9 y
else: y0 b; r! r$ B2 M( F& L raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") " a4 {. p8 n2 s, I/ Q else:6 ]- ^, g' ?# j) E. N' T
raise HTTPException(status_code=404, detail="未找到相应的训练对象!"); m' V, o G' X0 [0 |4 F5 \, p/ t
' T; s( h4 g, d; o& C# w" q 6 V7 ^' t9 G2 B. q) O ~@app.post( / p2 ^2 J" q" x9 i1 _: \ "/calculate/nmftraining/topickeywordoptimization/", % @% [7 F( I2 Q' |' a7 V tags=["用户交互"]/ T0 ]' ^4 @6 k
) 4 Q! X( n! k" Uasync def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams, 2 U: i) \% p: g6 v) S, J background_task: BackgroundTasks,7 @6 X: E6 V6 \ f9 y7 X6 e
response: Response, + _/ x: ^3 r5 c: t4 n user_uuid: str = Cookie(None)):& z$ q* v6 O! c5 X0 `0 A
if not user_uuid: & Y- Q3 P* b! ^$ w. P, u user_uuid = create_user_uuid_and_set_cookie(response) 4 F/ p9 g. h) z& c* x' S/ A' I7 c
global topic_model_training_tasks/ t8 N, ~$ j% f) R( u8 v" H. M
% n5 J- Y% c# y$ j7 `3 h& ]
if user_uuid and user_uuid in topic_model_training_tasks: + v2 w8 D1 n( X" T9 I3 ]$ K4 } task = topic_model_training_tasks[user_uuid] ) v4 Z: O# }3 F0 ]5 C4 |$ a' o* L* c+ G if task.nmf_training_progress.status_code == 2: 6 q9 `8 ~" {+ ^- \4 n background_task.add_task(task.topic_keyword_optimization, tko_params) * m4 Q N; `" ?( [, m; V! U2 ^ return {"message": "已添加主题关键词优化后台任务"}0 u' i9 h4 P% C* j
else:" ^& r9 Y3 S* y2 @6 c% D' u
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")- ^' {/ g0 A6 V8 H3 T8 ~ w. j5 Q; G
else: + P0 H! h7 J4 m3 m- R9 \. } raise HTTPException(status_code=404, detail="未找到相应的训练对象!")# y/ l# t) U: [$ r& Z4 P
/ o9 e6 \# m" T1 N, h4 ?( ~, C; I# y5 N1 k8 e! S4 d9 g7 M6 r
@app.post(5 l0 v9 L& ]7 @9 U# U5 W) [) ~$ D; _
"/calculate/nmftraining/topicsplit/",5 P# l# d I4 c
tags=["用户交互"], n+ q6 f1 L6 i( g2 z
) 9 h( s, i+ o; m1 \async def run_topic_split_task(ts_params: TopicSplitParams,3 i( l. v: ~) M+ M! m X* g
background_task: BackgroundTasks, , g5 c: [0 t) q; h' E( s response: Response, 6 K8 L+ h9 V! N. ~3 A user_uuid: str = Cookie(None)):6 k4 p: {- q6 V5 M/ `
if not user_uuid: / U0 y. E1 ]5 A1 Y2 O" | user_uuid = create_user_uuid_and_set_cookie(response)( a0 U8 U0 l+ u
1 p4 a2 i5 M' a6 a7 r global topic_model_training_tasks % A& D5 K' `, A, R2 v3 y9 W4 }8 z' _5 O) Q: v
if user_uuid and user_uuid in topic_model_training_tasks: . N2 }( O9 ~/ X* n# r `! v3 z task = topic_model_training_tasks[user_uuid] / s h) G5 {: T if task.nmf_training_progress.status_code == 2: , e( l+ x! V3 C4 u7 v8 Y+ H background_task.add_task(task.topic_split, ts_params)4 Y; H9 p% q% W" ^1 l& r
return {"message": "已添加主题拆分后台任务"} & [7 f0 Z: i/ T. E' Y else: , x1 A1 g6 m) L6 a# ]4 a raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") + [4 _7 T% _8 S5 y# V2 X6 P6 I else:$ ~9 J! E# ?3 ?- d6 v2 ]
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 4 P3 _& G, w$ s6 _5 x8 ?/ | 8 k3 k* e5 D. v 2 V0 b4 ?! u* t" a1 v@app.post( + _- F$ h+ L! l# \( W0 S "/calculate/nmftraining/topicmerge/",; n& H+ U l' {% r3 s9 w
tags=["用户交互"] : A% q5 t8 J* P# ] O) 6 w0 _6 }) X9 _- tasync def run_topic_merge_task(tm_params: TopicMergeParams,3 ^: q) D* M1 \. q2 ]2 S/ F
background_task: BackgroundTasks,8 V3 M9 E- q1 U" c
response: Response, ) U$ L, ^7 Z5 p user_uuid: str = Cookie(None)): + n. M# f6 o6 O% v8 I8 f if not user_uuid: 1 o! ~- |4 @ f2 _7 r user_uuid = create_user_uuid_and_set_cookie(response)# s6 C4 j% O6 N/ |) ~/ w3 t
& L& k& n& ]5 P* T" \5 D* j
global topic_model_training_tasks 8 A& t( m1 Q( U/ @& d: ]8 l( [ ! N3 O! x: e0 J* i if user_uuid and user_uuid in topic_model_training_tasks: S& X# N k' G task = topic_model_training_tasks[user_uuid] 1 I {) c/ y& v if task.nmf_training_progress.status_code == 2:% v0 Y, ?# S* n$ h
background_task.add_task(task.topic_merge, tm_params) , I* x7 e2 R+ c: @! p! @& C return {"message": "已添加主题合并后台任务"}# b F8 M- N7 U
else: " k+ E- T3 B( K4 l raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ; g5 _) ]3 E/ X+ P else:" h# Z5 e; d) h5 [% R; l
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")$ i. C, M, _ V# F
d! {6 e7 Z9 W3 q ' O* o# s* d0 `# D ^@app.post( 6 N$ n c! w. d! k9 z "/calculate/nmftraining/keywordinducedtopiccreate/", - w t4 k" G: A tags=["用户交互"] 7 D$ D. M3 y/ @)& b2 f C3 p' w- l8 x1 T+ J$ E8 ]- C
async def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams, # o3 o2 v% A3 U3 h8 E* z background_task: BackgroundTasks,& |* i, M z S2 B" ]* Y$ ~: P2 q
response: Response, $ b1 V8 ?4 B0 a& b! J: t: A7 C user_uuid: str = Cookie(None)): + c5 X( Q! o/ M4 k* ^) C if not user_uuid:8 T! X* c0 \, {5 b k& M$ p" U
user_uuid = create_user_uuid_and_set_cookie(response)% E) G. T$ s) F& q. k6 ]2 f
. {) \: }' Z' P& p1 N6 E
global topic_model_training_tasks ; w) L9 r; Z* r 2 [9 M" g& K7 t/ w) r if user_uuid and user_uuid in topic_model_training_tasks: V5 r% t# A: P6 {) P task = topic_model_training_tasks[user_uuid]6 d3 i1 G1 @) U" |4 x5 Y
if task.nmf_training_progress.status_code == 2: 0 F) m9 g) V U" `; K: f background_task.add_task(task.keyword_induced_topic_create, kitc_params) 6 N) ^. z4 w* x5 S- ?1 L- {: ` return {"message": "已添加关键词诱导主题创建后台任务"} . `0 i. A0 Z9 e2 S% w else: % H' F% }; q7 }/ ] G- Q0 x3 U raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")1 L# X f! U" h5 W3 g5 y7 J' Z$ r3 Q
else: 5 a" E- I. I# L! ]; j raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 6 M# O' T( w: w$ i& Q ) {7 r" J2 e! \' `# A! p. V a9 k" N/ d
@app.post(8 c7 Q6 o* w9 S
"/calculate/nmftraining/documentinducedtopiccreate/", * L3 F" q' A5 p, x& V& @2 J( q tags=["用户交互"]: L' y- ~; C5 b+ h
) . g6 W* ?1 ~4 U( f# U1 _1 ]- kasync def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams, 5 p% P: S, g7 o+ P* J$ p background_task: BackgroundTasks,$ Q. H. a& R% K% F5 Z' n4 |; H
response: Response," s. D" z! v4 \* S5 F- `4 Q H! M
user_uuid: str = Cookie(None)):3 z* ]) o# E! [" n! S8 S% k' f) @
if not user_uuid: 3 L& t8 \& n) S user_uuid = create_user_uuid_and_set_cookie(response) , |8 k" A/ t1 [) p2 d # P# J% H% u, O; m9 w' f% ] global topic_model_training_tasks ) D: ~7 s$ M2 t& l, j) p6 w ! o7 n/ B& k* F if user_uuid and user_uuid in topic_model_training_tasks: 3 t" M8 K* j e7 q" t1 } task = topic_model_training_tasks[user_uuid]8 q; [: g- D. U. z/ y/ B! v4 g% G
if task.nmf_training_progress.status_code == 2: : u3 q; j9 w: L background_task.add_task(task.document_induced_topic_create, ditc_params) ) G" I6 }8 D* h W& E0 M! \ return {"message": "已添加文档诱导主题创建后台任务"}7 L0 o# O& E* m" [6 t
else: , ^8 m }& G: D raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")3 p/ F7 }; m9 N' R& h6 `. s# i
else: 4 \8 p* a: D3 M0 t raise HTTPException(status_code=404, detail="未找到相应的训练对象!")- e4 D2 N2 W1 |: e
, Y# d" M5 l$ u8 z8 V
$ `7 n6 l2 ?3 H y
@app.get(* M. G: h2 v* F1 z, I" O' G, K
"/calculate/nmftraining/newdoctopicdistributionpredict/", * K* `/ A# D; V, r( \' M3 e tags=["主题预测"] 5 p# s; _* y; x% K* J) 6 a, Y; K8 P9 Z" l+ B( e# {async def run_new_document_topic_distribution_predict_task(" B) `" _/ k/ ]3 U# P
new_doc_text: str, ' x* E' q! h* p' g: q2 w: w background_task: BackgroundTasks, 5 x: M/ U$ J$ }5 q" B% m response: Response,7 a' V- I7 B4 R5 H- _7 y+ ]
user_uuid: str = Cookie(None)):3 b+ U# O: E! r7 o0 `$ J# Q
if not user_uuid:* f2 d: K+ N- B7 z' C6 K% q
user_uuid = create_user_uuid_and_set_cookie(response)2 r O5 r9 y/ i$ @
- y% k& ~8 ]9 F; Y- t8 c global topic_model_training_tasks ( q. d" W' ~8 h E0 V' c n 9 I' N$ `5 C/ b) Q* |7 O# R6 X if user_uuid and user_uuid in topic_model_training_tasks:) j6 U9 A8 n8 u) k
task = topic_model_training_tasks[user_uuid] + O8 |2 L) |' z$ I9 O( e if task.nmf_training_progress.status_code == 2: + @" D9 `$ e. w8 a$ K0 ?$ s, l9 g5 B- K% ] background_task.add_task(( I# K/ `- Z/ h2 e; u$ {0 e7 C
task.new_doc_topic_distribution_predict,' ^$ {/ |0 K0 P& @* r6 I
new_doc_text0 d7 W! c* g# F0 l8 i8 f7 E
)3 N* ?8 D/ U$ I ~' d' ^2 u9 ?
return {"message": "已添加新文档主题分布预测后台任务"} ' a9 I4 c4 }4 r6 j/ I else:( `$ Y/ [& e$ ~
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") i8 H0 e2 K: J7 ~
else: 1 A+ |2 q! ]/ ]' W q( e3 f; ? raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ; F$ o9 B6 j8 z 6 u' T0 P7 X% ]6 j7 q2 V- b$ S+ h* s
@app.get(7 H3 N- g. ?3 r* c
"/calculate/preprocessing/progress/", ! ]: |2 w2 ?# V z: n) V# x tags=["计算模块数据接口"], * u' R3 g$ H; d3 x response_model=TextPreprocessingProgress1 w5 x t$ `1 _, w8 ]
) & w9 z' t! L- v9 h9 O6 J( j# Z) cdef get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)):( @( ?" ?3 m C/ g
global topic_model_training_tasks 7 a1 I7 h& D( ^- L* h 5 l5 K+ u$ y* w s if (not user_uuid) or (user_uuid not in topic_model_training_tasks):8 K1 g2 Y5 g# _4 b/ N
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & v! v" ^) ~' g return topic_model_training_tasks[user_uuid].text_preprocessing_progress7 k& A9 D0 Y( I: B& K
; ^5 z1 r/ u6 v" x( d6 y# r0 A, P / o2 o+ `0 N# @@app.get(5 A& j4 R6 V: d5 \) u2 x# E& A
"/calculate/nmftraining/progress/", 2 `3 s* k |2 k. ]$ S) J tags=["计算模块数据接口"], 2 c6 R6 c8 F5 n. E8 m' k response_model=NMFTrainingProgress/ [' Z( q6 \8 [, J
)3 f5 r+ S! g, x- t) c0 y. g; h
def get_nmf_training_task_progress(user_uuid: str = Cookie(None)): 7 n9 q% r4 {# ], g global topic_model_training_tasks 4 B$ l2 I ^& W$ a2 k- j G* S) M0 I+ U/ [6 [
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 4 v0 ^1 f% s' |2 k- } raise HTTPException(status_code=404, detail="未找到相应的训练对象!") : a( r( V, D/ I & n/ `+ W! l( U! v! z task = topic_model_training_tasks[user_uuid] ' ]3 w, T( |+ I$ n; [* q if task.text_preprocessing_progress.status_code == 2:4 \9 M7 ~' ? {. Z
return task.nmf_training_progress % ?# A( t2 j3 z- M; {! o, a else: 2 |( P5 s3 g8 o# J) Z+ x raise HTTPException(status_code=404, detail="请先进行文本预处理任务!"); \; b# m. [, Y, G. A. R
+ f2 v9 n1 `6 V/ _$ b1 t" ]7 w& D8 L3 `: S5 e
@app.get( m; U# ?* j; S. R" J1 c/ c5 O "/calculate/umap/progress/", * z. G! H1 u/ I. Z8 m* h tags=["计算模块数据接口"], 3 W& n) x& j! f% F1 @ response_model=UMAPProgress 4 e: L; [# m$ U& q5 R* m8 M& C/ H2 _) * l0 h$ x1 m" w: e) l) Cdef get_umap_task_progress(user_uuid: str = Cookie(None)): 4 r2 ?7 U$ H7 Y% R global topic_model_training_tasks / F9 g1 Z6 @0 r+ W1 A& l$ \9 R. z8 i# o$ u7 {) O) N) ?
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 6 P1 f z$ ~7 d; a raise HTTPException(status_code=404, detail="未找到相应的训练对象!")2 |. L$ Z! ?- F# f
4 c8 I& s% ]& V; f7 P0 A8 s$ Y task = topic_model_training_tasks[user_uuid] 7 t$ [% d; O5 b: D- h4 z if task.nmf_training_progress.status_code == 2: / \5 Q% F( g' S; A return task.umap_progress & p5 Q( V* e, W+ F else:7 G# @% z: S* R2 W/ @$ \, d
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")6 ]* t1 B! e' {$ W' x2 _, f
; C" h5 h, {) _1 Z- u5 o+ Z( N; B% p- U9 h( v4 D: f5 e
@app.get( # f- `: C8 s' k "/calculate/nmftraining/predict/progress/", ' e5 N0 r! q5 [4 g+ Q9 U6 J7 F tags=["计算模块数据接口"], - q' L3 K2 g; W response_model=NewDocTopicDistributionPredictProgress: h& E9 h2 O" P5 F. p
)7 l* m, b% t5 V
def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)): ' e9 [2 ~- n& \" d) c" a global topic_model_training_tasks w: e- u7 O0 m
+ D: l. D, b2 n4 S W1 ?
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):) ?- X9 h/ ]' r9 O' t+ R
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & Q% k, V& b; l/ ]6 W 1 V; O+ M1 u ^- v! n6 Z; O3 s task = topic_model_training_tasks[user_uuid] ( p! ?9 Z9 {% e9 \- v" H; S/ m6 W if task.nmf_training_progress.status_code == 2:4 A/ h6 R, @+ Y+ h5 Y+ m4 |$ ?$ t
return task.topic_distribution_predict_progress% t/ x/ n8 y& V5 \1 Z0 L
else:7 a6 ~5 X0 n4 w
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")' x3 [3 C% I3 O& x( q4 f
' o8 S) W6 V! g, Y/ E' j
+ A% F# X2 m3 W e' l ]
@app.get(: Y6 m' P" H$ M# x
"/calculate/details/document/",, {) ~- ?. v0 l% L
tags=["计算模块数据接口"], * _0 H( Y% a0 U7 c# H1 m response_model=DocumentDetails4 @, B% T0 m3 f, T+ G) A+ s; i
)& S% _ ~0 M* ]; H3 v$ h
def get_document_details(doc_id: int, user_uuid: str = Cookie(None)):' F! K$ @: ~1 k; W! V- w% ~
global topic_model_training_tasks f4 r% N- X/ g; ?$ m; l8 m- V
% i3 Q4 ^# O1 p' e; d" ~
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):% V: @! |+ u4 B# w1 i- _# U$ [
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")0 {7 @" M8 n \; b! h# ^
; @9 V8 u+ @8 v0 e) u; ?9 e+ a
task = topic_model_training_tasks[user_uuid]6 c- l7 w8 d: u$ z0 m7 s2 W( ^
if task.nmf_training_progress.status_code == 2: " H* ~. D9 ^0 c: C return task.get_document_details(doc_id) 1 E1 y4 F# \) O' a. w% r, D, P else: 9 w* y5 Y$ J. V# |$ L, O' \6 t9 L f raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") . z$ T% W: T7 J1 s / W, u" ^) P9 ]* ~. }5 `! s4 d" a5 ~5 i/ _& w& t
@app.get( ( R* k1 x! Y) C2 T1 Q2 L "/calculate/details/topic/",# D/ r% K# T$ l) ]* y9 m
tags=["计算模块数据接口"],5 u" A+ f6 P' m$ u! I, N3 l
response_model=TopicDetails' @% z9 v0 k% {" t) @
), L# `% f/ j* Z4 ~: G5 o
def get_topic_details(topic_id: int, user_uuid: str = Cookie(None)):) R8 }/ ^) ] Q$ S1 f( W
global topic_model_training_tasks . z% i( E! _* S) S5 v6 O/ i) G* ^7 J2 z. N! d! n
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):/ e1 V+ c7 n$ g7 h) w* D
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")5 R: P0 S3 @! @4 x- K! `0 j
0 ^/ |/ b! O' D( K
task = topic_model_training_tasks[user_uuid] 1 v# L; w, r2 R- c i7 o# g! k if task.nmf_training_progress.status_code == 2:. l) X! K* A% R5 K; ]& c" j3 _9 h* S$ X3 B
return task.get_topic_details(topic_id)/ S$ M0 t6 X! T0 B, @. }) |- D2 L
else: / }% f8 u. \, |+ `2 K raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 5 _. c! ~9 W& |+ k# }; G- f( x1 [5 d6 R& g& w# Y
9 Q1 c* I+ t8 z
@app.get(; h6 T. b8 R" V
"/calculate/userinteraction/info/keyword/",- V4 N/ h g" F& G& f* G% T: r
tags=["计算模块数据接口"], - \. y0 u- ?+ P9 O, R response_model=TopicKeywordInfo" U9 H I7 I5 c( J
) [$ S2 {6 p2 S+ _6 ]6 p6 ^0 l* Ldef get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)): , l+ z- b. Q; @ global topic_model_training_tasks; h/ M+ n( |$ @, {2 e: U
2 O; U+ L7 E6 O. D if (not user_uuid) or (user_uuid not in topic_model_training_tasks): $ _4 B4 G/ X0 x) w4 L raise HTTPException(status_code=404, detail="未找到相应的训练对象!"): D) ~, M$ _& c% j# m
) U+ d1 G2 h8 f" ~; I: T) ]) S task = topic_model_training_tasks[user_uuid], O/ b8 O w5 R: }
if task.nmf_training_progress.status_code == 2: ( o6 K6 i" e$ W return task.get_topic_keyword_info(topic_id), R* h, g1 @1 I# G/ q; d0 m8 h4 Z
else: - i" @2 M7 P3 e3 w* F raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")( e$ C) T* f" f
" x+ r4 m9 `' T- Y5 }0 u
. @ K7 a. T, H" t3 l" a@app.get(2 _. D+ @2 I1 {& n
"/calculate/userinteraction/info/topicmergekeyword/",4 V8 G @3 H: V& u Y) N' B
tags=["计算模块数据接口"],' q- K& G) `6 a
response_model=TopicMergeKeywordInfo % w- e1 [. s6 M% s: N- F) , K/ N, t! \% p$ U4 Sdef get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)):+ O2 H% Z! r0 f, Q) x
global topic_model_training_tasks - h4 U8 I. B) T# z, \) S 6 f. m2 Z( c& E. I6 N8 H# q4 _0 X3 w if (not user_uuid) or (user_uuid not in topic_model_training_tasks):6 A' g9 K T9 f$ S+ V. I+ F
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 0 P3 R- {" D4 {4 o' ~# S; w5 i: o" b0 t# A8 n
task = topic_model_training_tasks[user_uuid] & [/ _! y4 T' @( l0 s if task.nmf_training_progress.status_code == 2:$ M @8 W" J3 m
return task.get_topic_merge_keyword_info(topic1_id, topic2_id) 0 O& \% P6 R, }. ?0 O- T. h& B else:' N( [* b3 Q( Z
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ( Z) J: h0 ~' p! T5 e: ? ' d* L% w& P) u5 I0 f/ ?' T: b, f2 g: v* v8 V& n7 ?
1, J# t. d& N8 k [
2 " T. E, g* ?9 z9 ]9 S' R& |3: R- t: _2 o* H' @7 U. L8 C7 }, R0 k
4. [7 a. J' j% k! `+ y
5 1 A$ p+ ?0 W! a+ S# ~1 @" w6 6 } F% {* h- ~# N7 g, k2 u; ^4 M1 `7/ t% \( ]- b" S$ C
8' J' y2 G* f* K6 a* x8 R( e5 X
9 ' y3 s N: J, L* \10* L9 J( ^6 Z- G# y
11' \- c1 S# V. p, r0 W- U
12- G4 ?8 e9 ^ ?/ m/ ?
131 e3 W! z& m' }/ _3 O/ a
143 l) m2 H7 r- K5 z
15: I3 v6 Z) r0 t2 B) ]
16+ `, w5 _; j$ [$ Q* O* }' w5 g
17 - O! o3 k: B9 a% w18 q- r8 U0 Q3 y0 J9 K% R/ _
19 9 M2 Z, N/ C$ B! T20* p( c9 T: l( N, N
21, ]/ C) P% V% i3 j
22 ( I* T# p- T+ Z9 P3 M233 ~& v V# I' C; T
24% t" _( `, {7 l6 }$ a9 k" q9 ^
25$ P) n# Q& r7 {+ Y( p7 Z5 X* w
26 - q% Z. H2 d/ X* }27; T2 c7 Q$ h2 p5 p" E
28 - J3 x+ y, y3 Q# L9 J9 m29( y0 A& Y& w% I( v4 F$ b
30 8 ?0 z; E$ f8 v5 S7 ^, _, _31& V) y! g8 {9 A, `; S E7 R" n! D- q
32 2 f1 z" T t0 I$ F( Y1 v$ \33 0 K& a( d* N# z- {2 ?2 z# c2 e34; s s6 t( m# z
35 6 [6 i: @! k- t360 J w. ?( I6 }
37 , g J f9 l8 [7 S# S38 5 I- m" z; f% i4 \39 " g7 K6 Y0 L. Q9 |* m404 M' O( ?5 A1 w7 U# K
410 b/ G% t- M2 t
423 q7 t9 p4 g5 y% k( c3 Q1 Y* c, b
43 2 g; q% Z0 f2 m5 H5 G/ X n44) L/ J9 W$ e- D. N6 a
45) p+ M& E, X5 `# _+ v# [# c2 b$ }+ \/ M" M
46 . O1 c R# p1 T$ \6 i6 y47& q B ^) f0 X* T
48* r4 R. g6 N5 P$ ]& }; z
49# o) ~0 u! Q" d" {4 h
50 : J: g7 l- `# r6 `) g# a' v1 s7 A9 d51& d+ x3 H9 d6 b8 ~/ U' K$ m$ K
52$ N1 s: Y! W5 E6 A' K1 d' g
53* {1 h8 }) {8 g+ ~* k. V: Q7 e
54& k' \2 U( E$ t: e
55 9 X+ {7 W& z% y" x56 2 A( q6 M* S; D3 r+ f5 u' T" g57 0 P* B! q2 t1 K3 X* N58' s9 a( s+ u: A+ i
59* v. f6 {* t6 \, y4 L
60 7 d# I" Y) n; {% |0 A" @619 c% m3 h8 ?; Z, l) w' P
62 7 Y) ~6 U" d8 i% r63 ! X$ b' o+ h* c/ P4 v& ?9 ~' E64 3 M, {6 j+ W( A* \) a# M) L651 q8 z/ Y! E* N' R
66 5 c- i C; {- U; q' N67; ?4 w) h* L [6 ]
68+ k# q: G1 J0 L2 S; u& o
69) X8 }3 N+ F7 [/ W# p6 y9 ^
707 Q# m; c, X0 F; d' Y
71 # Y0 w" z; l% i$ L9 K5 N$ O. X: z0 w725 K( d2 W8 S- c& k4 ~3 W7 A
73 ' H5 W7 M, u& Y3 W. ?' v3 _74 * }7 [+ G5 Z- h75! c# I% K6 ?; n' X& X& i1 g0 v0 r
766 e. j0 ^7 o" B7 r- F3 \" U# K9 S
77 7 b, o% h3 r7 |5 k4 D4 e# Z- q* Z78 . d0 L6 l( v9 d `' W79* W( @( @+ ~/ r( v# y" n% Q
80 I* r k& D. X( c8 Y$ I
81 & `1 S" n# A# o# J82 8 @2 r' C) Y. \; z830 x+ ^. |( l5 f
84( j/ b5 i7 f% ]" } u
85( U" X7 j6 @* @, u
86 ! L: @4 o/ X3 V( F W87& ^* O# Z! [( n2 g" q( I7 f2 a
881 z* F7 G3 K L% _, P+ C1 y
89 $ q9 n. N$ i( Y& r8 X! R( m+ G9 ?& l90 * R) `& n* D9 `. k91 * u( T ?8 f: Q. f W( P& k928 o7 z6 ]2 X9 l/ X+ T' W# z4 W7 `. ]
93 , R; K# i; w4 ^" c, h94- _) p5 }4 `' @2 Q3 E1 f, ^ s
952 i& E% l+ ]/ H$ U: @9 Z
96 X+ A" k7 W* U/ C. K, y: G975 H3 e, i4 R% F* }- d
98 4 f+ }$ l8 Y" o1 c( G- q992 F* p9 t. S3 @: r5 U5 J/ y
100 ! C; |0 ?9 e7 R: ?1 L4 Y101# v% `8 e' m& y$ G# \, D
1022 J7 I* ~$ N7 m) E% w
1036 J$ ~ \) l) L2 a& \' U. E
104 . q/ ?2 Q! J8 K' s5 k105 8 {, C" _# h- G& i9 p5 }4 o106 & B" X9 {; A3 p/ }4 d0 l8 n107 " [' E# q+ R3 c3 I) a1081 E" |. [& D% M( g& G% q% M5 Y
109# \1 P5 z3 f2 e$ L. P, x3 ~: i t
110) b7 e' s8 i( N* p
1116 q1 o- {: }% w) P
112 2 i* {4 C* C) V- R' \9 s113 3 S/ @1 Q5 @2 M* T% _" }1147 Y5 k0 b# f5 x) P# ~
115: D2 j8 A f5 C9 T3 \
116 & | x) V0 z6 d4 }$ [117 & ?; x8 |' I* k& a118$ i' g; v: r8 U+ q# {# z! J
119 3 a8 Y( Q) Y5 J2 d* b' \120 . R$ J) I0 h- G5 z121! W6 k3 t7 G; X" I8 A
122 0 F* e+ P% ~1 T }! M* o" J123 9 `2 D. u; Y/ A( z124 9 v, c# m8 B9 A125 ' V6 h$ w0 t2 x! k, C+ W; x126 # a) L- D$ r z5 B3 G127& S, M7 n% K, h6 k( V
128# N* R& y% Z% E4 B: v+ A
129 " `2 @% P! V. A. H4 b130$ j' b2 f7 q3 L& c( H) \5 l& ~$ E
1314 I0 U, ~. n. }8 h
132 ; |; E, o5 V7 @+ [" ^7 `133 0 n; i. L+ X2 s0 y8 ~6 F; A7 L3 f1345 C4 l% l ]* w/ o7 O
135 9 ^; v0 c9 q9 n0 i136 f! B! n! V8 Q$ g2 w
137 $ H+ u q, l6 t* Y0 D1381 a$ g% i! A/ |, z& H9 y
139( y% c6 |4 B, T b
140 ' A( L& Q8 R( z) }141 4 P1 `: E( e M1 V' X" q142 ) L2 d( [; U f% [7 h143: M* A) ~7 E, J: E" i
144 ! U+ m+ i5 ?& }% e/ Y5 d" ]: J# R145 5 K" X) l4 W* N; Y1 l4 n146' P+ E2 M; e! {' E1 O1 `
1479 D# K" a# r! j+ P
1486 \ t6 L, Y0 U; C" x1 n4 k& B
149 n3 c( R8 ~) E+ r& K1501 {7 l! N0 u( }- d9 z
151 - g; W- g2 V8 Z: Q) Q152 & M) W9 A& R7 r153( L% q$ |0 r1 z* E0 t4 f/ R
154 8 P8 M8 t; I$ \4 {) A# D; z1552 T6 P3 b* j/ y, M/ E8 F
156/ U8 r0 G5 D& x8 h" v: [- h
157 1 G+ N r. r2 d3 v6 k: @) B' \1588 l# F! t \; l3 D
159 ) B: H1 D( P- \# F# F* y& z6 W160 3 Y' c" {/ J2 L# p6 y161 & [( v+ v0 t/ @$ `: ]162 ) H2 a# y, r" z, g6 j k163* `3 q5 A0 }, T1 o9 L1 O* g ?
164 : x4 I3 ^0 D/ X165 2 N5 U0 b$ M4 @166 % ^/ N: G, M$ H167 6 y3 q+ y) q5 T% G* L1687 w2 i0 Y+ o2 a8 P# M, Y
169 & z0 g" f. c8 s1 [0 o* _170/ Z2 l" d, g o8 S" [5 ^
171. S6 z& c1 D) o; Z5 t
172) N' I' ?4 h6 O
173 8 J/ u) Y. s/ q4 ~$ ^2 _+ D174 - j1 I/ ~5 W6 o* d- G175. D, I3 g7 C# _0 m6 R$ e8 |3 J# Y0 t
176" {) O2 U( _; Y7 o
177 $ B$ F. g& r8 m, _, r178: U+ S; {4 O9 S* t
179 8 ` h3 f. @- x5 M. x180 ' i8 L% P; U% x& n) P181( a! w& a7 [4 O/ N5 U4 ?
1822 t# M" v+ b6 J4 P$ T5 P
1832 N% k0 ]* O$ m+ H& e8 x5 F
184 ) x7 z- ]8 H3 f' M* _. L1856 _3 h7 C: G! h. y. N3 W' a/ y
186 3 p }" o6 g; i+ |) A9 E1870 ^+ w! i: H4 V3 U, f; N
188 1 G/ S# D* q- e! h; b5 l: e189 % Y+ w& A# W2 ~) W190% _& r. S- f1 x0 l% K% o- ~
191 3 o# A% K* O: p' ^- O( T% l8 p5 x1924 l: j8 L; N4 W+ u
193 S6 u" V: a9 w1940 }( S) T( v( E
1956 I& p6 f4 \% m: M
196 1 H; u: q+ _7 I! a; p! `+ B2 j197# K* y* Y! n7 k; B
1983 w3 V$ R- R) u- n) v
199 , q2 U% s. C; u( t( O200; Q+ w4 Z. K9 |8 m2 K2 z1 |" n
2012 w7 W& J7 t- q# n2 N) M" A0 Y
202 2 o( o& j# t! h/ `0 A' e( w) g203, }# N) N* G2 l
204 ^/ h/ h1 e& z6 y% N8 t$ Q+ X205) K' F, i+ U; ?
206 " v$ v8 B% `& N" E' a207, W' I, r6 h' [/ N
208 7 R. v3 F6 q4 [( g2 A209' j( j( w! N4 L2 B: a `' ^
210: [5 j) [( R' n
211 % }8 e5 q1 q' \2120 T+ c1 o1 f+ z8 }! E
213% _; e. K4 Z7 ?5 c! t& f+ R
2145 k0 `! Y# ]1 Q2 t
215 * l+ w( z) \' ~216 , x" P9 n. P+ z( b% \' C1 x1 E217 ( x; I8 d* y$ q, O: h ~$ c2188 p- ?" m1 W( X' U# A+ t! N: T
219 3 Y& \( }# s1 y" |3 |220 3 T3 ^' n! W3 j6 @221 % L$ `! P5 J4 ~7 j2 G7 R% g9 f2225 O/ Y$ Y! h4 f# e* G, {
2234 y, }; E, r/ `, {
224 0 {# h6 Q8 i1 K& s7 z225, @# [+ G4 @9 H e2 R$ v2 [& G& Q e
226/ h- }* K8 N0 y8 k
227 2 n, X$ z* @6 x" Z' X4 Q228$ {0 I `0 E0 N! f; ^6 L
229& J0 b* u; X0 h1 r7 ^7 |1 X7 u: Q! F
230 / \ C+ i) Z" u231 6 E V8 T; T( z# H0 a8 E, Q232, N* v) T1 p3 u8 v: ^3 o
233- d, C6 g( I0 A9 }( N
234 ( D v" Z8 V; L1 X! A235 6 Q1 u- y7 v' O. Z236 V5 [8 d$ f) b3 |6 O* `) ?
237 * ]) b) ^5 }! E9 G& l238 * m- d$ z2 k0 [0 c: G239 . S, y, Q( v3 a' K! {1 ?3 O# I* ^! Z240$ k; q. f2 ~7 i4 \/ U. R
2418 J2 @6 \) j4 P7 L) I9 }
242 ' D c1 O6 m0 B243& i z4 M4 ^. m& o3 e
244 0 T! g7 X7 j# _; F. d2452 c, x% r9 K% ^1 h3 {* B8 L, x
246 ( D. M% y2 O4 |/ N- Y247 6 `8 S+ F ]. D/ M% L/ i248 W9 N0 i, i( x/ @249 $ G5 R: T0 J j. e250 ! l) E- ?/ Y. A% \: J; N$ F2 O251% K' F# ?6 u8 T" r5 y
252 * a! T. o, Y6 U! n0 l1 j253 1 q- |* t6 j# q( v254$ D; _* u; I2 _; H4 c/ I/ u7 o3 h
255 % H3 ^7 c) ^& q5 k6 p256 a8 T G0 \. s2 m5 A& Z7 _1 l257, o% s8 e/ p$ D6 ~
258 ; V$ {8 y* s, Y" o/ d2596 b- G9 S3 T" Z8 z. l% c' f. {
260 6 w s/ X8 E* ~& h% o: O U/ n261+ I3 l8 E$ w( [5 ^! R2 ]
262 6 M D; t% Q7 f9 C- l# ?# ~263; e$ G6 H1 |5 T4 Y& X, \% G
264 ( G! G2 ^/ S s5 G1 K, U* [' `. t' P265 * Z! t& C1 q2 F2668 l( N$ S% z' a3 Q. f: Q
2679 o7 |3 T8 c8 @: @& m' C( j
268 # `$ n/ d2 i. }# p7 u9 O269 % o9 i6 B8 w# r" r( g6 x270 2 \8 u6 J8 E, a# c271 ; R& K; C. W0 g2725 W/ r" S2 R+ N+ _# ]: J0 {) `
273 4 X C$ c F6 Q, P- f274" v" N: }& z. e `
275: y( ]$ Y# o3 P2 h) k/ E ?# l
2761 ]+ Z3 B4 [1 }$ Z
2775 ?4 T W6 [- p% z( ]) U
278* n( C5 x2 f$ B% @% d' ]7 [! U- h
279 4 q; l" G# Q- q, y! j280 7 a6 z; k' b) {4 l: q281 ( u: h2 |0 Q# D+ f# F9 f; `# J282 2 r4 [& l8 ], R" z7 b; c' }" g/ b283" n. W: s1 ]3 `0 C2 z
284 4 ~0 ]2 z2 y% Y S6 G/ ]4 i9 `* a285 ) d; B5 Q r6 ?286 7 W6 ?5 k2 |/ D$ R287* ]! x; ]5 j9 {
288; ^) a5 Z: _' X/ ]
289- o& u1 Z. b8 {
2903 F5 b' Z1 ]& R0 u; v1 B4 C4 d' g* T
291 : T0 h r# [% T: z N8 w! N292 : p. Z5 S5 `! {: b+ s2932 t3 R7 r! n& G+ B7 a. w
294$ Q5 D" P. C, Z2 ?3 @: v' m. G
2954 Z C6 E6 a% f
296 & m/ [% k0 |0 Y; _# m297/ K }' W4 Q6 g$ h+ [
298! r; Z* I) W3 p! {
2992 D* z3 n4 L2 P: f5 Q
3005 I0 ^' O$ Y1 ^ V8 W( W1 T
301" r3 _* V) @$ F8 z
302 ; B0 z4 d4 Q/ j* L( [ t+ P- ^303 1 _( X# @. ]+ s0 C304 # t |- b& e6 R% G) W' J305 " g+ f$ w0 L( Y) n! p1 H" y306 7 x+ }' d7 g! q. i3 b3079 a- h! D S# ]4 B/ p
308 1 D0 e0 s) s. M3096 w% c" r/ w5 Z5 B& u3 }" o0 M
310 ) ? C- \4 Q0 X; z+ t4 ^311 9 g+ v- W8 [( M1 ^# T1 Y$ n8 a312 : z- j! @6 v6 r0 j313+ Z3 C( D8 m6 M- o2 h: g. v
314! B5 T. f8 f: y
315 5 b0 @; ]) @5 [5 B316 - O8 l( r# J% q5 ^317. k% ^/ q/ e5 _* k8 O7 B* I
318 2 K& i, l3 [( `" V$ y" k/ G5 h319# |& m. F- _* k. |9 c
320 0 Q4 q5 x; j1 o, H$ ^ p8 J321# Q, W f$ W' Y) `) D
322 5 D b. z8 C, N; j9 u323 + o& f* ~, w1 O5 a# x! H" `324 : [0 n x5 t' p( [! L325 6 ^; u, [# }5 ^$ P$ ?326 9 F! J9 R2 G$ p, w" Q0 A3279 h& T8 y: Y/ q5 N7 V% _2 O4 [
328+ w M! @0 M* }6 X& @" R
329$ w3 v0 F9 C6 N6 n
330 ( P# x$ V+ D/ Q& Z9 W3314 r5 k, i; K2 ~" Y- \5 B
332 : N; {! v$ L$ ^1 U+ t- P4 |333 3 m# N. c' T8 [9 ?0 p334 6 w* n$ @' A& R2 p335 U$ M7 i$ e% Y$ [* }2 E3366 m7 |- d) M2 M/ e! H3 p' ^( G; o; P
337. K$ U3 c' N# U- t; S5 V
338 2 y" X: j7 }! X1 n; W339 % l# {9 N5 L9 g7 H+ f" B4 C P340 & p& W! I! j: J7 e& a2 `5 {0 ]341 5 g" E y* B, u* Q) Q2 ]3424 w8 U; Q' H8 T# `, {& x! m) H
343% n8 r4 n7 u) ~/ A8 f3 H! h( N
344# E$ w I3 e, {. m4 G. k. X
3455 ^- g, t% z# P, {% @9 I
346+ _+ J% t! _8 r+ G0 H$ Y3 B6 k
347' Y2 h. x! q) x
348 - x7 w: {( V8 {5 b3 W$ F7 H: C3490 q# N7 }1 t4 u; i
350, P, O7 a$ z& l5 X8 U- c+ o
351$ L6 ?' \6 D9 _% {; {; I4 d
352 + @8 k2 V9 T8 x& ?- d) V/ B353: t t. n9 ]; }- {
354 . n; W/ D. ^% P2 j g- D355: n, Q8 x* P: Y. `6 `2 |6 Y& r
356- h- t! z! u! V% x( `4 n
357# U/ L$ J6 y1 L; V( Y# u
358) L" z# L6 ?/ G5 X& S
359 3 }. ~3 z7 Y) ^360 9 ]! [: z8 c, l# K% d6 c3617 D) T9 Z! R/ I. L E5 }$ ?2 p7 s- [, ~7 c
362 ' K3 X- L! O3 Y# R2 g: \+ f( o W363 * W/ n4 [: i- K364 9 ?$ [; |* Y5 @; V8 z( A365 $ f' y4 W6 Z7 b3 r2 @- f3669 P9 \0 ?4 d8 Z& Z2 X* l5 [: I5 i
367 4 O: m0 e7 ]- I9 m# S& g368! h0 N5 Q+ ?0 K3 s6 J
369# M! `$ l2 x( C! Q- S8 C$ w( k
3703 j- q4 `- R! P8 j
3712 o, \5 J& g: N4 p
372 6 e6 A- Y0 h% o6 z373 $ M1 ?8 ~- J% _- m# S3747 ]( r+ x# M2 J& K( M2 @. w
375 * g j1 S( ^% P$ d( B# K' t" c376, }+ \2 T; }$ D$ T
3776 G# Q0 h/ k" k: G9 I/ @' T2 A+ n% y7 b
378 ; | L+ p. V$ C8 y3 u379 & ~4 E3 y3 a$ _! L, U( v1 J' @( y380 . X! X: s \" H/ h2 |1 l381: N7 O' c& C* @. P9 h( E ^
3826 c8 S C3 H7 L, l- Y* \
383$ B" v D1 k( m2 O
3844 W5 x! i# H/ p* M
385. G% _" V$ \! k1 K- m/ e
386 . T/ x# n0 v/ r+ T387* ~8 x3 L4 P. ^% J
388" |6 H7 i ~! \9 K
3890 q1 C6 Y$ D0 {+ X9 g$ c( w
390 # u/ V" v. o1 b# p4 Y! n391 6 i; Y: ?. ~% X$ @$ h392 $ J/ I9 f% {; i, s* n# y393% @8 X' L- i6 X( j
394 6 M% g4 R9 N3 Y9 U; P$ h395: F7 X+ ?& C* Z% N4 |: G. w0 ^5 Q; v
396 1 Y( R9 {2 {# [. W0 x4 V397 / t! C2 H' F, p+ K$ k! s# E7 y9 s" L398 8 v0 P7 @- C* R6 P( I3 |399 ' S( Y$ n0 @+ x4007 _9 n6 Z* ^2 D2 c' Q
401 $ I+ T' C7 `! ~2 L+ x402: t/ \5 O' p% \7 m3 l
403 ; z% o9 l: \: n404 : F- \. o4 b8 C( C, E405 ; f* w5 ?6 k/ {2 b6 J1 z4 k406 / _5 _" x; u, A. B2 [407" J* e9 w/ b% n" ?9 r
408+ G3 e# i# L3 P; C- T
409 7 U! C1 ~. v% I' B; A410' m) T* ]3 c2 t. t9 d/ Q- c
411 ! ]: C9 v% s. S4 O+ u7 R412) l$ {9 J/ o! ^- X4 I# K
413 ) M) Q+ m; f# i8 L8 A; f% @414 8 \& z8 m4 w- D0 F! q415" ^1 d2 t& ~" f) o6 C5 A( d
416 m: G) ]$ e9 m; t: t5 g
417 . U' Z2 S- s) P- A5 E4187 S7 q% @/ R Z [; O3 H& l. I
419 - k; Q: E3 [- ^& T% G' x4200 J. W. }4 q- D
421 - ` i- K! t1 z' R422 R! R! W4 A- D6 U423$ ]1 o/ f' C3 h
424 0 X m0 W; u; y; P( o3 H1 _) E8 Z425, W; s8 O* B) E
4268 R$ X7 g) b2 V" n
427 ) n, \3 S- Z& p+ m) n428 / [8 s8 a7 H+ w* X8 ~/ d, h3 _+ a4297 a4 `! y& h- A/ L3 r3 d6 s. I$ m R
430 . m/ R: ?: Y" ^431 9 r% O- p, S1 e* H* x1 V* t432! f7 x$ b) l9 U. x# u
433 3 q5 {9 b. w8 \3 I/ N4 D434 1 E& l! v0 U3 E/ p+ x1 w' u! K6 B435 1 K, h+ M+ V5 @9 P) T6 m' d436 $ N+ x6 ^* \% A* w$ R437% b T! R, h; `9 h4 |- Y4 N$ F8 C
438 1 A9 T% Q# i1 S! r; @4 ?( |4399 D" r1 Z: L" w$ |& D
440 z+ D6 C8 E1 M2 e" h441 # P9 V, `, x+ H442+ Y7 O# b- R/ l4 w, c2 u) g
443/ g! B" Y- F0 k. }( a/ R
444 ; s' f4 G% H. A" D# {445 % v$ b) B) g0 g( s4468 `, E3 Z6 c5 |7 a+ U
4472 _+ o0 Y7 M( i4 g: u
448 * Y( J/ [1 x! P ?449 $ k. J% J4 K( ^2 {/ ?450 # E1 ` h) F. ]" m451 / ]* h8 E. a2 R452 7 g7 D% Q' K) j& _% S, y453 " ^' y% s6 d% ^. c+ q6 f454 5 K# h/ u% l4 G# c: ?455 8 h) c/ c/ ~1 `1 x6 R7 x456, @4 @! n; L# V7 n+ e7 m/ C3 J
4576 ~' _, l* a5 w( }" W
458, f2 Q- P% X) T, S
4595 n* R) ^9 L, L7 {
4606 s7 [$ w8 T" G8 c
461 ; z# y8 k* o. I* \462 * v' y2 B% R) l$ ]! z* o/ J4639 K4 m2 D% I: q) F1 ?( c
464 0 K. b% C3 `( j$ g/ I; k2 g& I, W465 % b N J* c4 U9 q: D1 r! M: B466 : y, y% X6 Q+ { V S. M* M467 3 M4 L4 r3 p1 @+ G( l# Z R) N468 - t" Z3 S G K9 i7 Y2 J469 7 ?8 u& ]) V' t# w$ _; Z2 b, d4705 c5 b0 a; f" {+ t* G
471 . s3 r" ^! @4 S5 s* q; N/ Q472 , ]( K$ g% C5 h. m4730 D9 @ Z f0 E, M
474 1 k" d- K0 D8 G+ V) a( t3 {4751 m, K1 m+ B2 _" x/ N R( h$ H8 F
476) s) W3 ?: x2 X, J M$ i
9 E6 \2 I+ z8 J& |! l& ]+ C8 t( s0 T( r
+ I% a# b( R6 `# V( H2 E) I 4 p6 M/ i; P! s4 z# c& z; d! W1 l, y+ R 7 S# L I/ [, O _; |/ W7 @3 h( x# k) u$ o" C; a
# ^6 z9 H4 L6 F" _
% Z+ y6 {6 N' `$ N: l6 s , m5 l# z/ y5 ^& y; ^ 4 m e. c; o4 C5 D) e9 k: }& ~/ u ~# Q
, W" K; E& y( ?) s
8 c0 U) @; P6 p4 {; u