QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2593|回复: 0
打印 上一主题 下一主题

LDA主题模型简介及Python实现

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-7 15:38 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    LDA主题模型简介及Python实现8 v! m" V8 W; p8 t, u, ]# E

    ( p# s: f+ q; t: c& P一、LDA主题模型简介
    3 y: [8 s: ?! M  R  S8 H/ t5 `        LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。6 ~+ g' a' z, d0 |4 E4 G
    ' E8 o2 l5 M5 L
            LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来代表文档。词袋模型介绍可以参考这篇文章:文本向量化表示——词袋模型 - 知乎; r% ~8 s' X0 I. }  a" D: A
    + j; r& j: |( \; c% {7 \3 \) k, B, H& o
            了解LDA模型,我们需要先了解LDA的生成模型,LDA认为一篇文章是怎么形成的呢?* f0 Q. z8 l5 F# s0 a/ A6 l) B% p6 Y

    % D1 C, P/ s* Y; z2 b+ [% w. b        LDA模型认为主题可以由一个词汇分布来表示,而文章可以由主题分布来表示。
    " Z6 F2 w$ ]" I
    $ {1 X* O: j4 B        比如有两个主题,美食和美妆。LDA说两个主题可以由词汇分布表示,他们分别是:
    $ f" T* O) I4 ]5 Y% M' I+ H1 o5 X5 E- [" V0 k: x* ]6 T  s) q
    {面包:0.4,火锅:0.5,眉笔:0.03,腮红:0.07}% k: V) H0 q/ c7 n
    {眉笔:0.4,腮红:0.5,面包:0.03,火锅:0.07}
    : N. W. k7 `$ h, W
    # H# c4 ~+ x2 k( z        同样,对于两篇文章,LDA认为文章可以由主题分布这么表示:4 ^# `4 R8 _# D2 \; x* C
    ; A( n' m; Z" f& @+ t& ?$ P9 j2 q/ I
    《美妆日记》{美妆:0.8,美食:0.1,其他:0.1}- g  {$ t, f" c0 F# _
    1 k1 m9 J$ f: `! U8 L
    《美食探索》{美食:0.8,美妆:0.1,其他:0.1}9 a! M: R# c" B* f4 z
    / \0 d6 y- _3 U% m
            所以想要生成一篇文章,可以先以一定的概率选取上述某个主题,再以一定的概率选取那个主题下的某个单词,不断重复这两步就可以生成最终文章。
    / H$ z/ T0 A* B9 A6 n, G
    . ]3 V" G) Y# }9 {1 }        在LDA模型中,一篇文档生成的方式如下:
    ! c  f& l% C  A/ `8 L
    6 y( G8 c$ t; O7 g" f4 \: l5 Z# z( p; `4 n. _
    . s! E' l- f) [3 }" G* C
            其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。
    4 Z  U& b1 n( Y& i4 s
    & W  x; ~% S$ E) x0 Q8 r% h; z" b. ?$ Z$ [! l1 W
    0 w' n  ^3 J' o+ H
            如果我们要生成一篇文档,它里面的每个词语出现的概率为:$ u5 |  i1 `$ I* @/ Q. g( k
    " j9 e/ @8 v5 Y% I- f4 [. ~# Q- k

    3 U# o  L3 m" x5 V1 z+ W8 Z4 s% ~
    1 N1 \) `+ I  I: Q4 W6 `7 ?         更详细的数学推导可以见:通俗理解LDA主题模型_结构之法 算法之道-CSDN博客_lda模型* @& t5 r- i6 `! B
    5 D) r3 T" ^+ z
            看到文章推断其隐藏的主题分布,就是建模的目的。换言之,人类根据文档生成模型写成了各类文章,然后丢给了计算机,相当于计算机看到的是一篇篇已经写好的文章。现在计算机需要根据一篇篇文章中看到的一系列词归纳出当篇文章的主题,进而得出各个主题各自不同的出现概率:主题分布。9 J7 F+ g* K9 P0 C6 e) q

    3 [2 @" D9 r; @1 l        至于LDA主题模型在计算机中具体是怎么实现的,我们也可以不必细究,现在有很多可以直接用来进行LDA主题分析的包,我们直接用就行。(没错,我就是调包侠)7 U( V' |1 E6 L! S, K* ^
    1 g4 [" [) A% s( s
    二、Python实现
    * z' ]) n5 X0 i) O4 n        在用Python进行LDA主题模型分析之前,我先对文档进行了分词和去停用词处理(详情可以看我之前的文章:用python对单一微博文档进行分词——jieba分词(加保留词和停用词)_阿丢是丢心心的博客-CSDN博客_jieba 停用词)
    / R7 }5 l% d/ N* B
    5 m) ^1 p5 d+ E' h  ~+ q  b" M' ?        我下面的输入文件也是已经分好词的文件* @) e- y5 z' c* L8 E
    + T, T0 d. {8 A5 `7 b
    1.导入算法包
    5 s0 P& ^" _4 X( o0 l7 v/ h) q* k0 ~import gensim
    . K  K3 |% X* v! Q3 }from gensim import corpora
    . n6 \; t1 V& simport matplotlib.pyplot as plt( w, R, U  f# ?
    import matplotlib/ ~; e: a% ?8 T% c6 c1 L7 C
    import numpy as np
    2 X, S5 J/ M6 f5 H! E: Uimport warnings3 ?, |; n1 S6 V0 ~* |0 f* L
    warnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarity
    - |) F8 S) E5 M6 ^: h7 \$ B% d) g3 v9 \! ^* |
    from gensim.models.coherencemodel import CoherenceModel
      i8 ^/ C  L. ]: Efrom gensim.models.ldamodel import LdaModel
    1 t: D) H& s7 d' H( h2.加载数据
    + @) Y+ ?- p4 |7 K* E        先将文档转化为一个二元列表,其中每个子列表代表一条微博:3 H8 r0 s  m$ t' O

    # O0 v# J7 G, a! W4 S# q$ P( [PATH = "E:/data/output.csv"
    . w" P% m4 _7 q2 u0 |( [$ K' I* m- d
    file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容9 R! S7 E, c# J' H6 L- D
    data_set=[]  #建立存储分词的列表
    + C" b* c: Q) L( F0 [for i in range(len(file_object2)):
    ; C; [; u: \) j) p! s5 u. q! h; o    result=[]7 n. |( b- l  L  s9 b/ A
        seg_list = file_object2.split()
    ( C+ j( g2 `9 X2 ]; T    for w in seg_list :  #读取每一行分词1 `4 @8 a; j. s- u+ M, G! p
            result.append(w)
    ! P% ]8 z+ z* h; W1 ~& F) I7 D    data_set.append(result)+ p. d1 P1 u# U+ t6 ^
    print(data_set)
    ) R( w7 S, Z1 y0 Y9 G        构建词典,语料向量化表示:
    8 C: ^) ^% {* J4 |3 R4 O
    # x: w4 q! v6 b0 h) ^dictionary = corpora.Dictionary(data_set)  # 构建词典, v8 h) ^$ i. q: |- m+ C8 W4 j0 o
    corpus = [dictionary.doc2bow(text) for text in data_set]  #表示为第几个单词出现了几次' a: O! O1 F" S' T; b* Q5 I0 Q$ ~% [
    3.构建LDA模型- x9 {* ~7 v, V- Q
    ldamodel = LdaModel(corpus, num_topics=10, id2word = dictionary, passes=30,random_state = 1)   #分为10个主题
    5 p3 J; \% C5 ?/ r7 j, lprint(ldamodel.print_topics(num_topics=num_topics, num_words=15))  #每个主题输出15个单词
    , ^7 Y) |' L# p0 h* C        这是确定主题数时LDA模型的构建方法,一般我们可以用指标来评估模型好坏,也可以用这些指标来确定最优主题数。一般用来评价LDA主题模型的指标有困惑度(perplexity)和主题一致性(coherence),困惑度越低或者一致性越高说明模型越好。一些研究表明perplexity并不是一个好的指标,所以一般我用coherence来评价模型并选择最优主题,但下面代码两种方法我都用了。+ o2 ?) \3 {$ B! d, k

    ; G  D$ k- N4 |- M#计算困惑度3 w$ Q8 ^) b& X
    def perplexity(num_topics):  S8 t# g6 X9 T0 K0 E, _0 g
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)
    % {" _: Z" H, q# ~$ `, H- V    print(ldamodel.print_topics(num_topics=num_topics, num_words=15))1 W5 a- @* M9 c7 ]
        print(ldamodel.log_perplexity(corpus))2 a, ?) x: A! m* H( V& t$ C0 h
        return ldamodel.log_perplexity(corpus)' S) U: W% X, N: P4 Q
    #计算coherence& s8 c+ d5 E4 b8 k; E  j, a
    def coherence(num_topics):  }1 u( S$ m: |4 ]' X, k% d/ ^: r
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)3 a3 \& Z$ |; }* l0 n/ u
        print(ldamodel.print_topics(num_topics=num_topics, num_words=10))
      K6 ~; {3 |! b$ o+ H    ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')
    & u; ~  }  S$ B) o& O7 ?& x0 X' k    print(ldacm.get_coherence())' p! b1 V$ x  d4 b6 e7 C
        return ldacm.get_coherence()
    ' M& ?* V3 d; h/ ]8 w# h  C* L4.绘制主题-coherence曲线,选择最佳主题数
    + u/ J3 C  Y) h- \0 mx = range(1,15)
    * i! b2 a: }  n# z = [perplexity(i) for i in x]  #如果想用困惑度就选这个
    : q3 F" Z5 {( u! b" V4 }y = [coherence(i) for i in x]/ }. ~/ X! O: Q* t! D4 T9 A
    plt.plot(x, y)
    : K7 x/ x; Q; S# nplt.xlabel('主题数目')
    9 I6 |9 |' R$ g# pplt.ylabel('coherence大小')
    8 F+ K) F  t. mplt.rcParams['font.sans-serif']=['SimHei']
    + f* M% N3 T" T4 o5 rmatplotlib.rcParams['axes.unicode_minus']=False
    % @7 z  x0 L+ bplt.title('主题-coherence变化情况')5 P+ |9 W, B# u1 h/ |
    plt.show()) W3 T+ X: Y& }
            最终能得到各主题的词语分布和这样的图形:2 E4 x! X6 Y  U. i, s( s

    + D" s6 @& w: m9 m* S- C, K% [( y7 w0 L" [; \

    5 G% [1 C1 k9 ]7 |: e 5.结果输出与可视化/ o) K, w1 F- ]) z( w
            通过上述主题评估,我们发现可以选择5作为主题个数,接下来我们可以再跑一次模型,设定主题数为5,并输出每个文档最有可能对应的主题
    ! k/ O0 {% T! `4 a! d4 k
    / e  K  U/ R  P& kfrom gensim.models import LdaModel5 t8 a2 F0 Z3 L; T# `2 g
    import pandas as pd
    / a+ |3 d, W+ o' X7 i* R# v/ Nfrom gensim.corpora import Dictionary
    : \1 x" n3 x0 T5 q1 Y0 y! j$ }from gensim import corpora, models8 U" Y' J& w  d! J4 i) W
    import csv5 U. r( n* R2 Y( q0 i3 \5 r
    % w0 n: g: x" i4 V  g% W  z
    # 准备数据+ w- _) U. W( d9 h! o
    PATH = "E:/data/output1.csv"
    ( U+ o; X7 \& a
    & Y' d) t4 }; {& a' a; W" c& G  e  Lfile_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容, ^8 B2 D6 P* Y' _- b" Y" c, q/ Q
    data_set=[] #建立存储分词的列表
      |# R$ H0 s/ B0 {! @for i in range(len(file_object2)):
    " F% s- t3 S4 b- _    result=[]
    1 y" Z0 M9 z  N5 k$ f    seg_list = file_object2.split()
    + M8 g7 T, y- ^0 d  I5 N# L    for w in seg_list :#读取每一行分词- t9 _/ a: l# s, s( L
            result.append(w)
    5 v' r: ~6 p! S    data_set.append(result)1 e7 \, }" r. F
    # {( h6 T  U# e$ P' S' d9 _
    dictionary = corpora.Dictionary(data_set)  # 构建词典: r' ^) @' z' ]2 \$ T& d
    corpus = [dictionary.doc2bow(text) for text in data_set]
    8 o1 F% Q2 C0 `  ]
    ! F) M! s9 S2 i# v$ Blda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)+ L$ ^' W( ?; G8 p# _9 R; J
    topic_list=lda.print_topics()$ t# b9 J# |) N# `
    print(topic_list); s% _9 N5 [8 F' R  U; U
    ; O' l! ?/ k# S3 @3 X2 w! Q
    for i in lda.get_document_topics(corpus)[:]:
    ; g* c  F( I4 }" J/ k4 _    listj=[]0 r1 {) i. q  r8 O  o9 u: T: X
        for j in i:
    6 d2 F) h, b5 [        listj.append(j[1])+ y% A: T  f; ^
        bz=listj.index(max(listj))# y' y* r, D) P; n6 @% U4 |
        print(i[bz][0])4 v5 h1 F* X0 M

    8 g" k% U8 p3 ], b5 k! X  D        同时我们可以用pyLDAvis对LDA模型结果进行可视化:5 x5 J  }( i! W& u& A
    & I9 }, S, Q& ^% L+ Z$ j
    import pyLDAvis.gensim
    0 L* Q1 B" A6 B8 V3 x( SpyLDAvis.enable_notebook()
    3 F- O1 t9 x! g: J2 J6 Z0 Odata = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
    5 x6 a2 {" N+ V4 `) y) w8 U6 g- vpyLDAvis.save_html(data, 'E:/data/3topic.html')" s8 V9 P2 s$ T
            大概能得到这样的结果:
    # y- V; s; U; _7 w( x
    9 w% r" C! ^9 ~" s$ y7 i$ _& o1 Z" ?' |* w

    + C' s) e) Y4 N( n  z 左侧圆圈表示主题,右侧表示各个词语对主题的贡献度。
    / O8 S4 P+ X, a) U7 L3 {% h/ q$ @* T) D9 Q$ P5 A
    所有代码如下:: e' f6 c. _. R8 l! I
    import gensim
    2 ]- Z( w: N1 W( a1 x; I: f: ]from gensim import corpora& z1 R6 E5 H4 T4 W: W8 F' b
    import matplotlib.pyplot as plt4 _/ R- z2 R( r- L3 X
    import matplotlib" n1 w; T, r  o$ X
    import numpy as np/ L. M6 v  H" }; V
    import warnings) _  q: h: Q% R& u
    warnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarity' a" D! b- y+ n* z( O! p7 ]' e

    9 j6 t' _; J  Q% N8 @+ Afrom gensim.models.coherencemodel import CoherenceModel
    ; w! l8 }! y8 p' Bfrom gensim.models.ldamodel import LdaModel
    ! Q  Y3 p) ?9 o4 Q1 ^! ]6 f
    8 Y) Q9 N1 r& e6 U/ x& y
    ) b, v# T/ V8 B4 f, O! ^7 ]0 x+ X: i5 }( y, [
    # 准备数据
    7 Q$ X3 K3 w: ZPATH = "E:/data/output.csv"
    2 W& h' @. L- n0 u+ }0 q
    / ?8 N" N0 z7 N, h/ E: efile_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    $ n& [3 F: x8 W' |9 mdata_set=[] #建立存储分词的列表
    1 E% B' \4 I$ \2 a0 Hfor i in range(len(file_object2)):: }7 B3 ~* q* l% H# j  e- e/ l& N
        result=[]
    - j6 O* w1 N) l3 n    seg_list = file_object2.split()
    , a3 j5 r6 p5 K. V% _9 K3 F    for w in seg_list :#读取每一行分词
    ) A( ^" ~5 k! U$ {  @/ [        result.append(w)8 `; h  D0 Y. p% {  ^- R' s2 J
        data_set.append(result)3 X0 D' f* D! C4 O& i$ r: V
    print(data_set). g2 R; l& A% ]

    $ B7 J' S& Z; f% |, R- c
    5 Q/ p" L  I8 ?4 O; W) tdictionary = corpora.Dictionary(data_set)  # 构建 document-term matrix- v) ~3 V9 U3 k# W% u
    corpus = [dictionary.doc2bow(text) for text in data_set]) d% p7 V% U( E$ ]
    #Lda = gensim.models.ldamodel.LdaModel  # 创建LDA对象: i; I5 o# [, j5 B! Z9 J/ q
    + [% f5 G5 r/ c2 p
    #计算困惑度& g0 F) L. ]8 `2 p
    def perplexity(num_topics):7 S& G6 _; [' w! [3 {
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)
    / \+ l. N) n4 D    print(ldamodel.print_topics(num_topics=num_topics, num_words=15))
    9 f2 |% A# {  J! F- P+ f' k: a    print(ldamodel.log_perplexity(corpus))
    1 s+ u# P4 r* R7 l- L* D6 [& [    return ldamodel.log_perplexity(corpus)
    % J. ]4 Z; B5 p+ J' n& B/ X% |
    # U$ {* `6 e9 j, T#计算coherence
    3 W' J: E5 F; x% G1 [6 T, Ydef coherence(num_topics):0 @/ c" u  ^0 l9 n) X# ?; c  K9 \& ?) ~
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)
    2 b- k6 `' N% N% P( ~2 K: ~2 v    print(ldamodel.print_topics(num_topics=num_topics, num_words=10)); N& ]1 h8 M) i# C3 N
        ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')8 W8 h7 {3 d6 G- ~' Q+ e
        print(ldacm.get_coherence())) m% a* l7 V  R# n% g' V* a; F
        return ldacm.get_coherence()4 Z" x. W8 i! b0 p

    , Y* ^8 p1 l4 u7 Z; W7 x' V# 绘制困惑度折线图
    - n0 Z! m; I, Lx = range(1,15)
    6 A. A3 X3 \1 Q, {  m# z = [perplexity(i) for i in x]
    " _6 ^8 ]1 E( ]y = [coherence(i) for i in x]: p, u% `$ E5 P  z
    plt.plot(x, y)6 N9 R/ q9 G$ d
    plt.xlabel('主题数目')
    8 `4 y, O7 W) ^1 \8 ^plt.ylabel('coherence大小')) v8 X% L. P+ {3 n# j, x: l
    plt.rcParams['font.sans-serif']=['SimHei']+ \6 R& ?5 j% U9 x$ I8 d8 X
    matplotlib.rcParams['axes.unicode_minus']=False
      X, E+ I# k8 t% r0 h7 r6 T, ?plt.title('主题-coherence变化情况')
    3 b$ S: P) s8 `, Bplt.show()
    7 P" R# N+ u5 I  w: e& d) ]
    . @1 L2 k; {: ^6 j1 Afrom gensim.models import LdaModel
    & w9 S  N1 f  s, Aimport pandas as pd. w2 q  x, G* Y
    from gensim.corpora import Dictionary
    ! c& o! t% C: E& @from gensim import corpora, models4 S: l" U, F* c8 N6 q. c
    import csv
    0 z4 Q+ y9 h* L. j7 A
      X: k$ B% N. v# q2 ~4 W1 Z7 ^# 准备数据
    % T! e- a7 H2 [PATH = "E:/data/output1.csv"
    . d0 j0 ?" }) ?
    ( S+ y7 Z  D$ Kfile_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    , i! N9 `/ n/ ~) {data_set=[] #建立存储分词的列表8 Y$ b4 H9 v* K
    for i in range(len(file_object2)):
    $ ]' M& A- r) z& y    result=[]% k, T. W) e# ?6 F4 E
        seg_list = file_object2.split()
    # l9 ]0 h$ [$ t! d2 H    for w in seg_list :#读取每一行分词, }( w& x/ B, ~
            result.append(w)
    # m- \" \$ R0 g5 i5 g    data_set.append(result)
    , ^/ C) t5 X9 |4 ^0 i6 p- O' p1 X7 r2 F7 C" n
    dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrix
    : _; s, }  x# ^2 Y# G4 {* q, `4 Q  hcorpus = [dictionary.doc2bow(text) for text in data_set]( [! {) i" G) h, u2 Y, h# m: g
    5 _+ X2 @  r% s) f8 m
    lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)' h0 H9 I2 X7 d8 G1 q) i( F
    topic_list=lda.print_topics()- a/ s1 s3 K) z$ u' D
    print(topic_list)5 P$ B' U- n2 F2 ^
    " J* j1 X  m' g8 K8 k
    result_list =[]) S6 w2 W& w. I. W( j& w& ]/ u+ Z
    for i in lda.get_document_topics(corpus)[:]:% g+ o$ F" w' E( j
        listj=[]4 k9 \; Z0 N& o
        for j in i:
    6 H( m. J! ?4 B8 F- O! Y8 y9 q        listj.append(j[1])
    $ A+ Z& O' d$ _! u1 F: L    bz=listj.index(max(listj))
    ' y7 U0 F  W; u% q5 E3 R    result_list.append(i[bz][0])
    3 C+ B( Z9 X! Y9 O% E% Z! b7 W' yprint(result_list)
    " a  N8 R) N$ J
    % Q- p2 U8 a* @$ F7 m6 I1 gimport pyLDAvis.gensim% L8 J4 _  B1 C) m, S6 p$ h
    pyLDAvis.enable_notebook()
    5 U, f6 C: a& M1 o8 Tdata = pyLDAvis.gensim.prepare(lda, corpus, dictionary)! U- D! j6 o- W! n8 G  I
    pyLDAvis.save_html(data, 'E:/data/topic.html')
    $ q* z# O0 o, Y5 q有需要自取~
    0 \' D* {# H  }( r————————————————
    9 @& ~/ Y( q8 P: R! T5 ~3 c' A版权声明:本文为CSDN博主「阿丢是丢心心」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 b2 f6 d! S/ b: L  |原文链接:https://blog.csdn.net/weixin_41168304/article/details/122389948
    4 s6 G/ d4 K! Q( Z7 k
    6 A7 l3 I" }- t8 R" n  f
    % U- G) ?9 O* A: N8 x6 ?) d
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-21 11:27 , Processed in 1.659737 second(s), 50 queries .

    回顶部