. F2 d; T i' E2 ]6 ]# 数据库连接依赖7 w4 A1 g7 F# ]* K" j
def get_db():6 ?( `* D% W: Z8 s( H
try:5 K9 O, s3 O/ W+ V Y- }: s
db = SessionLocal()4 d8 j4 U6 {4 w6 d
yield db: Y; e- Z: m9 z: V% [/ H q% S6 i
finally: * a, ?# x5 F6 l db.close() 3 z( E1 Y" }- l: T! C7 M $ }+ y# x8 v" L& g# a; U " m2 o k6 ?. i- X@app.get( , B5 i- g+ `/ R "/bilibilivideos/", 6 b6 S1 Y. E; X9 [ response_model=List[schemas.BilibiliVideo], / h; s! t" @7 E2 A- b- F tags=['bilibili视频评论语料库数据接口'] 2 h. n- v! \1 s0 N8 k- K$ s* l! z) L)1 L. E- k. @4 ]5 I8 Y) s: ?
def get_bilibili_videos(db: Session = Depends(get_db)):) H" d% Y7 ^4 J2 v
db_videos = crud.get_bilibili_videos(db) 8 V: A$ Q. L3 q. [& W( t return db_videos # n( i# m, O2 M( A+ S6 s# U4 y- w $ c9 J7 R8 X1 @! l' G8 R( E7 c7 i* A
@app.get(5 q' H, Y- U8 U6 z. P$ @
"/bilibilivideos/{vid}/", ) e# C/ K7 h8 z/ u9 X response_model=schemas.BilibiliVideo, , `& v* l9 ?3 }% g3 ^ tags=['bilibili视频评论语料库数据接口']/ W" x" ^& I7 a3 t" A* z a* n
) 1 Q1 a# a- V! N! ddef get_bilibili_videos_by_vid(vid: int, db: Session = Depends(get_db)): # }* J3 ~9 X) ^' C/ u0 v6 K4 W db_video = crud.get_bilibili_videos_by_vid(vid, db): f) S. l* ~) \/ i. h+ z
return db_video ( a$ E7 }" i/ u0 E; `: Q9 w z. h X; a. e
2 c$ o* z9 ^5 y2 o5 l5 L4 V
@app.get(+ E. ~3 I: M$ K) l5 L
"/bilibilivideos/{vid}/comments/",4 u3 ^, P/ K# U) w3 {# G( p% B
response_model=List[schemas.BilibiliVideoComment], - A7 S9 R" E q+ ?. ` g) f: | tags=['bilibili视频评论语料库数据接口']1 J! I! @, G. [( r
) 1 }" t" T" c4 m' n- ], N9 }def get_bilibili_video_comments_by_vid(vid: int, db: Session = Depends(get_db)):7 o! x$ O* ?& E2 b) M$ l
db_comments = crud.get_bilibili_video_comments_by_vid(vid, db) ! d' J& p! F8 [! L+ A- ?; L$ x' G, _: ] return db_comments' C. e5 w9 E) s8 D6 p- ~+ f
8 T' @& c6 s. Y+ {6 j& |6 m/ @2 T2 s* L0 c
@app.get( 5 y% a* a1 p/ f; ^. V% \3 Q n' D2 e j "/onlineShoppingReviews/", $ ^, s8 k" v H9 b2 q+ `( ^ response_model=List[schemas.OnlineShoppingReview], - e' a5 K! D' D tags=['电商购物评价语料库数据接口']- Q0 S( Q6 M: }" q, X9 S4 R
) % z6 ]( q% \; S! _7 M# M8 j" sdef get_online_shopping_reviews(db: Session = Depends(get_db)): 6 W- J- f S2 P9 N db_reviews = crud.get_online_shopping_reviews(db)" v6 C+ N3 N. A7 x6 s) y9 z8 Y x
return db_reviews I$ n2 o- M% a# N+ v7 {3 X 8 }5 A: h* K! ~4 Y+ ` ( c8 a! W% W+ {@app.get( |! Y' r! |; ~0 W
"/takeawayReviews/",1 A$ N" h$ c8 ?# |6 I* p {
response_model=List[schemas.TakeawayReview], / r1 z* D( ]) R3 g9 M& K6 C tags=['外卖评价语料库数据接口'] ( ]) N( { g* Y' h t) 2 ?7 ~: g+ V- jdef get_takeaway_reviews(db: Session = Depends(get_db)): 2 a9 d2 N8 k( `! O/ o" d' i4 i db_reviews = crud.get_takeaway_reviews(db) ( x) }- a7 ~. E8 T9 f return db_reviews ' W+ ]2 t1 X' R& j2 ~2 U& r 3 ^( A2 C9 N4 X7 [" \ / ?) m2 c3 Z% @0 |@app.get(3 v. O$ D! q: P* y4 c8 ]8 D. H
"/chineseLyrics/",$ _$ j0 A8 H* P# s
response_model=List[schemas.ChineseLyrics], . D. R% s: N1 ^+ T! |% q$ y tags=['中文歌歌词语料库数据接口']) a/ n4 I, z4 R: z$ \; [
) " c- v& p- G) T x* X3 R. Gdef get_chinese_lyrics(db: Session = Depends(get_db)):' ?; |. ?4 F' x! m9 o. d
db_reviews = crud.get_chinese_lyrics(db)8 A2 ^% X) C# J0 W& T
return db_reviews1 j) @' H7 M! @8 |$ A- n8 ]" A* Z
2 P ?' ~) c- ^" c % f: k% s O) n: b2 A, j7 a+ y@app.get(8 f. v9 @# A! T. A- P' x: e
"/COVID19News/", , ]( A ^7 c6 ~. {- q4 N. ? response_model=List[schemas.COVID19News], P; n0 V/ w4 h tags=['新冠病毒新闻语料库数据接口'] ) ^, P4 l& ?0 M& R, {+ o ?+ m) F' q1 V5 m* O! Zdef get_COVID19_news(db: Session = Depends(get_db)):* ~6 g2 m0 ^, b. c- o
db_reviews = crud.get_COVID19_news(db)( @, f8 v$ G& e. |1 d( k% Y5 Y
return db_reviews ) J# y; B$ C" Q" b' c ~8 i; W8 p: S: ] m5 R$ V
3 D, _6 q# E2 ]: B
# 为每个用户设置uuid标识符,并存入Cookie% K* d3 G) p, R
def create_user_uuid_and_set_cookie(response: Response):6 F% y' ^$ [; {! C& U# A
user_uuid = str(uuid.uuid1()) 4 m( D- ~- F7 v7 m0 g( E response.set_cookie(key="user_uuid", value=user_uuid) $ I+ c A& N% B# G" ~ return user_uuid$ K2 c( X3 M/ Z: H; N: l* p% K% J
: A# J9 W8 W& I; r" ]% F! @8 R: D0 ~/ \$ R# W) m
@app.post( 3 z0 b' T( V8 ^% U "/calculate/preprocessing/", 9 s1 g; W+ I/ w3 a7 _ tags=["计算模块数据接口"]6 U2 W+ f' x. [! R& l- B" f+ t
): Y' T2 U4 o" w+ ?
async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams, 0 z; }" v! p k' N+ |6 F1 u background_task: BackgroundTasks,6 q" Q+ C2 h; e8 O
response: Response,6 W5 ?' n1 p6 B; `1 y, [
user_uuid: str = Cookie(None)):' i# @, n, r* I7 C& W1 C
if not user_uuid: u/ H+ N" e0 W5 C
user_uuid = create_user_uuid_and_set_cookie(response)& R5 ^* P1 o b& ?1 Q& P5 u
+ r0 B8 B) j4 j# g# ]
global topic_model_training_tasks + J& n" s. P# H% w* J task = TopicModelTrainingTask(text_preprocessing_params) # V! O# `: c9 p1 A topic_model_training_tasks[user_uuid] = task * Z2 [4 P. x- M' U( L* D1 j7 G1 [. O# R/ L! n. s6 \, I5 u3 C, k: k( ?
background_task.add_task(task.preprocessing) 9 Q# x( E3 P5 n# T% R; p" B$ } return {"message": "已添加文本预处理后台任务"} 8 C! [4 _' P% [/ d. A: |( H: C" Y1 w5 q# {8 m; e3 r5 t) T
@" g0 q: \# p( P/ j
@app.post( - B1 s9 k6 }; ~' V! H "/calculate/nmftraining/",! Z# @3 ~$ [0 P9 [
tags=["计算模块数据接口"]: j4 I+ P* E! u9 x
) + U3 c4 x/ r' basync def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams, ! i' m# Y6 J) P# H/ Z background_task: BackgroundTasks, $ D O" Z3 x H/ e4 \ V$ b response: Response,7 U6 g5 ], U+ t& ~0 z# N' }. W2 D/ Y
user_uuid: str = Cookie(None)):2 n( A4 K5 h8 G8 p
if not user_uuid: Q' V" _ N3 d user_uuid = create_user_uuid_and_set_cookie(response) $ x" ?& E! E+ D7 P% d8 F9 F0 O ! q9 Y' R' n& }& m3 \ global topic_model_training_tasks 7 d. [6 T% h* E. n j) p; a# ~1 k1 G ?* l# X" T if user_uuid and user_uuid in topic_model_training_tasks: ! C5 F s5 F6 U% N5 Z& \ task = topic_model_training_tasks[user_uuid] 7 p0 ]' a3 q/ o( g6 t1 y9 L if task.text_preprocessing_progress.status_code == 2: 8 w5 d7 g# X' J$ h! e background_task.add_task(task.nmf_training, nmf_training_params) % q% Y# S1 x$ C% a2 Q3 M( H* D return {"message": "已添加NMF主题模型训练后台任务"}$ Z+ b3 h0 S* J9 s7 ?3 x
else: - G- b- H% A7 S. a6 }5 } raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")8 i9 X1 G u5 v% }
else: & U# Z7 e. S* s1 z1 z1 U' i raise HTTPException(status_code=404, detail="未找到相应的训练对象!")* X( ~3 p7 R. K, J3 t' C3 [
6 P0 }( i0 J' C- e$ _3 X# g8 y0 \! z6 K' g, q& B, {1 ^: f8 ?
@app.get( 7 t( ^2 t* r$ o! m "/calculate/nmftraining/keywordsearch/", ( ]- V0 R6 P$ x& H response_model=KeywordSearchResult, ) {: J) n0 L" d, w: {' O tags=["用户交互"] ; d% k: G* W$ A. L1 Y) / f# P: t7 @& N" p5 G; Basync def search_keyword(search_text: str, ' T: E% X% w8 E% q6 T response: Response, 4 b8 P ~2 n2 J3 Y; }0 F user_uuid: str = Cookie(None)):9 o+ Y4 g$ m' m# Q- _8 L
if not user_uuid:6 s' Y* I9 R: C) a
user_uuid = create_user_uuid_and_set_cookie(response) 3 [1 I+ w) ?5 V# r4 } U$ `" d2 a/ O; P$ Y- P( \6 K
global topic_model_training_tasks/ ]1 {: Z& w3 P) `
# V) W( H3 g, @; g$ @) }# U
if user_uuid and user_uuid in topic_model_training_tasks:9 _& P4 Z2 B M- G9 p* F0 K
task = topic_model_training_tasks[user_uuid]2 w% B t0 ^) [! S7 Y4 g
if task.text_preprocessing_progress.status_code == 2:; l7 u* {0 [+ ^9 c, v# l1 h* T# I
search_text = search_text.lower() 3 W9 Q) i' s0 {( X8 l bag_words = task.text_preprocessing.bagWords 4 i0 T2 {6 X; ^: |- g0 Q keyword_search_result = KeywordSearchResult()9 \5 L; i* R: ?* l
for wi, word in enumerate(bag_words): 3 ?6 |: ? s7 O9 H, _7 ^7 `: O if search_text in word: ( F. q: O. W, Y d+ K1 R" B keyword_search_result.word_id_list.append(wi)$ b4 z0 a; |/ {0 W; r& e" v
keyword_search_result.word_list.append(word) ' q$ r9 ~- t" w# a return keyword_search_result ; u1 i% N* |( {9 J/ R8 h else:, ^0 X) v- q/ L
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")2 m! l* e0 Q" p# [2 I7 r8 c
else: - N3 X1 W1 X: c, o. n raise HTTPException(status_code=404, detail="未找到相应的训练对象!")3 o; L' _6 r# }# l8 m( P( e' w
/ s e. M$ x# x4 H# O
. w! d( X$ d. w) k$ v9 w@app.post( 3 b* N5 o3 V/ c0 P; M6 t r9 w) d "/calculate/nmftraining/topickeywordoptimization/", ( x9 `" l1 m: ~; m# o8 P. R tags=["用户交互"] ) f1 M4 T' T2 {. a$ d) - z& u/ x# I. R: d% r! X: Lasync def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams,; S8 z" j+ h# b& Q* c2 o1 o
background_task: BackgroundTasks, 4 F" D; ]+ d" G# v: Z response: Response,$ T5 S8 S5 ]( \8 J! T
user_uuid: str = Cookie(None)):$ z1 [' i' @7 c, b
if not user_uuid: 4 x# x! M2 y. H8 h9 j) q: V user_uuid = create_user_uuid_and_set_cookie(response)7 w) |5 A& o! ^- {1 \5 V
. |% Z0 z& x2 v5 z' \ global topic_model_training_tasks # d8 i" @2 w$ T/ R. _; b, v+ f m3 P1 E6 t! g0 D
if user_uuid and user_uuid in topic_model_training_tasks: 8 P- [+ p- q; l w task = topic_model_training_tasks[user_uuid] " j/ F! @+ X! g) q+ ?5 `9 A7 D- _ if task.nmf_training_progress.status_code == 2: N2 {+ \8 q, R' V7 K$ |
background_task.add_task(task.topic_keyword_optimization, tko_params) % r, E f7 S0 t' g* S4 ` return {"message": "已添加主题关键词优化后台任务"} + o" f' e: v. @ else: 2 l8 o$ j# `1 F/ z- H6 t raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") * O) J& D# r7 |$ L, W. Q5 q# ^3 a else: 2 u' E5 V* N! w- R+ f; L raise HTTPException(status_code=404, detail="未找到相应的训练对象!")6 U% v4 o1 F" G, K
$ _8 b2 C4 j& u/ i U; O' w+ X8 z6 {4 z4 U; ]' n5 U# b
@app.post( % X8 W) K2 c2 P4 ^, g "/calculate/nmftraining/topicsplit/",6 V' y$ B9 W. X4 @% v
tags=["用户交互"]6 C% @# B3 w/ D- r
)5 G) Z" z# l( J6 G! G- S
async def run_topic_split_task(ts_params: TopicSplitParams,# |4 O% f: ]2 l+ x- i! O( _) X9 R
background_task: BackgroundTasks, / t+ p/ j9 y3 P, ^0 y( v& W response: Response, 7 C. E: i! l" ] user_uuid: str = Cookie(None)): , p: B5 m* m6 K8 m. I if not user_uuid:3 l& V3 P; Y/ H7 H; M3 g4 c* N2 d
user_uuid = create_user_uuid_and_set_cookie(response)8 Q2 U3 p0 q; Q
% v1 P) \- \' Y" M) M3 c
global topic_model_training_tasks " V( O% j* T+ d7 e( f1 q' c7 l: I, ]% f$ ^$ t
if user_uuid and user_uuid in topic_model_training_tasks:& b# O9 [! E* K+ P& u$ @6 V, j! g
task = topic_model_training_tasks[user_uuid] " ?6 o8 v0 S; E) u9 H7 ^+ P1 Q) | if task.nmf_training_progress.status_code == 2:) N/ j! a1 W! X
background_task.add_task(task.topic_split, ts_params) ' q' Y, S: g4 J* x return {"message": "已添加主题拆分后台任务"} & A' @" {: a' H; L9 ` else: , j2 r6 \, A0 V- t raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") , q" e/ C; ~: e7 p: ]- [ else: : w# w8 t# s1 g- h raise HTTPException(status_code=404, detail="未找到相应的训练对象!")# E& i. t( b0 w6 F. |0 X6 Q
, P: J# k" ?6 Q' q7 s4 f0 t1 ]. j. [5 o
- o% ~, ~: F3 M@app.post(1 ^( [+ T/ N% c d1 h/ @' T% j& ~
"/calculate/nmftraining/topicmerge/", " A0 P- X0 n% c/ d tags=["用户交互"] `! e) m9 L, o
)1 I! r: z7 L$ c2 r* [
async def run_topic_merge_task(tm_params: TopicMergeParams, $ k4 y2 p8 ]; ^ background_task: BackgroundTasks, & H! a" ]" T' ?. k5 K" g5 ~8 S response: Response, p" |: t+ t4 j/ v! Y' v user_uuid: str = Cookie(None)): 4 d! m( O! H) m! z' H/ s if not user_uuid: ! Y8 _; u2 u* }. P user_uuid = create_user_uuid_and_set_cookie(response) . h5 l z1 m. P9 F ) U d' s' j, b0 K global topic_model_training_tasks( |7 V" I/ f$ Q
, V8 _5 v0 W" Y F& a: s if user_uuid and user_uuid in topic_model_training_tasks:& V6 g' r. X9 b$ ?
task = topic_model_training_tasks[user_uuid] 3 O9 X9 K& H) n$ ] if task.nmf_training_progress.status_code == 2:6 Y T6 J( M& m
background_task.add_task(task.topic_merge, tm_params)7 H0 M1 U% ]( g- G, ?( d
return {"message": "已添加主题合并后台任务"} 2 T9 S7 a7 T' |7 B/ Y else: & H7 [* q1 x2 ^+ t- P0 @ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")2 k$ r3 C8 n% J" L" B
else: 7 r. j9 x6 K: z raise HTTPException(status_code=404, detail="未找到相应的训练对象!") , W* F I# T2 }. J; F/ Q0 v- j" w2 [4 K* C( a
2 e7 V( x: x* F/ A. s8 G3 _& b@app.post(( A4 h! {+ h6 |/ U3 l, o
"/calculate/nmftraining/keywordinducedtopiccreate/",( m5 D* w+ t X' b4 U! q* i2 I9 F
tags=["用户交互"]% b7 Z: ]4 i, j6 L. m9 y
) }) K( Y7 I7 ^# f
async def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams,. k, u# ?% Z+ K3 g2 g/ g
background_task: BackgroundTasks, 3 J4 t$ i# l3 T! w& U3 F6 h: S response: Response,, m' V. s2 k/ r1 A4 D8 A4 R
user_uuid: str = Cookie(None)): # C' O ~) z! n ?2 m3 p: Z2 g9 g if not user_uuid: 6 h5 @7 [, A& l user_uuid = create_user_uuid_and_set_cookie(response) . B1 m4 w1 a! o/ Q& d + J6 E4 K: f4 ?4 V, u global topic_model_training_tasks: w$ \8 e" M5 }
5 B8 _' }/ u/ R% {# [0 i# L0 D
if user_uuid and user_uuid in topic_model_training_tasks: % H$ e6 u% p; H% g H task = topic_model_training_tasks[user_uuid] 1 d& R: J- Q$ J if task.nmf_training_progress.status_code == 2: 5 j" W" k/ \9 y( d background_task.add_task(task.keyword_induced_topic_create, kitc_params)' J8 [+ w/ m" U; S1 ]6 ?
return {"message": "已添加关键词诱导主题创建后台任务"}. Y! R: n; c) ?1 ~
else:" D1 b8 e9 q4 N! E3 V
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")) Q, ]. i9 d% Q# ^
else:! B* }& Q; w3 I
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ]( a* o( f0 B4 z5 A# k 7 C' X# t5 e$ t- U; C " s6 d: v/ n# ^8 b@app.post( , a* [% D5 A3 x+ [ "/calculate/nmftraining/documentinducedtopiccreate/", " y0 i3 Q- P: i% c) o. O tags=["用户交互"]4 s! L3 @/ x' Z
), h* W; O- h3 |, y2 F5 |4 g
async def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams,7 |% t) l+ K" k
background_task: BackgroundTasks, 7 N8 \# `$ V# j! ^9 ~& h response: Response,6 {7 z# d$ g; |& U2 b9 _
user_uuid: str = Cookie(None)):/ c/ T1 _" I4 q: q3 w& o4 ]! V
if not user_uuid: ! b; D2 v) b. a& ^ _ user_uuid = create_user_uuid_and_set_cookie(response) ) X$ N( Q; E( M 5 z; F [" [; }, |$ z5 J0 E global topic_model_training_tasks8 n& u6 U) k1 l1 J4 T3 [% @
+ r8 J1 G& n; ]# z. _5 ]* L if user_uuid and user_uuid in topic_model_training_tasks:3 k( @0 j4 g/ c7 C, z
task = topic_model_training_tasks[user_uuid]3 ^! e3 ?8 C" G1 \
if task.nmf_training_progress.status_code == 2:2 C, d8 h& j' B) Z# ^& M2 S& _
background_task.add_task(task.document_induced_topic_create, ditc_params)$ m0 D B+ h4 L3 W
return {"message": "已添加文档诱导主题创建后台任务"} % g3 d$ J) p& y/ g$ J else:" s8 l* u. ^) n. @
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ) ^: o' m" [1 m6 [, ~ else:+ w, A( y. Y3 g; e9 n
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")" x r& t+ z& R: d: ^! R' p
6 ~( O- F- V5 [1 i
; J: }2 r0 j# N: q& s" Z. o$ i@app.get( . {9 t3 A# B! q) F8 ] "/calculate/nmftraining/newdoctopicdistributionpredict/", , K1 q _; n g" [. ] tags=["主题预测"] 9 L+ p! z- k$ A& l' T' e0 H. G; B)8 E7 h0 O, p0 x2 ?0 N& d
async def run_new_document_topic_distribution_predict_task( $ a$ }. M8 M% G; J) u( }$ U! x new_doc_text: str, 3 Y3 M/ o2 s9 b( y background_task: BackgroundTasks,6 c, y/ o3 N) G/ k6 O
response: Response, , Y* A, s$ { ~* { p0 [2 ] user_uuid: str = Cookie(None)): ( y4 m- N5 L& l# | if not user_uuid:0 t0 {4 K( ?' h' H( j2 {+ ~
user_uuid = create_user_uuid_and_set_cookie(response) $ F5 g" h! {; P2 u% E- {. x , y, c1 q$ d% o global topic_model_training_tasks 6 i5 @% L% m1 ?7 F3 }3 N6 ]6 ^' l! s- k* [& r& W4 Q4 p- L
if user_uuid and user_uuid in topic_model_training_tasks:9 c/ Z( l/ l4 h. @
task = topic_model_training_tasks[user_uuid]% C% S8 G# `! d z
if task.nmf_training_progress.status_code == 2:1 h; @; R; c/ V9 N
background_task.add_task( ( M* Z8 y4 O$ s4 m$ g! K: ~ task.new_doc_topic_distribution_predict, ) t# m1 l/ w; {2 u1 } new_doc_text9 D* u$ W( o6 E7 a! ^8 z
)- e1 O# _1 C. v! N* Q
return {"message": "已添加新文档主题分布预测后台任务"} : d) F$ ?8 }% J5 p; I2 O else: ! S6 ~- x" R# e raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"). a8 A* D6 _. C- U( j; R
else:" j. M, \ m5 m( N2 k% O7 ^
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 9 \: H( M# v5 N3 ] ; `$ |. D$ h( U* C& z, t1 G2 C 7 l! E5 q, f8 u y, ^) A8 N@app.get( ! D3 p4 w" n9 ^# g "/calculate/preprocessing/progress/",* y5 j O; |8 _5 V( t g
tags=["计算模块数据接口"], 0 U! @" T: \8 U* ^# M response_model=TextPreprocessingProgress / a, w0 o. Z+ h% P( Z) 8 U5 K' c' ~0 R5 ~4 h3 N. Wdef get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)):3 B) a$ X) e8 a6 k. J
global topic_model_training_tasks8 P- T% Y+ ^! k# u J4 g9 a2 R9 r
0 q! N! i% A( B9 m
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):( Z4 E' @5 I/ j* B3 P
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") D7 ~. }* `5 N, v3 A& a6 Q
return topic_model_training_tasks[user_uuid].text_preprocessing_progress & z. |) {& R9 f7 }0 r: D. {( o! q# P
/ v+ I/ C( @5 \! |! R# r@app.get(( [% K5 b9 ]8 A6 [& P
"/calculate/nmftraining/progress/", $ O/ u. I% n$ O, k) T& c tags=["计算模块数据接口"], + |1 X; o( T- w* J; \' d8 J# |: V response_model=NMFTrainingProgress . Y$ [1 Z ~0 c6 p) @)' ?" \: h9 R7 |' V
def get_nmf_training_task_progress(user_uuid: str = Cookie(None)): 2 n; q. I! l9 \- a4 j global topic_model_training_tasks) v) Q) }3 O r" Y$ @3 `4 v
5 B8 l" w) u* y9 q0 Q if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ( h' ?* v" E. o! a raise HTTPException(status_code=404, detail="未找到相应的训练对象!")0 B; q) z% L4 m' V; n" b
; u& ]- b- I1 ~. Q- C4 A# s task = topic_model_training_tasks[user_uuid] % p- R% a5 _, U; V+ t if task.text_preprocessing_progress.status_code == 2:, r8 b4 v \3 t5 F/ v
return task.nmf_training_progress 8 X( i% q9 u6 p3 T( D else: w0 N* {# w/ h% y8 B7 |5 H raise HTTPException(status_code=404, detail="请先进行文本预处理任务!") 1 W3 h. h# k; x8 M2 x C 1 G8 A8 [' Q/ v" i. Z: S3 e5 n 0 K2 P. q7 a$ J$ V# T9 ?; _@app.get( ; G+ g4 {& n% I, Z* @3 h R, f* f "/calculate/umap/progress/",& ?2 w& s1 C1 ]% u* t
tags=["计算模块数据接口"],. P! x- H. u6 q
response_model=UMAPProgress " v6 X8 d- m! U0 W: w& O) ! S8 q) _5 k2 J* h1 Sdef get_umap_task_progress(user_uuid: str = Cookie(None)): 0 e2 q, z2 H" ~2 o% b+ f global topic_model_training_tasks8 X. A3 ~+ z, y6 V
j7 V) L! N1 l if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 8 P/ S5 A F. D raise HTTPException(status_code=404, detail="未找到相应的训练对象!")) i+ z7 t: f5 k9 E( |+ k
* X6 T, R. Z* K& P4 f task = topic_model_training_tasks[user_uuid] * ]9 L0 z; \6 L7 ` if task.nmf_training_progress.status_code == 2:. I' `% M: t. m9 W
return task.umap_progress # h' I- ? b* b' ^ else:5 j, |& Y# w# x+ W* M2 H
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ! b L( x8 H, G- X ]1 f, W! S* ?2 v' a$ n 8 C% `; a1 l5 l% {* u$ v@app.get( 1 O P. w! Z5 O3 l% K "/calculate/nmftraining/predict/progress/", : j7 ^* k) r& Y- `+ e tags=["计算模块数据接口"],+ i& ]( |0 w9 F& R
response_model=NewDocTopicDistributionPredictProgress X; o+ n7 T# o
)" g: Y: N. o. m5 X$ B6 y ~$ S# V* A
def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)): " c: ?$ ?# j( N$ I& ~4 ]' V global topic_model_training_tasks - Q- U* o( D$ L6 W5 k" `4 ^* [. g5 r* O" P9 W. _) b. ~: H
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): # O: c# L. M* h: N0 u raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & Q Z9 M& B' Y1 X; @ , b. o( ?. m n8 g% S8 ^ task = topic_model_training_tasks[user_uuid] + `- d& M! {0 q if task.nmf_training_progress.status_code == 2: ; M+ s- u* y0 T7 d return task.topic_distribution_predict_progress5 g3 c- g5 C; T1 E: M
else: ( E- w6 A! E+ b% A7 s+ X raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") o5 k3 D% m" P7 Y4 S# l5 ` q7 T9 m" |1 G, f2 V7 B9 A
2 a2 i- _3 T5 X@app.get( 4 X, b1 R/ C2 z) N "/calculate/details/document/",/ i! z: s0 t& k. ?7 | f' m
tags=["计算模块数据接口"],- i" g) R6 j* q& D7 d
response_model=DocumentDetails- S, \: f, I1 J+ I
)5 ^4 A# b3 B+ K0 ?
def get_document_details(doc_id: int, user_uuid: str = Cookie(None)):1 ^! v8 v# F) Q# B4 T- {
global topic_model_training_tasks2 p0 _0 C. b: u5 ? |
. m. I1 S8 u2 C! I D
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 7 d k3 H9 u( n; V4 P raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 1 ?* q7 E8 h* |5 S: g! v8 k5 W; l. H3 M" e
task = topic_model_training_tasks[user_uuid] 8 X: R% j) a0 U$ e3 B if task.nmf_training_progress.status_code == 2:9 F {6 `+ ?8 w" |( ?+ }
return task.get_document_details(doc_id)3 }' i% O9 ?& E, s# j
else: 6 v- n( _4 I4 b raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ' @3 m9 w) V2 X' s2 T" b7 |8 G+ ?7 k: w* o
" U0 Y2 w, s7 n$ x( Q: p
@app.get(- @+ E# r z: c0 H
"/calculate/details/topic/", 7 @) ]& _3 ~: y- G) r; L+ U. l tags=["计算模块数据接口"],+ @3 e6 c9 }; i7 g. Y& e' F
response_model=TopicDetails3 k; @" e" Z3 n
) : k/ L/ n' o6 p1 \def get_topic_details(topic_id: int, user_uuid: str = Cookie(None)):( g- v$ b2 }, x8 k
global topic_model_training_tasks 8 m& L9 p2 f o& Z * X9 q+ m* w: p9 t. A( o0 D if (not user_uuid) or (user_uuid not in topic_model_training_tasks):# J$ d6 M7 b8 V) l& x B
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 4 K& ~/ ^% g4 J& X# T1 T) P, c4 f3 ?2 Y1 f8 }
task = topic_model_training_tasks[user_uuid]( {: h9 [1 L- a& x; k
if task.nmf_training_progress.status_code == 2:" @0 Y" L: J- W$ h
return task.get_topic_details(topic_id)9 M0 s2 f; S6 z% g
else:1 |7 X+ q. m/ Z
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") U( K6 E7 M+ x1 ]4 A( A9 E \$ ^. C1 \
3 d, U( D" ?" ^% i; S
@app.get(7 G# G/ b- h4 ^. G
"/calculate/userinteraction/info/keyword/", ' J4 {5 \# n) n* D& x; N x tags=["计算模块数据接口"],1 }% K" m+ L- R) H. V T
response_model=TopicKeywordInfo z. _6 B: N5 G' I% I
) . y$ b% p7 o# O/ J& tdef get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)): . K4 L( X9 }$ i! t* D5 A% p global topic_model_training_tasks 8 o0 I- p0 _) ^ |8 Z . R# s* O2 E+ w9 B0 r if (not user_uuid) or (user_uuid not in topic_model_training_tasks): " x9 v. b: S n) d# Y6 q raise HTTPException(status_code=404, detail="未找到相应的训练对象!") " i- f! O& V2 X& Z7 P p/ t$ c- o u: a task = topic_model_training_tasks[user_uuid] , q. U' V2 Z2 H if task.nmf_training_progress.status_code == 2: 5 I' b( A! b, D1 A6 H return task.get_topic_keyword_info(topic_id) 0 Y' Q6 G5 v) } else: 3 a: L8 g4 ]! y3 O raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 5 }/ n& L. w* `3 G6 F3 F& c) a) z+ y. Q1 x( B0 J" ]
^0 M9 d- R; K" u8 u% u4 L
@app.get( M3 W J, P: J" E$ p8 O4 h4 f "/calculate/userinteraction/info/topicmergekeyword/", : v& K, Q1 H b8 U4 }0 n tags=["计算模块数据接口"],8 ]! x+ I4 x) P* {: @) b+ S
response_model=TopicMergeKeywordInfo , w& C! x4 J9 l, ^) , }7 A: L5 f9 L7 b! h# ]0 A/ `% Vdef get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)):# G! [% z0 h( ^. J: B+ G& Y |
global topic_model_training_tasks9 s. q/ h, z, B4 D3 W3 d
" ]3 G% R5 \; e
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): / j) p4 i2 [) T% o1 k6 ? raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ( {1 F- w5 U" m4 Y O ) o) L/ h4 N8 g0 B' Z task = topic_model_training_tasks[user_uuid]/ A+ V# g( s8 x) S Q
if task.nmf_training_progress.status_code == 2:& k% j1 \% }* O8 J6 I) \/ q# i; | Q
return task.get_topic_merge_keyword_info(topic1_id, topic2_id)" ~, U7 e T& k1 W( _* K
else: ; ?' z8 G2 S( t4 n$ C raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"). }6 N" b. ]' D
7 s- M" B/ y" c 1 j1 Y$ C7 o- \' v- P/ a4 e' n" u13 p9 u p$ W! d5 T7 V3 ?
2 5 X& F) @( I" c( L3* p4 a. q9 a8 X+ v9 h
4 r% s0 g9 R1 p5 m& b$ v5 \5 6 @# a7 u* U2 F1 T4 I- B6 * V: [+ G, J7 P7 q71 B6 K; e! [) T/ n6 i
8 , R( L9 z- W" o1 J- S$ @4 a8 _+ \) B9 9 L1 h5 g% W+ D( q% ?+ ^; a105 t+ u' G7 R/ h8 D
11/ ~5 o8 S( E# r# n' P n
12 ! L9 Y/ D+ |# p4 N. k0 n7 }13: l* `' Y# ]" G$ u8 j
14 * g; t$ @& ?/ E( A$ g! Y15 ; V% z6 q5 y+ x7 ? ~$ X& i2 g160 V9 x1 l I1 _# z1 J$ A |
17 8 O7 I2 `8 e+ v j4 L4 K# {18. Y( \+ H, ^) P/ T! p& Y) ?
19* F- D( J) `4 \7 W, _- x
20 3 E$ _) ?8 J* S, T4 t21. @6 o/ q4 V( f O
22 1 x* u. f7 G0 e* t23 . ^6 @" \3 k K, w* X6 c24 8 V0 I# B/ [/ @# E5 I4 R# T4 _25 i5 s( Z2 N: p# B: u: t8 p2 x26# z% e7 T; P1 j
27- S5 d+ o4 k6 V7 s, j. { s
28 / O* y; b9 D: i. M, t6 J& O8 Q29 # Q' N3 W- t. A+ u5 `30 ; S7 h8 y$ A# J% x) A31 5 D+ \2 U; M( O. R, }( H32$ T. _+ Z/ e+ I4 U1 d3 ?. [' g' J; L
33 , W" l; V' {- Q; k, D) F34 # N/ W p7 Y0 j8 R5 l+ b35; x! v7 O2 v. P( E2 G6 Z
36 " i+ p, o9 v C5 D/ N6 e9 x6 Q% `! ^37 @8 m% H- }1 Y# I$ v2 J5 X38" y+ l7 }" m- U4 Y3 A2 k- G' y
39 , \; ^! M5 n x7 _407 F! H- T9 o) l
41 * `6 [ r2 d0 Q* ?; H42; {/ T7 y8 y: Z
43 + W/ S4 R5 }0 u6 p: e9 v* ?% Z44 W, P; K" v; h( t3 U" u& {
45 j' E4 y. v n
46) E1 K) O; {* w! A9 h
47* g$ N, G% q/ W% R* ~
48' \/ U" e& T7 {7 p2 m! t) r8 A
497 D% q5 f" W7 t5 f" L
506 G8 v) B4 I+ v2 Q1 R; c8 A
51 ; p! I( j' Z! x+ W( o524 f" ]& {; x$ b2 B2 }+ O3 {
530 H2 @5 q0 f. j' z; Y' B
54 * L& k7 R' R% a6 [55. F+ D9 q) h- h/ S* w- m: @6 L4 H
56 $ O5 i+ D% [ b! }! d& D# Y3 v7 p57 1 E+ w4 j3 N! ^# f0 P58) `- R a6 E$ G( w8 J+ ^
595 [1 [8 p7 F& [ p0 w! z. d
60 6 F s: F% S' r- m, {1 i614 r& D5 m. S" g, p& W- X- Z
62" [6 N# @- N4 z& Q5 u" Z% ?
63( j/ g! J+ I. k0 i( B# y, k U7 n M
64 " f- G0 ^ V: y; A( C65 , R; {3 ?2 ]$ V669 m8 Q4 V6 _% o2 [. o
67 ! L' Q# f; Y3 S3 S" A0 N0 N9 S+ q68# z2 Z Z8 q" U# U8 x9 ~! d
69/ l2 N: Y f9 g& V( @
70 & x- U( k' G8 @% Q% ]71 , H( f' B" J8 ~6 |6 F/ e728 l0 o& i- w# f
733 i9 w8 C8 D' z) R5 Z& Y2 k
74 1 a2 B- c k! t: p: V75 ; T% H9 }5 w) E t766 a4 g( g/ z- L) [6 \ d
77 ( f! ^3 R- c7 s8 U5 k1 p) o0 Q7 O784 w$ {+ R; `* u9 }( s( \: o
79) ?" y4 d2 V' G$ X, Q
80 0 ?. K G ~. ]81 3 J4 T7 |; T" F' n% {# Q: ]82 , L, a! k- b" i. q. U& V83' s9 ? J0 {% i' t/ k+ ~6 \
84 2 W0 Z$ L" J& n7 V& u6 g" f85 % H$ O R* a! ?3 _2 d+ |- f3 j86/ r6 ]$ H# j- B$ n3 ]9 ~' G
87 M9 L- `9 m; }, ^+ O7 G$ M88 ( D0 Y( R* O* W% P89/ C" H" S- i: f' `# q
901 Z( ^- T E7 Z' w5 _- E
91 + {. f, p8 d4 ^7 l7 X92 1 N& ]! K: e! Q$ _5 d5 v' e2 u93 ^& b1 y7 N: \) W: g- u94 8 z* |1 A! }2 Z5 _ w95 7 {3 V. z6 T) P) j6 o- e, v9 j96' K& F" C+ e) h# c
97: ?4 d$ x8 j0 B) o9 X. k. d
98 D) \: b4 R) h2 I' W6 l% t6 z2 q/ p" U
992 M) |) P$ R Q" v. k C
100: M' A0 }# B% E. I5 F
101 4 g. K" T5 i9 M d$ \102 2 M5 p2 E& h i u, K7 l$ W103 3 V4 c) k) ]7 Q' K104' H6 y0 `: j* {0 m4 m$ f2 t( U
105 0 i; g7 G4 Y/ P+ M' j$ ?0 r106 0 l2 E; O5 u8 e2 n, i107( z) H" w$ @( Y! n* A1 j
108 " B' F3 ~' p6 e6 F$ v5 }109 1 ` o1 s7 u9 _6 x, o3 ?5 B f6 ` ?110 $ E9 Y1 e" A+ l1 H7 A0 V; G, [111* W' x, J- K% Q5 T, l$ r
112 . E2 Y6 J" _+ {6 C3 c113# x, Z5 L- f. x- ]
114 , J1 m, b) [ b115. a/ S. I$ i4 S, Q
1161 p+ E2 ~) ?8 Y8 P$ f/ H! A% K
117 G8 L5 F- Z" p% h118, q0 l/ U+ n0 A0 Z6 @# G3 X) z
119" [2 c+ w) ^, w# _" q
120 + s5 N) G `4 F121 5 Q# O0 R" T) n9 o( h122 ; E& a0 ]! t. y$ n5 D* N/ |123 : j9 Q4 ]3 O& ]: G1241 D* Z- i1 x5 z" r8 q: w
1251 q' \3 c" F: G' r) x3 q% ^! {
126, C. c- m3 o4 ?$ l+ `
1278 v- x; n. C' E/ Z3 w5 c1 r1 Z
128( g4 Z: ?. [! i
1298 {9 ~5 J! X4 N0 J; a- M" b
1306 B+ q e+ f6 l7 _( j/ @" A! |2 I
131+ Q; X I6 f' x: y( q# u- a( H6 c
132 0 P: r* e: o# v# S3 [ V' w$ v133% T. }& f# S6 w+ L; ], M, y
134 + m7 g0 S" r6 w" b- |- {& z# p135: H% |7 |/ J2 e `2 a
136 " {# K q# t- O: p# o' _ e4 b3 T1377 g# M% a1 P/ B1 q$ e! u' M, |
138 7 O2 {& e+ n3 _7 E139 6 z6 e9 O- \9 ^& q# }140 & p- ?8 ]& S+ W; C0 u& g" t141 1 v$ s1 y; c" B2 |% c4 J& E1420 J9 m6 \8 u% ~+ {$ @4 \/ @+ h
1431 t) B% K; D2 L, w
144 7 u; `: c) i2 n/ H) `9 q' y145* W$ l: x- d, h2 Q
146 6 e4 m# c: `# e% g147 * ?; P: i5 U$ O& n# k' `1487 n; l7 I0 t( C7 h1 Q9 d" ?
149 2 A- V) \: T$ x9 r150 3 ?4 Y* w1 N8 ~0 o151$ a+ P/ [% q+ n
152 ( M( i& _$ C k0 k/ j153# z& v8 ~& c+ T+ R9 o7 S
154 # } Z% C2 g/ z155; w3 q D/ a3 c8 ]1 |
156 5 n3 y" e0 L: i: p157/ `/ _7 T+ G( \7 m
158 1 i; o+ `8 j; |, D1599 Z2 i7 f& G0 c8 }' L) c: s
160 ; m. r: w: \9 |2 }; c' q/ y) Z# ~161 / @3 Y- Q8 Y/ G/ c- n162 % o. K1 ^ Q1 }& D163 $ C+ X: h1 C; K164* D' z: ~# R& L2 ^6 E" E
1654 q6 D1 K, [) j+ ?5 c7 C/ `
166. L5 x. Z, P# h, |2 k0 j$ R1 ^# i
167 7 t5 J T. J/ _! D168 ; W# A& I9 v6 i1698 q$ f# ?8 O5 @; d
170 2 Y C! `' j" M' q S# E) m. E171 $ k6 A: |# t8 U$ g/ G172 D( P5 F$ x5 q O1 M! P7 ^1736 L1 F0 V# g/ I& {4 y& {
174 0 R* W+ p6 J* q1 o8 C4 [175- R( d* f0 D' c5 @9 c+ V9 d0 ^( G
176 , E# t+ [3 g' b3 f$ i177 , F' ^1 m: }5 x. c178" V. J0 n2 m( D% P) q
179) U2 S# z( K; q$ P. q
180, s; M G. U# R3 h1 L$ \3 ^+ I0 v0 h
181 5 `. y7 c# n* q* V O r182* U6 Q, X$ Z1 C E4 O6 ^
183 7 G. Y6 N1 ]: ^% C4 U184 2 A8 M" G3 a0 ?185% I$ A! A' M/ v
186& [+ V v9 j$ k6 A
187# d+ I0 w' k5 i) Y
188 + A6 n" E( r3 ?9 V4 \% h% x189: a3 `, l9 C: N* x# V: `/ i
1907 V' T6 u% A$ H, I, N# L( `
191 ) N4 L6 `' N9 r+ z192 & ?" {1 l: e; q' e. C% d8 L1933 ` s) i8 ^% a4 L1 _
194 , F( k# U5 w/ o2 b195* s i2 d D2 E2 }! }7 Z9 ]9 ~* n4 @* D
196 - w# V3 a; @; A# K197 / C5 ~& T# [2 i( K198 & i2 D' h/ e' w. e4 c; n6 C199) f0 A7 f7 M8 w% y `2 w0 c4 b
200 $ q9 \: |2 k& N7 l8 N5 L) e201 5 k- l# L- v+ h3 @202, P/ L. c6 q% d6 _; k5 d
203, ]9 p6 J7 x) c* W/ Q, D
204 $ _/ B# T4 M2 x- w0 |! H2052 T5 |9 G7 w7 X# f- Q8 P
206 ) _* {6 k1 c, i4 Q0 u m) [0 J1 K, @' \207 7 x s! `0 g9 f9 h$ d6 P2082 a- z; z, C# j8 \$ _, A: l0 {
209 8 U7 E% J4 O/ b210 " c6 N9 n9 r7 ^7 [; k8 q( W2 i+ m211 & f! ^+ z+ \( e1 n& q212 2 P0 X' f! g- Z$ b. `" Y2133 H1 Q* Z9 e* U7 p; K9 g
214 # l# r& x9 m; {1 T215/ w' `4 e/ e' P( } J' v: c; _) g
216+ |6 O' c4 {1 E9 w) m& v1 S
217 & F( D# H4 n3 C+ M) Q# n* d2187 J& r% g; N1 }/ D; u
219) E* F7 p% s9 @" J- P% }& s
220 ; j5 \2 I( _" I+ H; ~* y221& x# ]/ X0 A0 P0 G
222 : k( u4 e s2 h1 w9 V B223 $ M5 h& w0 x [/ ~7 ^; ^, K& ]224/ b C: n7 ^& s( I1 @4 n! u& M
225! f( H7 k6 i9 i8 ?0 _- k
226 & g; Q/ @ U) n8 g( B227 - _1 i' S! c, E228 ( q8 A5 h6 Q1 I: m! I/ ?229 & d; ?7 g2 [# B- e6 V230 / `+ ?* j4 g0 I) i- k; `$ w& l, x! H231 1 y; Z* R* i7 \) m: Y ^232$ {% e8 L% I0 j3 } M; k- v
233 0 P- b, x9 z, F h3 I% O2348 H$ d" \4 Z, L$ m8 Q3 T
235) r2 S3 v4 Z% q. m: P; [6 G
2368 d/ M$ E3 b0 @% T2 ~$ V# H1 X
237& a+ L; \6 W. G* q% k
238 ( u, y. A5 q ?2 G; Z1 F5 }, G Z1 Y2393 o$ P9 a& m+ @4 T+ t
240# d5 i- r1 d- n/ j
241 n! g. T% f' R3 p" I
242 O5 J, l0 U) x( g! t: ~2432 C, ?6 Y1 Q# o. K+ j: `. Y
244- k+ X! x6 a9 U/ {5 {
245 % T" V7 k; @7 G* V, a6 f5 e; Z7 [8 ~) s246* `0 {5 d" j$ G, H+ W, u; f; c0 D
247 4 g! n$ f0 M9 h; v248 # l8 n' |* f( G: [249 7 g7 X A2 v, `& }2508 C2 T) ^7 M* b ~% L- r% H
251 2 d" ]6 H0 k/ m6 d9 S$ ^% p9 b, R252 3 E! t& I5 Y7 s) W2530 w! k0 C% C7 L' h* a& ]' R6 V
254. R6 u; G- i% d1 p- r+ D: ?: [
255 ( l' e6 C! C2 X: x1 g256$ Q* O d2 S P- U
2575 H+ s6 Z& t4 e5 W* v& c+ j
258 / {5 h2 y0 l3 l' i" m# e259; r( s9 }7 Y i2 A0 B
260 , ]6 S& d( q9 M261 % G. I5 k2 G7 j' _- I3 e262 ' o9 Z3 B. |' e8 X2 u% @9 E2639 T. l4 S5 c( t8 s7 F1 l
2649 ]- E7 b. F1 a' N$ ]. T9 D
2652 s2 g( x' w) W( H, ]- D2 ?
2663 |; U0 t, \6 W' X
267! c! t+ d0 M, J9 }/ d; ^8 Y
268 . C* h- U8 q" P3 U0 l269 4 h$ G' @( f' g" H& q8 G! G270 2 g, o$ l& p1 y* ~$ M2 I1 C+ ?271. Q9 D) }7 j& r7 m4 q2 c8 X
272 8 o k! m4 `! C7 R9 U273 % Z' L" l! N3 A6 Z2 F' s274( r" h5 }3 [; z- Q; U7 j( v ]
275 K1 @' W# f, R1 r: ?5 m
2767 E6 z& s! m6 y0 u& C
277: ]6 ^; n6 W f* }0 K' \# T' s
278 5 D! P1 ?3 a( C/ k, s+ m6 s279! y8 Z8 J, p+ h$ u
280 ' Y; }# l; @- f! h: C8 l# }281 & Q* w& u9 n7 u; i1 ]0 M2824 j8 z" |! l1 \+ }0 y! p
283 9 f: {' e: G$ Q8 Y* j! F+ L284. b/ X" R9 Y1 }: ]( J3 ~
285 2 z5 o4 f6 h. n4 M286( d& r( }+ O9 U
287 8 p9 a& m2 Q; A5 V$ X288+ ^0 w' f- M$ V- \$ g
289 3 x0 O( n n% j2 K* M2902 B- S: z* W+ B1 W! u9 W! `
291) c/ n/ H' `- A; V6 d" H/ E
292" k# ~6 A) l8 k
293 & \% t4 c$ L) |9 @$ {7 X294 , O( M# z7 N4 \9 p2 ]. t( F, m295& r. A9 h R; e
2966 k! [$ D- {! {+ {
297$ F- K2 L& Q& }, @# k
2982 C2 J) f X1 x' f$ S: m) v" w" s
299" L5 P0 s4 g& O1 Z. h9 w8 K. {
300 ) ^# `4 p2 I! T1 `% h/ ~1 n301 5 a' |# q$ w' _8 S: A/ J302 & X1 y( ~* [: M8 _5 A, e303 5 Q4 c J' k* k& g3 I9 r1 |' I0 ?304% v: A1 h2 P! {0 [5 T/ g
305 2 k( g. e2 }% T+ k5 l! _306* \' l7 Q1 ], I3 ~
307 . p: H' L& |. P- i( Z308# \ z+ V7 I V$ p3 l
309! m+ x' Y+ c6 H2 r2 U, y
310* a9 L5 E# b4 x: \
3119 U/ s T8 I. o* D- v
312+ M3 g P; d& M1 V1 p v" V
313 ' X! |, U' r; K+ m Z3141 s, ~! z: O x& i, ]; J
315% _* e' z( l' g
316 X7 ^8 O0 I% y8 |# e
317 ) q5 k0 f. o" i; M. e4 s3 i318: `& D K b$ E9 W; i9 |
319 ; }/ }+ v* A- f0 u320. \* n0 F; q- u1 K4 J. s+ O
3215 c% O: J6 k3 m3 g1 u& H
322 # t: g" U* E+ V4 ^323% a" {" z3 C) Z& }1 b4 E8 S
324 7 `/ D ^) @' f- W) [, i, P6 _, Q325 8 @! N- l# I( d- U326- Y& D9 ~! V- Z/ `* d7 L1 q
327 2 @2 G: d2 D3 m- k* Y328$ D1 p; e$ T! Z) }: Z
329 & T; n: _/ n7 H2 u" c330 , ?3 x% l# _% l: N3319 m5 h( @/ \6 ~0 f) f
332- d% U! y- C! H7 S) U, l
333$ n4 M$ M0 m" w
334 6 m; G3 D& ~5 _- m; p6 W335 1 n7 ?5 @) t+ H; y% s* p336+ i( T3 o9 M) r6 @. c! [2 b
337 % D5 `, s& B) `2 m% u. n3381 a0 f) y& K* H
339 * C8 _' }! ?) P$ Q \: s( h340* D7 G4 s6 W! t/ Q$ D! E$ y
341 " y! v: B' C8 p342 % g1 A: a( I2 S343 6 m6 [5 F! Z3 b. d( a344% G, V, g% l- e4 [3 Z
345 ( b$ @0 g4 a9 L, I# C' i! m. ~3463 q+ O3 {$ I. x6 T
347 ( x5 c2 j7 ?6 }348+ ^+ A4 A5 M/ V: v3 Y
349 ) {5 X; O( u) @) O6 p6 j350 9 h0 X# Z( R: T351 4 a8 I: Q& ~# `& ~' l: @: K4 D3523 T: a9 o& l; b
353$ Z- y! k+ [5 s0 P- Q- l( {4 w7 x: }
3544 F, K6 _+ B% \: {* b; ~& k6 P
355" P/ m/ _! @7 x
356 ; b0 ], Q1 f B+ Y. ^1 \357 ; S5 o& H" Z, d7 b& g358% |4 G5 l G. g3 g" \' A
359, K! I; a+ Z B2 \
360 k$ p' _8 ] k; o' c5 q
361 - c& ~5 e# C5 \9 o; K: G+ F362$ [& R6 P: G6 T, e; t
363" c6 u/ Q! g/ x, ~9 |
364( v7 N Y" T$ k- k3 j
365) p8 F8 d- V# U, |$ Y3 v& B9 t& `! s
366 ( y+ \2 Q, i t6 Q( n367& L& Z7 W" G9 c6 P8 v
368) d' u9 n8 v C
3690 Y1 Q' q* u& @1 L1 U2 g
3701 U- P5 S" z' I3 |* N: L
371 9 S, }2 h: N! X; p" S372 7 _' m' G# o+ d- M3730 c; U' o; d- i& \
3744 i' }2 C( R3 M0 x
375$ _; [' w0 G" L
3760 ^- g# P+ Y$ Q i5 h6 U
377+ ]8 v8 w4 X# @' [% _8 r1 `
378 6 ?9 `6 X6 D* e379 . h8 Z0 C- N: Q- w, s: C380 1 e' T- p* i8 b3810 s2 [) Z# {& s9 j
382, T. Z0 A! S: r+ P' L: J6 i, Q
3835 \2 p; D- E+ G5 R: z- Z: i
384; m% I5 p) s. J2 f1 x# e
3855 H: O3 M- X: j( @7 }
386 ! \; A0 @2 |5 P: \$ f5 M/ V387 2 t: S1 f ~5 Z388 " s% M! b- z/ L0 S2 h389 , j2 w7 p3 M8 V& M0 F# {7 {; C390 - ?& X3 q4 S( }+ t2 w' ], ^391 . x; m% D0 l2 C2 P392. ~/ b- P' K, ^ z
393# U) v9 a# y! O5 Y3 ^. M
394+ |* D7 @# X7 \8 u1 r; p4 B2 r$ L
395" f. W1 w% X; u( X
396 2 Z. N6 Z/ l4 S6 I1 U( Q( S) R397 * R4 R* {# l5 U; Z* Y5 \3 a398 / i& Z0 p$ D; Y; |399! p0 T, G; |/ z( c) N
400 5 m; U8 o- a" B/ ?401 " ?! k1 m d% h402* {$ l& ?% K" y
403$ E' i; F }' O q( k* K0 d1 q
404 0 g# ^/ J4 I/ l6 m4056 }, `3 [5 H2 ]/ _
406 + m% s; P9 ~% m) C5 _407 - M" f' E, Y' q( n+ v8 j& d408: l k( r8 S+ u/ C+ c7 [6 t0 ]% {
409 % o% W( O" u4 n1 J: X. p4109 |- f1 \% v1 S
411& t. \0 M7 U! t z
4121 Y2 O% w7 `; |
4136 a- k m" D; h; Y9 d' l
414" [ t! l$ f4 J; F) v* B0 f
415 $ C( Z/ u9 |1 g' a+ e! l416) _7 f, o4 {5 I8 m h1 }7 [
417 . j- g0 B: X) ^' v1 o418 5 \1 q* e/ O/ r419" G2 X9 \* G* ~( z
420, x2 I9 u: E2 m% n
421 . K& Y, ]; e4 I+ H3 i8 p( a422 0 t. ?& C. L6 a) o h& h, m ~8 S; ]! _423) d7 z& g5 l/ K* o. e% f! h
424 9 p/ l9 d+ O1 J- B1 \! J425 ) c* ?9 g/ y9 h! Q4266 z0 q$ S0 `& G8 R8 c
4273 I: h; F& Y/ e9 ?% u) E% O: S2 e
428 5 ]. n& P% `2 W- a8 U# U# c4294 l0 W3 t6 \( h+ L2 C
430 , A Y9 l+ M2 Q6 E3 N- x431 : m4 {+ r7 W* @432" r3 o; W _ F- t, M' T; B
433# j/ y; O7 l: P3 {: M X; h! D- v/ ]
4340 m5 [" L& g8 B G
435+ y3 w1 Z4 G% d4 N
4360 N. j: {5 \) r7 ? l
4372 J$ z$ o. _8 D6 A1 b
438 . \7 Z6 y7 R5 v' P439 9 s# N# W" M" |7 \7 j440 # A" ^" ~8 d+ q, n441 # A6 d* q! `2 e% X' a442; N5 T0 \/ `1 y6 M
443 0 q1 u. x8 }5 n: L* B+ i444# i) q, H! Q+ ~6 o. ]: }
4451 W9 s; v, y9 A- {
446) z1 n1 {- i9 o0 e7 t3 k5 j
447 & e+ J A% h4 N6 J9 @4 y; n- t448. t( I+ U$ ^, u" I% i* h, ?
449' D7 X; X! W3 k/ t% T. _
450- s! j/ O) U2 J% x8 c7 c1 z( n3 j
451; H, U' W8 b8 d- l2 b
452 , U& W" D! L6 B4 n453 5 c- f. p1 r2 x0 x% m454: ~6 S3 T" s3 s! R) k
455. _7 e7 S; S: y" W$ R
456 * g2 [2 ?% z1 q; M: ^$ [6 m% e457- b9 i1 x7 s$ ^
4588 J' A( \8 x _
459 ' ~* j0 ~% K% R. V9 P; ]- F- d/ K: c460 3 X1 H- o: E: w6 \! c" ^. ~461# ^( n! ]2 O# @
462 Z6 u3 K' b% D+ ~1 ]6 x5 C463 6 B( R- \/ ^: p& j- A3 z. o464 : B: d% f6 a. e T. N; d' v465 + D3 B6 d1 h4 r! ]5 b4669 U8 @& x# F, O% H2 c/ ?5 t, b
467, b( j9 X. g% p) d6 G! \9 h* S
468 + L7 X! F, M9 w4690 v! ~1 E) c# \# H6 j0 x
470, S* s/ l& M* {# \
471+ a) G9 o0 }# s1 F7 D: r
472 ) G" H. }( z3 R6 u- E; k' }( ~% \473 8 Q- t! X# I+ X- {$ W) N) [4749 u7 V6 S f. H1 X. L
475) d, R* W) M4 W# `) o, z* I$ ?- C
476( ?" u! ]$ L& h3 G$ \8 x
- C8 x& D+ b, M1 I: a: K
3 x: m6 I+ f l0 K9 e" \- C9 {! ] [- W5 U: G# b1 n
1 E1 Q6 k2 } e2 J$ C7 V0 Z/ d/ T+ c% H6 \$ F9 b7 h
3 {% F, d# [0 L' S5 ?% A7 g+ }$ _: Z
! e" W( T% I; R3 \, z
2 \% `) q9 B _* D* a$ _/ a
0 Q! ]6 H: Z1 H3 y& ]5 b" J' L
1 {$ k, j" Z6 l* i1 v
0 V2 L a9 B P1 X 4 m# d5 Z3 x) I9 R b 6 w' x9 G* l0 ^' o0 L: C( r6 C9 Y b- L* j* w
) C: W0 T& |4 R/ W
8 u! m4 [+ O G0 v; f' {0 Z3 n6 f M3 a# p# ^: y
( M! W/ ]- f+ s- A5 t1 O3 S
1 f; E. @/ M% ^5 j, H
, o' y/ V7 B* z3 ^; q$ [0 u4 |* i$ D1 K, Q- Y8 @0 n. \
5 ~" ?& c4 p* `8 K0 f- l
$ O1 K% Q; {: D+ n" \
. e$ i5 F* Y# ^ b2 q
————————————————; D3 J7 [/ p' z! [5 b: |) u
版权声明:本文为CSDN博主「biyezuopin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 U/ m8 @, o0 ^. [% L6 |9 H
原文链接:https://blog.csdn.net/sheziqiong/article/details/1268140212 y. O- Y7 c- S7 b2 p' B
& @# \5 ?6 g# W5 q4 H8 r' c 5 v+ C& Y& e* h& r3 J. e