tomoto 0.3.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +45 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +162 -0
  5. data/ext/tomoto/ct.cpp +58 -0
  6. data/ext/tomoto/dmr.cpp +69 -0
  7. data/ext/tomoto/dt.cpp +91 -0
  8. data/ext/tomoto/extconf.rb +34 -0
  9. data/ext/tomoto/gdmr.cpp +42 -0
  10. data/ext/tomoto/hdp.cpp +47 -0
  11. data/ext/tomoto/hlda.cpp +71 -0
  12. data/ext/tomoto/hpa.cpp +32 -0
  13. data/ext/tomoto/lda.cpp +281 -0
  14. data/ext/tomoto/llda.cpp +33 -0
  15. data/ext/tomoto/mglda.cpp +81 -0
  16. data/ext/tomoto/pa.cpp +32 -0
  17. data/ext/tomoto/plda.cpp +33 -0
  18. data/ext/tomoto/slda.cpp +48 -0
  19. data/ext/tomoto/tomoto.cpp +48 -0
  20. data/ext/tomoto/utils.h +30 -0
  21. data/lib/tomoto/2.7/tomoto.so +0 -0
  22. data/lib/tomoto/3.0/tomoto.so +0 -0
  23. data/lib/tomoto/3.1/tomoto.so +0 -0
  24. data/lib/tomoto/ct.rb +24 -0
  25. data/lib/tomoto/dmr.rb +27 -0
  26. data/lib/tomoto/dt.rb +15 -0
  27. data/lib/tomoto/gdmr.rb +15 -0
  28. data/lib/tomoto/hdp.rb +11 -0
  29. data/lib/tomoto/hlda.rb +56 -0
  30. data/lib/tomoto/hpa.rb +11 -0
  31. data/lib/tomoto/lda.rb +181 -0
  32. data/lib/tomoto/llda.rb +15 -0
  33. data/lib/tomoto/mglda.rb +15 -0
  34. data/lib/tomoto/pa.rb +11 -0
  35. data/lib/tomoto/plda.rb +15 -0
  36. data/lib/tomoto/slda.rb +37 -0
  37. data/lib/tomoto/version.rb +3 -0
  38. data/lib/tomoto.rb +27 -0
  39. data/vendor/EigenRand/EigenRand/EigenRand +24 -0
  40. data/vendor/EigenRand/LICENSE +21 -0
  41. data/vendor/EigenRand/README.md +426 -0
  42. data/vendor/eigen/COPYING.APACHE +203 -0
  43. data/vendor/eigen/COPYING.BSD +26 -0
  44. data/vendor/eigen/COPYING.GPL +674 -0
  45. data/vendor/eigen/COPYING.LGPL +502 -0
  46. data/vendor/eigen/COPYING.MINPACK +51 -0
  47. data/vendor/eigen/COPYING.MPL2 +373 -0
  48. data/vendor/eigen/COPYING.README +18 -0
  49. data/vendor/eigen/Eigen/Cholesky +45 -0
  50. data/vendor/eigen/Eigen/CholmodSupport +48 -0
  51. data/vendor/eigen/Eigen/Core +384 -0
  52. data/vendor/eigen/Eigen/Dense +7 -0
  53. data/vendor/eigen/Eigen/Eigen +2 -0
  54. data/vendor/eigen/Eigen/Eigenvalues +60 -0
  55. data/vendor/eigen/Eigen/Geometry +59 -0
  56. data/vendor/eigen/Eigen/Householder +29 -0
  57. data/vendor/eigen/Eigen/IterativeLinearSolvers +48 -0
  58. data/vendor/eigen/Eigen/Jacobi +32 -0
  59. data/vendor/eigen/Eigen/KLUSupport +41 -0
  60. data/vendor/eigen/Eigen/LU +47 -0
  61. data/vendor/eigen/Eigen/MetisSupport +35 -0
  62. data/vendor/eigen/Eigen/OrderingMethods +70 -0
  63. data/vendor/eigen/Eigen/PaStiXSupport +49 -0
  64. data/vendor/eigen/Eigen/PardisoSupport +35 -0
  65. data/vendor/eigen/Eigen/QR +50 -0
  66. data/vendor/eigen/Eigen/QtAlignedMalloc +39 -0
  67. data/vendor/eigen/Eigen/SPQRSupport +34 -0
  68. data/vendor/eigen/Eigen/SVD +50 -0
  69. data/vendor/eigen/Eigen/Sparse +34 -0
  70. data/vendor/eigen/Eigen/SparseCholesky +37 -0
  71. data/vendor/eigen/Eigen/SparseCore +69 -0
  72. data/vendor/eigen/Eigen/SparseLU +50 -0
  73. data/vendor/eigen/Eigen/SparseQR +36 -0
  74. data/vendor/eigen/Eigen/StdDeque +27 -0
  75. data/vendor/eigen/Eigen/StdList +26 -0
  76. data/vendor/eigen/Eigen/StdVector +27 -0
  77. data/vendor/eigen/Eigen/SuperLUSupport +64 -0
  78. data/vendor/eigen/Eigen/UmfPackSupport +40 -0
  79. data/vendor/eigen/README.md +5 -0
  80. data/vendor/eigen/bench/README.txt +55 -0
  81. data/vendor/eigen/bench/btl/COPYING +340 -0
  82. data/vendor/eigen/bench/btl/README +154 -0
  83. data/vendor/eigen/bench/tensors/README +20 -0
  84. data/vendor/eigen/blas/README.txt +6 -0
  85. data/vendor/eigen/ci/README.md +56 -0
  86. data/vendor/eigen/demos/mandelbrot/README +10 -0
  87. data/vendor/eigen/demos/mix_eigen_and_c/README +9 -0
  88. data/vendor/eigen/demos/opengl/README +13 -0
  89. data/vendor/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +1815 -0
  90. data/vendor/eigen/unsupported/README.txt +50 -0
  91. data/vendor/tomotopy/LICENSE +21 -0
  92. data/vendor/tomotopy/README.kr.rst +512 -0
  93. data/vendor/tomotopy/README.rst +516 -0
  94. data/vendor/variant/LICENSE +25 -0
  95. data/vendor/variant/LICENSE_1_0.txt +23 -0
  96. data/vendor/variant/README.md +102 -0
  97. metadata +140 -0
@@ -0,0 +1,50 @@
1
+ This directory contains contributions from various users.
2
+ They are provided "as is", without any support. Nevertheless,
3
+ most of them are subject to be included in Eigen in the future.
4
+
5
+ In order to use an unsupported module you have to do either:
6
+
7
+ - add the path_to_eigen/unsupported directory to your include path and do:
8
+ #include <Eigen/ModuleHeader>
9
+
10
+ - or directly do:
11
+ #include <unsupported/Eigen/ModuleHeader>
12
+
13
+
14
+ If you are interested in contributing to one of them, or have other stuff
15
+ you would like to share, feel free to contact us:
16
+ http://eigen.tuxfamily.org/index.php?title=Main_Page#Mailing_list
17
+
18
+ Any kind of contributions are much appreciated, even very preliminary ones.
19
+ However, it:
20
+ - must rely on Eigen,
21
+ - must be highly related to math,
22
+ - should have some general purpose in the sense that it could
23
+ potentially become an official Eigen module (or be merged into another one).
24
+
25
+ In doubt feel free to contact us. For instance, if your addons is very too specific
26
+ but it shows an interesting way of using Eigen, then it could be a nice demo.
27
+
28
+
29
+ This directory is organized as follow:
30
+
31
+ unsupported/Eigen/ModuleHeader1
32
+ unsupported/Eigen/ModuleHeader2
33
+ unsupported/Eigen/...
34
+ unsupported/Eigen/src/Module1/SourceFile1.h
35
+ unsupported/Eigen/src/Module1/SourceFile2.h
36
+ unsupported/Eigen/src/Module1/...
37
+ unsupported/Eigen/src/Module2/SourceFile1.h
38
+ unsupported/Eigen/src/Module2/SourceFile2.h
39
+ unsupported/Eigen/src/Module2/...
40
+ unsupported/Eigen/src/...
41
+ unsupported/doc/snippets/.cpp <- code snippets for the doc
42
+ unsupported/doc/examples/.cpp <- examples for the doc
43
+ unsupported/doc/TutorialModule1.dox
44
+ unsupported/doc/TutorialModule2.dox
45
+ unsupported/doc/...
46
+ unsupported/test/.cpp <- unit test files
47
+
48
+ The documentation is generated at the same time than the main Eigen documentation.
49
+ The .html files are generated in: build_dir/doc/html/unsupported/
50
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019, bab2min
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,512 @@
1
+ tomotopy
2
+ ========
3
+
4
+ .. image:: https://badge.fury.io/py/tomotopy.svg
5
+ :target: https://pypi.python.org/pypi/tomotopy
6
+
7
+ .. image:: https://zenodo.org/badge/186155463.svg
8
+ :target: https://zenodo.org/badge/latestdoi/186155463
9
+
10
+ 🎌
11
+ `English`_,
12
+ **한국어**.
13
+
14
+ .. _English: README.rst
15
+
16
+ tomotopy 란?
17
+ ------------------
18
+ `tomotopy`는 토픽 모델링 툴인 `tomoto`의 Python 확장 버전입니다. `tomoto`는 c++로 작성된 깁스 샘플링 기반의 토픽 모델링 라이브러리로,
19
+ 최신 CPU의 벡터화 기술을 활용하여 처리 속도를 최대로 끌어올렸습니다.
20
+ 현재 버전의 `tomoto`에서는 다음과 같은 주요 토픽 모델들을 지원하고 있습니다.
21
+
22
+ * Latent Dirichlet Allocation (`tomotopy.LDAModel`)
23
+ * Labeled LDA (`tomotopy.LLDAModel`)
24
+ * Partially Labeled LDA (`tomotopy.PLDAModel`)
25
+ * Supervised LDA (`tomotopy.SLDAModel`)
26
+ * Dirichlet Multinomial Regression (`tomotopy.DMRModel`)
27
+ * Generalized Dirichlet Multinomial Regression (`tomotopy.GDMRModel`)
28
+ * Hierarchical Dirichlet Process (`tomotopy.HDPModel`)
29
+ * Hierarchical LDA (`tomotopy.HLDAModel`)
30
+ * Multi Grain LDA (`tomotopy.MGLDAModel`)
31
+ * Pachinko Allocation (`tomotopy.PAModel`)
32
+ * Hierarchical PA (`tomotopy.HPAModel`)
33
+ * Correlated Topic Model (`tomotopy.CTModel`)
34
+ * Dynamic Topic Model (`tomotopy.DTModel`)
35
+ * Pseudo-document based Topic Model (`tomotopy.PTModel`)
36
+
37
+ 더 자세한 정보는 https://bab2min.github.io/tomotopy/index.kr.html 에서 확인하시길 바랍니다.
38
+
39
+ 시작하기
40
+ ---------------
41
+ 다음과 같이 pip를 이용하면 tomotopy를 쉽게 설치할 수 있습니다.
42
+ ::
43
+
44
+ $ pip install --upgrade pip
45
+ $ pip install tomotopy
46
+
47
+ 지원하는 운영체제 및 Python 버전은 다음과 같습니다:
48
+
49
+ * Python 3.6 이상이 설치된 Linux (x86-64)
50
+ * Python 3.6 이상이 설치된 macOS 10.13나 그 이후 버전
51
+ * Python 3.6 이상이 설치된 Windows 7이나 그 이후 버전 (x86, x86-64)
52
+ * Python 3.6 이상이 설치된 다른 운영체제: 이 경우는 c++14 호환 컴파일러를 통한 소스코드 컴파일이 필요합니다.
53
+
54
+ 설치가 끝난 뒤에는 다음과 같이 Python3에서 바로 import하여 tomotopy를 사용할 수 있습니다.
55
+ ::
56
+
57
+ import tomotopy as tp
58
+ print(tp.isa) # 'avx2'나 'avx', 'sse2', 'none'를 출력합니다.
59
+
60
+ 현재 tomotopy는 가속을 위해 AVX2, AVX or SSE2 SIMD 명령어 세트를 활용할 수 있습니다.
61
+ 패키지가 import될 때 현재 환경에서 활용할 수 있는 최선의 명령어 세트를 확인하여 최상의 모듈을 자동으로 가져옵니다.
62
+ 만약 `tp.isa`가 `none`이라면 현재 환경에서 활용 가능한 SIMD 명령어 세트가 없는 것이므로 훈련에 오랜 시간이 걸릴 수 있습니다.
63
+ 그러나 최근 대부분의 Intel 및 AMD CPU에서는 SIMD 명령어 세트를 지원하므로 SIMD 가속이 성능을 크게 향상시킬 수 있을 것입니다.
64
+
65
+ 간단한 예제로 'sample.txt' 파일로 LDA 모델을 학습하는 코드는 다음과 같습니다.
66
+ ::
67
+
68
+ import tomotopy as tp
69
+ mdl = tp.LDAModel(k=20)
70
+ for line in open('sample.txt'):
71
+ mdl.add_doc(line.strip().split())
72
+
73
+ for i in range(0, 100, 10):
74
+ mdl.train(10)
75
+ print('Iteration: {}\tLog-likelihood: {}'.format(i, mdl.ll_per_word))
76
+
77
+ for k in range(mdl.k):
78
+ print('Top 10 words of topic #{}'.format(k))
79
+ print(mdl.get_topic_words(k, top_n=10))
80
+
81
+ mdl.summary()
82
+
83
+ tomotopy의 성능
84
+ -----------------------
85
+ `tomotopy`는 주제 분포와 단어 분포를 추론하기 위해 Collapsed Gibbs-Sampling(CGS) 기법을 사용합니다.
86
+ 일반적으로 CGS는 `gensim의 LdaModel`_가 이용하는 Variational Bayes(VB) 보다 느리게 수렴하지만 각각의 반복은 빠르게 계산 가능합니다.
87
+ 게다가 `tomotopy`는 멀티스레드를 지원하므로 SIMD 명령어 세트뿐만 아니라 다중 코어 CPU의 장점까지 활용할 수 있습니다. 이 덕분에 각각의 반복이 훨씬 빠르게 계산 가능합니다.
88
+
89
+ .. _gensim의 LdaModel: https://radimrehurek.com/gensim/models/ldamodel.html
90
+
91
+ 다음의 차트는 `tomotopy`와 `gensim`의 LDA 모형 실행 시간을 비교하여 보여줍니다.
92
+ 입력 문헌은 영어 위키백과에서 가져온 1000개의 임의 문서이며 전체 문헌 집합은 총 1,506,966개의 단어로 구성되어 있습니다. (약 10.1 MB).
93
+ `tomotopy`는 200회를, `gensim` 10회를 반복 학습하였습니다.
94
+
95
+ .. image:: https://bab2min.github.io/tomotopy/images/tmt_i5.png
96
+
97
+ Intel i5-6600, x86-64 (4 cores)에서의 성능
98
+
99
+ .. image:: https://bab2min.github.io/tomotopy/images/tmt_xeon.png
100
+
101
+ Intel Xeon E5-2620 v4, x86-64 (8 cores, 16 threads)에서의 성능
102
+
103
+ `tomotopy`가 20배 더 많이 반복하였지만 전체 실행시간은 `gensim`보다 5~10배 더 빨랐습니다. 또한 `tomotopy`는 전반적으로 안정적인 결과를 보여주고 있습니다.
104
+
105
+ CGS와 VB는 서로 접근방법이 아예 다른 기법이기 때문에 둘을 직접적으로 비교하기는 어렵습니다만, 실용적인 관점에서 두 기법의 속도와 결과물을 비교해볼 수 있습니다.
106
+ 다음의 차트에는 두 기법이 학습 후 보여준 단어당 로그 가능도 값이 표현되어 있습니다.
107
+
108
+ .. image:: https://bab2min.github.io/tomotopy/images/LLComp.png
109
+
110
+ 어떤 SIMD 명령어 세트를 사용하는지는 성능에 큰 영향을 미칩니다.
111
+ 다음 차트는 SIMD 명령어 세트에 따른 성능 차이를 보여줍니다.
112
+
113
+ .. image:: https://bab2min.github.io/tomotopy/images/SIMDComp.png
114
+
115
+ 다행히도 최신 x86-64 CPU들은 대부분 AVX2 명령어 세트를 지원하기 때문에 대부분의 경우 AVX2의 높은 성능을 활용할 수 있을 것입니다.
116
+
117
+ 모델의 저장과 불러오기
118
+ -------------------
119
+ `tomotopy`는 각각의 토픽 모델 클래스에 대해 `save`와 `load` 메소드를 제공합니다.
120
+ 따라서 학습이 끝난 모델을 언제든지 파일에 저장하거나, 파일로부터 다시 읽어와서 다양한 작업을 수행할 수 있습니다.
121
+ ::
122
+
123
+ import tomotopy as tp
124
+
125
+ mdl = tp.HDPModel()
126
+ for line in open('sample.txt'):
127
+ mdl.add_doc(line.strip().split())
128
+
129
+ for i in range(0, 100, 10):
130
+ mdl.train(10)
131
+ print('Iteration: {}\tLog-likelihood: {}'.format(i, mdl.ll_per_word))
132
+
133
+ # 파일에 저장
134
+ mdl.save('sample_hdp_model.bin')
135
+
136
+ # 파일로부터 불러오기
137
+ mdl = tp.HDPModel.load('sample_hdp_model.bin')
138
+ for k in range(mdl.k):
139
+ if not mdl.is_live_topic(k): continue
140
+ print('Top 10 words of topic #{}'.format(k))
141
+ print(mdl.get_topic_words(k, top_n=10))
142
+
143
+ # 저장된 모델이 HDP 모델이었기 때문에,
144
+ # LDA 모델에서 이 파일을 읽어오려고 하면 예외가 발생합니다.
145
+ mdl = tp.LDAModel.load('sample_hdp_model.bin')
146
+
147
+ 파일로부터 모델을 불러올 때는 반드시 저장된 모델의 타입과 읽어올 모델의 타입이 일치해야합니다.
148
+
149
+ 이에 대해서는 `tomotopy.LDAModel.save`와 `tomotopy.LDAModel.load`에서 더 자세한 내용을 확인할 수 있습니다.
150
+
151
+ 모델 안의 문헌과 모델 밖의 문헌
152
+ -------------------------------------------
153
+ 토픽 모델은 크게 2가지 목적으로 사용할 수 있습니다.
154
+ 기본적으로는 문헌 집합으로부터 모델을 학습하여 문헌 내의 주제들을 발견하기 위해 토픽 모델을 사용할 수 있으며,
155
+ 더 나아가 학습된 모델을 활용하여 학습할 때는 주어지지 않았던 새로운 문헌에 대해 주제 분포를 추론하는 것도 가능합니다.
156
+ 전자의 과정에서 사용되는 문헌(학습 과정에서 사용되는 문헌)을 **모델 안의 문헌**,
157
+ 후자의 과정에서 주어지는 새로운 문헌(학습 과정에 포함되지 않았던 문헌)을 **모델 밖의 문헌**이라고 가리키도록 하겠습니다.
158
+
159
+ `tomotopy`에서 이 두 종류의 문헌을 생성하는 방법은 다릅니다. **모델 안의 문헌**은 `tomotopy.LDAModel.add_doc`을 이용하여 생성합니다.
160
+ add_doc은 `tomotopy.LDAModel.train`을 시작하기 전까지만 사용할 수 있습니다.
161
+ 즉 train을 시작한 이후로는 학습 문헌 집합이 고정되기 때문에 add_doc을 이용하여 새로운 문헌을 모델 내에 추가할 수 없습니다.
162
+
163
+ 또한 생성된 문헌의 인스턴스를 얻기 위해서는 다음과 같이 `tomotopy.LDAModel.docs`를 사용해야 합니다.
164
+
165
+ ::
166
+
167
+ mdl = tp.LDAModel(k=20)
168
+ idx = mdl.add_doc(words)
169
+ if idx < 0: raise RuntimeError("Failed to add doc")
170
+ doc_inst = mdl.docs[idx]
171
+ # doc_inst is an instance of the added document
172
+
173
+ **모델 밖의 문헌**은 `tomotopy.LDAModel.make_doc`을 이용해 생성합니다. make_doc은 add_doc과 반대로 train을 시작한 이후에 사용할 수 있습니다.
174
+ 만약 train을 시작하기 전에 make_doc을 사용할 경우 올바르지 않은 결과를 얻게 되니 이 점 유의하시길 바랍니다. make_doc은 바로 인스턴스를 반환하므로 반환값을 받아 바로 사용할 수 있습니다.
175
+
176
+ ::
177
+
178
+ mdl = tp.LDAModel(k=20)
179
+ # add_doc ...
180
+ mdl.train(100)
181
+ doc_inst = mdl.make_doc(unseen_doc) # doc_inst is an instance of the unseen document
182
+
183
+ 새로운 문헌에 대해 추론하기
184
+ ------------------------------
185
+ `tomotopy.LDAModel.make_doc`을 이용해 새로운 문헌을 생성했다면 이를 모델에 입력해 주제 분포를 추론하도록 할 수 있습니다.
186
+ 새로운 문헌에 대한 추론은 `tomotopy.LDAModel.infer`를 사용합니다.
187
+
188
+ ::
189
+
190
+ mdl = tp.LDAModel(k=20)
191
+ # add_doc ...
192
+ mdl.train(100)
193
+ doc_inst = mdl.make_doc(unseen_doc)
194
+ topic_dist, ll = mdl.infer(doc_inst)
195
+ print("Topic Distribution for Unseen Docs: ", topic_dist)
196
+ print("Log-likelihood of inference: ", ll)
197
+
198
+ infer 메소드는 `tomotopy.Document` 인스턴스 하나를 추론하거나 `tomotopy.Document` 인스턴스의 `list`를 추론하는데 사용할 수 있습니다.
199
+ 자세한 것은 `tomotopy.LDAModel.infer`을 참조하길 바랍니다.
200
+
201
+ Corpus와 transform
202
+ --------------------
203
+ `tomotopy`의 모든 토픽 모델들은 각자 별도의 내부적인 문헌 타입을 가지고 있습니다.
204
+ 그리고 이 문헌 타입들에 맞는 문헌들은 각 모델의 `add_doc` 메소드를 통해 생성될 수 있습니다.
205
+ 하지만 이 때문에 동일한 목록의 문헌들을 서로 다른 토픽 모델에 입력해야 하는 경우
206
+ 매 모델에 각 문헌을 추가할때마다 `add_doc`을 호출해야하기 때문에 비효율이 발생합니다.
207
+ 따라서 `tomotopy`에서는 여러 문헌을 묶어서 관리해주는 `tomotopy.utils.Corpus` 클래스를 제공합니다.
208
+ 토픽 모델 객체를 생성할때 `tomotopy.utils.Corpus`를 `__init__` 메소드의 `corpus` 인자로 넘겨줌으로써
209
+ 어떤 모델에든 쉽게 문헌들을 삽입할 수 있게 해줍니다.
210
+ `tomotopy.utils.Corpus`를 토픽 모델에 삽입하면 corpus 객체가 가지고 있는 문헌들 전부가 모델에 자동으로 삽입됩니다.
211
+
212
+ 그런데 일부 토픽 모델의 경우 문헌을 생성하기 위해 서로 다른 데이터를 요구합니다.
213
+ 예를 들어 `tomotopy.DMRModel`는 `metadata`라는 `str` 타입의 데이터를 요구하고,
214
+ `tomotopy.PLDAModel`는 `labels`라는 `List[str]` 타입의 데이터를 요구합니다.
215
+ 그러나 `tomotopy.utils.Corpus`는 토픽 모델에 종속되지 않은 독립적인 문헌 데이터를 보관하기 때문에,
216
+ corpus가 가지고 있는 문헌 데이터가 실제 토픽 모델이 요구하는 데이터와 일치하지 않을 가능성이 있습니다.
217
+ 이 경우 `transform`라는 인자를 통해 corpus 내의 데이터를 변형시켜 토픽 모델이 요구하는 실제 데이터와 일치시킬 수 있습니다.
218
+ 자세한 내용은 아래의 코드를 확인해주세요:
219
+
220
+ ::
221
+
222
+ from tomotopy import DMRModel
223
+ from tomotopy.utils import Corpus
224
+
225
+ corpus = Corpus()
226
+ corpus.add_doc("a b c d e".split(), a_data=1)
227
+ corpus.add_doc("e f g h i".split(), a_data=2)
228
+ corpus.add_doc("i j k l m".split(), a_data=3)
229
+
230
+ model = DMRModel(k=10)
231
+ model.add_corpus(corpus)
232
+ # `corpus`에 있던 `a_data`는 사라지고
233
+ # `DMRModel`이 요구하는 `metadata`에는 기본값인 빈 문자열이 채워집니다.
234
+
235
+ assert model.docs[0].metadata == ''
236
+ assert model.docs[1].metadata == ''
237
+ assert model.docs[2].metadata == ''
238
+
239
+ def transform_a_data_to_metadata(misc: dict):
240
+ return {'metadata': str(misc['a_data'])}
241
+ # 이 함수는 `a_data`를 `metadata`로 변환합니다.
242
+
243
+ model = DMRModel(k=10)
244
+ model.add_corpus(corpus, transform=transform_a_data_to_metadata)
245
+ # 이제 `model`에는 기본값이 아닌 `metadata`가 입력됩니다. 이들은 `transform`에 의해 `a_data`로부터 생성됩니다.
246
+
247
+ assert model.docs[0].metadata == '1'
248
+ assert model.docs[1].metadata == '2'
249
+ assert model.docs[2].metadata == '3'
250
+
251
+
252
+ 병렬 샘플링 알고리즘
253
+ ----------------------------
254
+ `tomotopy`는 0.5.0버전부터 병렬 알고리즘을 고를 수 있는 선택지를 제공합니다.
255
+ 0.4.2 이전버전까지 제공되던 알고리즘은 `COPY_MERGE`로 이 기법은 모든 토픽 모델에 사용 가능합니다.
256
+ 새로운 알고리즘인 `PARTITION`은 0.5.0이후부터 사용가능하며, 이를 사용하면 더 빠르고 메모리 효율적으로 학습을 수행할 수 있습니다. 단 이 기법은 일부 토픽 모델에 대해서만 사용 가능합니다.
257
+
258
+ 다음 차트는 토픽 개수와 코어 개수에 따라 두 기법의 속도 차이를 보여줍니다.
259
+
260
+ .. image:: https://bab2min.github.io/tomotopy/images/algo_comp.png
261
+
262
+ .. image:: https://bab2min.github.io/tomotopy/images/algo_comp2.png
263
+
264
+ 버전별 속도 차이
265
+ ----------------------
266
+ 아래 그래프는 버전별 속도 차이를 표시한 것입니다.
267
+ LDA모델로 1000회 iteration을 수행시 걸리는 시간을 초 단위로 표시하였습니다.
268
+ (Docs: 11314, Vocab: 60382, Words: 2364724, Intel Xeon Gold 5120 @2.2GHz)
269
+
270
+ .. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t1.png
271
+
272
+ .. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t4.png
273
+
274
+ .. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t8.png
275
+
276
+ 어휘 사전분포를 이용하여 주제 고정하기
277
+ --------------------------------------
278
+ 0.6.0 버전부터 `tomotopy.LDAModel.set_word_prior`라는 메소드가 추가되었습니다. 이 메소드로 특정 단어의 사전분포를 조절할 수 있습니다.
279
+ 예를 들어 다음 코드처럼 단어 'church'의 가중치를 Topic 0에 대해서는 1.0, 나머지 Topic에 대해서는 0.1로 설정할 수 있습니다.
280
+ 이는 단어 'church'가 Topic 0에 할당될 확률이 다른 Topic에 할당될 확률보다 10배 높다는 것을 의미하며, 따라서 대부분의 'church'는 Topic 0에 할당되게 됩니다.
281
+ 그리고 학습을 거치며 'church'와 관련된 단어들 역시 Topic 0에 모이게 되므로, 최종적으로 Topic 0은 'church'와 관련된 주제가 될 것입니다.
282
+ 이를 통해 특정 내용의 주제를 원하는 Topic 번호에 고정시킬 수 있습니다.
283
+
284
+ ::
285
+
286
+ import tomotopy as tp
287
+ mdl = tp.LDAModel(k=20)
288
+
289
+ # add documents into `mdl`
290
+
291
+ # setting word prior
292
+ mdl.set_word_prior('church', [1.0 if k == 0 else 0.1 for k in range(20)])
293
+
294
+ 자세한 내용은 `example.py`의 `word_prior_example` 함수를 참조하십시오.
295
+
296
+ 예제 코드
297
+ ---------
298
+ tomotopy의 Python3 예제 코드는 https://github.com/bab2min/tomotopy/blob/main/examples/ 를 확인하시길 바랍니다.
299
+
300
+ 예제 코드에서 사용했던 데이터 파일은 https://drive.google.com/file/d/18OpNijd4iwPyYZ2O7pQoPyeTAKEXa71J/view 에서 다운받을 수 있습니다.
301
+
302
+ 라이센스
303
+ ---------
304
+ `tomotopy`는 MIT License 하에 배포됩니다.
305
+
306
+ 역사
307
+ -------
308
+ * 0.12.3 (2022-07-19)
309
+ * 기능 개선
310
+ * 이제 `tomotopy.LDAModel.add_doc()`로 빈 문서를 삽입할 경우 예외를 발생시키는 대신 그냥 무시합니다. 새로 추가된 인자인 `ignore_empty_words`를 False로 설정할 경우 이전처럼 예외를 발생시킵니다.
311
+ * 유효하지 않은 토픽들을 모델에서 제거하는 `tomotopy.HDPModel.purge_dead_topics()` 메소드가 추가되었습니다.
312
+ * 버그 수정
313
+ * `tomotopy.SLDAModel`에서 `nuSq` 값을 지정할 때 발생하는 문제를 해결했습니다. (by @jucendrero)
314
+ * `tomotopy.utils.Coherence`가 `tomotopy.DTModel`에 대해서 작동하지 않는 문제를 해결했습니다.
315
+ * `train()` 호출 전에 `make_dic()`을 호출할 때 종종 크래시가 발생하는 문제를 해결했습니다.
316
+ * seed가 고정된 상태에서도 `tomotopy.DMRModel`, `tomotopy.GDMRModel`의 결과가 다르게 나오는 문제를 해결했습니다.
317
+ * `tomotopy.DMRModel`, `tomotopy.GDMRModel`의 파라미터 최적화 과정이 부정확하던 문제를 해결했습니다.
318
+ * `tomotopy.PTModel.copy()` 호출 시 종종 크래시가 발생하는 문제를 해결했습니다.
319
+ * 싱글스레드에서의 작동 효율을 개선했습니다.
320
+
321
+ * 0.12.2 (2021-09-06)
322
+ * `min_cf > 0`, `min_df > 0`나 `rm_top > 0`로 설정된 `tomotopy.HDPModel`에서 `convert_to_lda`를 호출할때 크래시가 발생하는 문제를 해결했습니다.
323
+ * `tomotopy.Document.get_topics`와 `tomotopy.Document.get_topic_dist`에 `from_pseudo_doc` 인자가 추가되었습니다.
324
+ 이 인자는 `PTModel`에 대해서만 유효하며, 이를 통해 토픽 분포를 구할 때 가상 문헌을 사용할지 여부를 선택할 수 있습니다.
325
+ * `tomotopy.PTModel` 생성시 기본 인자값이 변경되었습니다. `p`를 생략시 `k * 10`으로 설정됩니다.
326
+ * `make_doc`으로 생성한 문헌을 `infer` 없이 사용할 경우 발생하는 크래시를 해결하고 경고 메세지를 추가했습니다.
327
+ * 내부 C++코드가 clang c++17 환경에서 컴파일에 실패하는 문제를 해결했습니다.
328
+
329
+ * 0.12.1 (2021-06-20)
330
+ * `tomotopy.LDAModel.set_word_prior()`가 크래시를 발생시키던 문제를 해결했습니다.
331
+ * 이제 `tomotopy.LDAModel.perplexity`와 `tomotopy.LDAModel.ll_per_word`가 TermWeight가 ONE이 아닌 경우에도 정확한 값을 반환합니다.
332
+ * 용어가중치가 적용된 빈도수를 반환하는 `tomotopy.LDAModel.used_vocab_weighted_freq`가 추가되었습니다.
333
+ * 이제 `tomotopy.LDAModel.summary()`가 단어의 엔트로피뿐만 아니라, 용어 가중치가 적용된 단어의 엔트로피도 함께 보여줍니다.
334
+
335
+ * 0.12.0 (2021-04-26)
336
+ * 이제 `tomotopy.DMRModel`와 `tomotopy.GDMRModel`가 다중 메타데이터를 지원합니다. (https://github.com/bab2min/tomotopy/blob/main/examples/dmr_multi_label.py 참조)
337
+ * `tomotopy.GDMRModel`의 성능이 개선되었습니다.
338
+ * 깊은 복사를 수행하는 `copy()` 메소드가 모든 토픽 모델 클래스에 추가되었습니다.
339
+ * `min_cf`, `min_df` 등에 의해 학습에서 제외된 단어가 잘못된 토픽id값을 가지는 문제가 해결되었습니다. 이제 제외단 단어들은 토픽id로 모두 `-1` 값을 가집니다.
340
+ * 이제 `tomotopy`에 의해 생성되는 예외 및 경고가 모두 Python 표준 타입을 따릅니다.
341
+ * 컴파일러 요구사항이 C++14로 상향되었습니다.
342
+
343
+ * 0.11.1 (2021-03-28)
344
+ * 비대칭 alpha와 관련된 치명적인 버그가 수정되었습니다. 이 버그로 인해 0.11.0 버전은 릴리즈에서 삭제되었습니다.
345
+
346
+ * 0.11.0 (2021-03-26)
347
+ * 짧은 텍스트를 위한 토픽 모델인 `tomotopy.PTModel`가 추가되었습니다.
348
+ * `tomotopy.HDPModel.infer`가 종종 segmentation fault를 발생시키는 문제가 해결되었습니다.
349
+ * numpy API 버전 충돌이 해결되었습니다.
350
+ * 이제 비대칭 문헌-토픽 사전 분포가 지원됩니다.
351
+ * 토픽 모델 객체를 메모리 상의 `bytes`로 직렬화하는 기능이 지원됩니다.
352
+ * `get_topic_dist()`, `get_topic_word_dist()`, `get_sub_topic_dist()`에 결과의 정규화 여부를 조절하는 `normalize` 인자가 추가되었습니다.
353
+ * `tomotopy.DMRModel.lambdas`와 `tomotopy.DMRModel.alpha`가 잘못된 값을 제공하던 문제가 해결되었습니다.
354
+ * `tomotopy.GDMRModel`에 범주형 메타데이터 지원이 추가되었습니다. (https://github.com/bab2min/tomotopy/blob/main/examples/gdmr_both_categorical_and_numerical.py 참조)
355
+ * Python3.5 지원이 종료되었습니다.
356
+
357
+ * 0.10.2 (2021-02-16)
358
+ * `tomotopy.CTModel.train`가 큰 K값에 대해 실패하는 문제가 수정되었습니다.
359
+ * `tomotopy.utils.Corpus`가 `uid`값을 잃는 문제가 수정되었습니다.
360
+
361
+ * 0.10.1 (2021-02-14)
362
+ * `tomotopy.utils.Corpus.extract_ngrams`에 빈 문헌을 입력시 발생하던 에러를 수정했습니다.
363
+ * `tomotopy.LDAModel.infer`가 올바른 입력에도 예외를 발생시키던 문제를 수정했습니다.
364
+ * `tomotopy.HLDAModel.infer`가 잘못된 `tomotopy.Document.path` 값을 생성하는 문제를 수정했습니다.
365
+ * `tomotopy.HLDAModel.train`에 새로운 파라미터 `freeze_topics`가 추가되었습니다. 이를 통해 학습 시 신규 토픽 생성 여부를 조정할 수 있습니다.
366
+
367
+ * 0.10.0 (2020-12-19)
368
+ * `tomotopy.utils.Corpus`와 `tomotopy.LDAModel.docs` 간의 인터페이스가 통일되었습니다. 이제 동일한 방법으로 코퍼스 내의 문헌들에 접근할 수 있습니다.
369
+ * `tomotopy.utils.Corpus`의 __getitem__이 개선되었습니다. int 타입 인덱싱뿐만 아니라 Iterable[int]나 slicing를 이용한 다중 인덱싱, uid를 이용한 인덱싱 등이 제공됩니다.
370
+ * `tomotopy.utils.Corpus.extract_ngrams`와 `tomotopy.utils.Corpus.concat_ngrams`이 추가되었습니다. PMI를 이용해 코퍼스 내에서 자동으로 n-gram collocation을 발견해 한 단어로 합치는 기능을 수행합니다.
371
+ * `tomotopy.LDAModel.add_corpus`가 추가되었고, `tomotopy.LDAModel.infer`가 Raw 코퍼스를 입력으로 받을 수 있게 되었습니다.
372
+ * `tomotopy.coherence` 모듈이 추가되었습니다. 생성된 토픽 모델의 coherence를 계산하는 기능을 담당합니다.
373
+ * `tomotopy.label.FoRelevance`에 window_size 파라미터가 추가되었습니다.
374
+ * `tomotopy.HDPModel` 학습 시 종종 NaN이 발생하는 문제를 해결했습니다.
375
+ * 이제 Python3.9를 지원합니다.
376
+ * py-cpuinfo에 대한 의존성이 제거되고, 모듈 로딩속도가 개선되었습니다.
377
+
378
+ * 0.9.1 (2020-08-08)
379
+ * 0.9.0 버전의 메모리 누수 문제가 해결되었습니다.
380
+ * `tomotopy.CTModel.summary()`가 잘못된 결과를 출력하는 문제가 해결되었습니다.
381
+
382
+ * 0.9.0 (2020-08-04)
383
+ * 모델의 상태를 알아보기 쉽게 출력해주는 `tomotopy.LDAModel.summary()` 메소드가 추가되었습니다.
384
+ * 난수 생성기를 `EigenRand`_로 대체하여 생성 속도를 높이고 플랫폼 간의 결과 차이를 해소하였습니다.
385
+ * 이로 인해 `seed`가 동일해도 모델 학습 결과가 0.9.0 이전 버전과 달라질 수 있습니다.
386
+ * `tomotopy.HDPModel`에서 간헐적으로 발생하는 학습 오류를 수정했습니다.
387
+ * 이제 `tomotopy.DMRModel.alpha`가 메타데이터별 토픽 분포의 사전 파라미터를 보여줍니다.
388
+ * `tomotopy.DTModel.get_count_by_topics()`가 2차원 `ndarray`를 반환하도록 수정되었습니다.
389
+ * `tomotopy.DTModel.alpha`가 `tomotopy.DTModel.get_alpha()`와 동일한 값을 반환하도록 수정되었습니다.
390
+ * `tomotopy.GDMRModel`의 document에 대해 `metadata` 값을 얻어올 수 없던 문제가 해결되었습니다.
391
+ * 이제 `tomotopy.HLDAModel.alpha`가 문헌별 계층 분포의 사전 파라미터를 보여줍니다.
392
+ * `tomotopy.LDAModel.global_step`이 추가되었습니다.
393
+ * 이제 `tomotopy.MGLDAModel.get_count_by_topics()`가 전역 토픽과 지역 토픽 모두의 단어 개수를 보여줍니다.
394
+ * `tomotopy.PAModel.alpha`, `tomotopy.PAModel.subalpha`, `tomotopy.PAModel.get_count_by_super_topic()`이 추가되었습니다.
395
+
396
+ .. _EigenRand: https://github.com/bab2min/EigenRand
397
+
398
+ * 0.8.2 (2020-07-14)
399
+ * `tomotopy.DTModel.num_timepoints`와 `tomotopy.DTModel.num_docs_by_timepoint` 프로퍼티가 추가되었습니다.
400
+ * `seed`가 동일해도 플랫폼이 다르면 다른 결과를 내던 문제가 일부 해결되었습니다. 이로 인해 32bit 버전의 모델 학습 결과가 이전 버전과는 달라졌습니다.
401
+
402
+ * 0.8.1 (2020-06-08)
403
+ * `tomotopy.LDAModel.used_vocabs`가 잘못된 값을 반환하는 버그가 수정되었습니다.
404
+ * 이제 `tomotopy.CTModel.prior_cov`가 `[k, k]` 모양의 공분산 행렬을 반환합니다.
405
+ * 이제 인자 없이 `tomotopy.CTModel.get_correlations`를 호출하면 `[k, k]` 모양의 상관관계 행렬을 반환합니다.
406
+
407
+ * 0.8.0 (2020-06-06)
408
+ * NumPy가 tomotopy에 도입됨에 따라 많은 메소드와 프로퍼티들이 `list`가 아니라 `numpy.ndarray`를 반환하도록 변경되었습니다.
409
+ * Tomotopy에 새 의존관계 `NumPy >= 1.10.0`가 추가되었습니다..
410
+ * `tomotopy.HDPModel.infer`가 잘못된 추론을 하던 문제가 수정되었습니다.
411
+ * HDP 모델을 LDA 모델로 변환하는 메소드가 추가되었습니다.
412
+ * `tomotopy.LDAModel.used_vocabs`, `tomotopy.LDAModel.used_vocab_freq`, `tomotopy.LDAModel.used_vocab_df` 등의 새로운 프로퍼티가 모델에 추가되었습니다.
413
+ * 새로운 토픽 모델인 g-DMR(`tomotopy.GDMRModel`)가 추가되었습니다.
414
+ * macOS에서 `tomotopy.label.FoRelevance`를 생성할 때 발생하던 문제가 해결되었습니다.
415
+ * `tomotopy.utils.Corpus.add_doc`로 `raw`가 없는 문헌을 생성한 뒤 토픽 모델에 입력할 시 발생하는 오류를 수정했습니다.
416
+
417
+ * 0.7.1 (2020-05-08)
418
+ * `tomotopy.HLDAModel`용으로 `tomotopy.Document.path`가 새로 추가되었습니다.
419
+ * `tomotopy.label.PMIExtractor` 사용시에 발생하던 메모리 문제가 해결되었습니다.
420
+ * gcc 7에서 발생하던 컴파일 오류가 해결되었습니다.
421
+
422
+ * 0.7.0 (2020-04-18)
423
+ * `tomotopy.DTModel`이 추가되었습니다.
424
+ * `tomotopy.utils.Corpus.save`가 제대로 작동하지 않는 버그가 수정되었습니다.
425
+ * `tomotopy.Document.get_count_vector`가 추가되었습니다.
426
+ * 리눅스용 바이너리가 manylinux2010 버전으로 변경되었고 이에 따른 최적화가 진행되었습니다.
427
+
428
+ * 0.6.2 (2020-03-28)
429
+ * `save`와 `load`에 관련된 치명적인 버그가 수정되었습니다. 해당 버그로 0.6.0 및 0.6.1 버전은 릴리즈에서 삭제되었습니다.
430
+
431
+ * 0.6.1 (2020-03-22) (삭제됨)
432
+ * 모듈 로딩과 관련된 버그가 수정되었습니다.
433
+
434
+ * 0.6.0 (2020-03-22) (삭제됨)
435
+ * 대량의 문헌을 관리하기 위한 `tomotopy.utils.Corpus`가 추가되었습니다.
436
+ * 어휘-주제 분포의 사전 확률을 조절할 수 있는 `tomotopy.LDAModel.set_word_prior` 메소드가 추가되었습니다.
437
+ * 문헌 빈도를 기반으로 어휘를 필터링할 수 있도록 토픽 모델의 생성자에 `min_df`가 추가되었습니다.
438
+ * 토픽 라벨링 관련 서브모듈인 `tomotopy.label`이 추가되었습니다. 현재는 `tomotopy.label.FoRelevance`만 제공됩니다.
439
+
440
+ * 0.5.2 (2020-03-01)
441
+ * `tomotopy.LLDAModel.add_doc` 실행시 segmentation fault가 발생하는 문제를 해결했습니다.
442
+ * `tomotopy.HDPModel`에서 `infer` 실행시 종종 프로그램이 종료되는 문제를 해결했습니다.
443
+ * `tomotopy.LDAModel.infer`에서 ps=tomotopy.ParallelScheme.PARTITION, together=True로 실행시 발생하는 오류를 해결했습니다.
444
+
445
+ * 0.5.1 (2020-01-11)
446
+ * `tomotopy.SLDAModel.make_doc`에서 결측값을 지원하지 않던 문제를 해결했습니다.
447
+ * `tomotopy.SLDAModel`이 이제 결측값을 지원합니다. 결측값을 가진 문헌은 토픽 모델링에는 참여하지만, 응답 변수 회귀에서는 제외됩니다.
448
+
449
+ * 0.5.0 (2019-12-30)
450
+ * `tomotopy.PAModel.infer`가 topic distribution과 sub-topic distribution을 동시에 반환합니다.
451
+ * `tomotopy.Document`에 get_sub_topics, get_sub_topic_dist 메소드가 추가되었습니다. (PAModel 전용)
452
+ * `tomotopy.LDAModel.train` 및 `tomotopy.LDAModel.infer` 메소드에 parallel 옵션이 추가되었습니다. 이를 통해 학습 및 추론시 사용할 병렬화 알고리즘을 선택할 수 있습니다.
453
+ * `tomotopy.ParallelScheme.PARTITION` 알고리즘이 추가되었습니다. 이 알고리즘은 작업자 수가 많거나 토픽의 개수나 어휘 크기가 클 때도 효율적으로 작동합니다.
454
+ * 모델 생성시 min_cf < 2일때 rm_top 옵션이 적용되지 않는 문제를 수정하였습니다.
455
+
456
+ * 0.4.2 (2019-11-30)
457
+ * `tomotopy.LLDAModel`와 `tomotopy.PLDAModel` 모델에서 토픽 할당이 잘못 일어나던 문제를 해결했습니다.
458
+ * `tomotopy.Document` 및 `tomotopy.Dictionary` 클래스에 가독성이 좋은 __repr__가 추가되었습니다.
459
+
460
+ * 0.4.1 (2019-11-27)
461
+ * `tomotopy.PLDAModel` 생성자의 버그를 수정했습니다.
462
+
463
+ * 0.4.0 (2019-11-18)
464
+ * `tomotopy.PLDAModel`와 `tomotopy.HLDAModel` 토픽 모델이 새로 추가되었습니다.
465
+
466
+ * 0.3.1 (2019-11-05)
467
+ * `min_cf` 혹은 `rm_top`가 설정되었을 때 `get_topic_dist()`의 반환값이 부정확한 문제를 수정하였습니다.
468
+ * `tomotopy.MGLDAModel` 모델의 문헌의 `get_topic_dist()`가 지역 토픽에 대한 분포도 함께 반환하도록 수정하였습니다..
469
+ * `tw=ONE`일때의 학습 속도가 개선되었습니다.
470
+
471
+ * 0.3.0 (2019-10-06)
472
+ * `tomotopy.LLDAModel` 토픽 모델이 새로 추가되었습니다.
473
+ * `HDPModel`을 학습할 때 프로그램이 종료되는 문제를 해결했습니다.
474
+ * `HDPModel`의 하이퍼파라미터 추정 기능이 추가되었습니다. 이 때문에 새 버전의 `HDPModel` 결과는 이전 버전과 다를 수 있습니다.
475
+ 이전 버전처럼 하이퍼파라미터 추정을 끄려면, `optim_interval`을 0으로 설정하십시오.
476
+
477
+ * 0.2.0 (2019-08-18)
478
+ * `tomotopy.CTModel`와 `tomotopy.SLDAModel` 토픽 모델이 새로 추가되었습니다.
479
+ * `rm_top` 파라미터 옵션이 모든 토픽 모델에 추가되었습니다.
480
+ * `PAModel`과 `HPAModel` 모델에서 `save`와 `load`가 제대로 작동하지 않는 문제를 해결하였습니다.
481
+ * `HDPModel` 인스턴스를 파일로부터 로딩할 때 종종 프로그램이 종료되는 문제를 해결하였습니다.
482
+ * `min_cf` > 0으로 설정하였을 때 `ll_per_word` 값이 잘못 계산되는 문제를 해결하였습니다.
483
+
484
+ * 0.1.6 (2019-08-09)
485
+ * macOS와 clang에서 제대로 컴파일되지 않는 문제를 해결했습니다.
486
+
487
+ * 0.1.4 (2019-08-05)
488
+ * `add_doc` 메소드가 빈 리스트를 받았을 때 발생하는 문제를 해결하였습니다.
489
+ * `tomotopy.PAModel.get_topic_words`가 하위토픽의 단어 분포를 제대로 반환하지 못하는 문제를 해결하였습니다.
490
+
491
+ * 0.1.3 (2019-05-19)
492
+ * `min_cf` 파라미터와 불용어 제거 기능이 모든 토픽 모델에 추가되었습니다.
493
+
494
+ * 0.1.0 (2019-05-12)
495
+ * **tomotopy**의 최초 버전
496
+
497
+ 다른 언어용 바인딩
498
+ -------------------
499
+ * Ruby: https://github.com/ankane/tomoto
500
+
501
+ 포함된 라이브러리들의 라이센스
502
+ -------------------------------
503
+ * Eigen:
504
+ This application uses the MPL2-licensed features of Eigen, a C++ template library for linear algebra.
505
+ A copy of the MPL2 license is available at https://www.mozilla.org/en-US/MPL/2.0/.
506
+ The source code of the Eigen library can be obtained at http://eigen.tuxfamily.org/.
507
+
508
+ * EigenRand: `MIT License
509
+ <licenses_bundled/EigenRand>`_
510
+
511
+ * Mapbox Variant: `BSD License
512
+ <licenses_bundled/MapboxVariant>`_