Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bab2min/tomotopy
Python package of Tomoto, the Topic Modeling Tool
https://github.com/bab2min/tomotopy
correlated-topic-model dirichlet-multinomial-regression hierarchical-dirichlet-processes latent-dirichlet-allocation nlp pachinko-allocation python-library supervised-lda topic-modeling topic-models
Last synced: 3 months ago
JSON representation
Python package of Tomoto, the Topic Modeling Tool
- Host: GitHub
- URL: https://github.com/bab2min/tomotopy
- Owner: bab2min
- License: mit
- Created: 2019-05-11T16:19:29.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2024-07-31T17:00:07.000Z (3 months ago)
- Last Synced: 2024-08-01T10:40:06.294Z (3 months ago)
- Topics: correlated-topic-model, dirichlet-multinomial-regression, hierarchical-dirichlet-processes, latent-dirichlet-allocation, nlp, pachinko-allocation, python-library, supervised-lda, topic-modeling, topic-models
- Language: C++
- Homepage: https://bab2min.github.io/tomotopy
- Size: 2.27 MB
- Stars: 553
- Watchers: 12
- Forks: 62
- Open Issues: 62
-
Metadata Files:
- Readme: README.kr.rst
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-topic-models - tomotopy - Python extension for C++ implementation using Gibbs sampling [:page_facing_up:](https://www.jmlr.org/papers/volume10/newman09a/newman09a.pdf) (Models / Hierarchical Dirichlet Process (HDP) [:page_facing_up:](https://papers.nips.cc/paper/2004/file/fb4ab556bc42d6f0ee0f9e24ec4d1af0-Paper.pdf))
README
tomotopy
========.. image:: https://badge.fury.io/py/tomotopy.svg
:target: https://pypi.python.org/pypi/tomotopy.. image:: https://zenodo.org/badge/186155463.svg
:target: https://zenodo.org/badge/latestdoi/186155463π
`English`_,
**νκ΅μ΄**... _English: README.rst
tomotopy λ?
------------------
`tomotopy`λ ν ν½ λͺ¨λΈλ§ ν΄μΈ `tomoto`μ Python νμ₯ λ²μ μ λλ€. `tomoto`λ c++λ‘ μμ±λ κΉμ€ μνλ§ κΈ°λ°μ ν ν½ λͺ¨λΈλ§ λΌμ΄λΈλ¬λ¦¬λ‘,
μ΅μ CPUμ 벑ν°ν κΈ°μ μ νμ©νμ¬ μ²λ¦¬ μλλ₯Ό μ΅λλ‘ λμ΄μ¬λ Έμ΅λλ€.
νμ¬ λ²μ μ `tomoto`μμλ λ€μκ³Ό κ°μ μ£Όμ ν ν½ λͺ¨λΈλ€μ μ§μνκ³ μμ΅λλ€.* Latent Dirichlet Allocation (`tomotopy.LDAModel`)
* Labeled LDA (`tomotopy.LLDAModel`)
* Partially Labeled LDA (`tomotopy.PLDAModel`)
* Supervised LDA (`tomotopy.SLDAModel`)
* Dirichlet Multinomial Regression (`tomotopy.DMRModel`)
* Generalized Dirichlet Multinomial Regression (`tomotopy.GDMRModel`)
* Hierarchical Dirichlet Process (`tomotopy.HDPModel`)
* Hierarchical LDA (`tomotopy.HLDAModel`)
* Multi Grain LDA (`tomotopy.MGLDAModel`)
* Pachinko Allocation (`tomotopy.PAModel`)
* Hierarchical PA (`tomotopy.HPAModel`)
* Correlated Topic Model (`tomotopy.CTModel`)
* Dynamic Topic Model (`tomotopy.DTModel`)
* Pseudo-document based Topic Model (`tomotopy.PTModel`)λ μμΈν μ 보λ https://bab2min.github.io/tomotopy/index.kr.html μμ νμΈνμκΈΈ λ°λλλ€.
μμνκΈ°
---------------
λ€μκ³Ό κ°μ΄ pipλ₯Ό μ΄μ©νλ©΄ tomotopyλ₯Ό μ½κ² μ€μΉν μ μμ΅λλ€.
::$ pip install --upgrade pip
$ pip install tomotopyμ§μνλ μ΄μ체μ λ° Python λ²μ μ λ€μκ³Ό κ°μ΅λλ€:
* Python 3.6 μ΄μμ΄ μ€μΉλ Linux (x86-64)
* Python 3.6 μ΄μμ΄ μ€μΉλ macOS 10.13λ κ·Έ μ΄ν λ²μ
* Python 3.6 μ΄μμ΄ μ€μΉλ Windows 7μ΄λ κ·Έ μ΄ν λ²μ (x86, x86-64)
* Python 3.6 μ΄μμ΄ μ€μΉλ λ€λ₯Έ μ΄μ체μ : μ΄ κ²½μ°λ c++14 νΈν μ»΄νμΌλ¬λ₯Ό ν΅ν μμ€μ½λ μ»΄νμΌμ΄ νμν©λλ€.μ€μΉκ° λλ λ€μλ λ€μκ³Ό κ°μ΄ Python3μμ λ°λ‘ importνμ¬ tomotopyλ₯Ό μ¬μ©ν μ μμ΅λλ€.
::import tomotopy as tp
print(tp.isa) # 'avx2'λ 'avx', 'sse2', 'none'λ₯Ό μΆλ ₯ν©λλ€.νμ¬ tomotopyλ κ°μμ μν΄ AVX2, AVX or SSE2 SIMD λͺ λ Ήμ΄ μΈνΈλ₯Ό νμ©ν μ μμ΅λλ€.
ν¨ν€μ§κ° importλ λ νμ¬ νκ²½μμ νμ©ν μ μλ μ΅μ μ λͺ λ Ήμ΄ μΈνΈλ₯Ό νμΈνμ¬ μ΅μμ λͺ¨λμ μλμΌλ‘ κ°μ Έμ΅λλ€.
λ§μ½ `tp.isa`κ° `none`μ΄λΌλ©΄ νμ¬ νκ²½μμ νμ© κ°λ₯ν SIMD λͺ λ Ήμ΄ μΈνΈκ° μλ κ²μ΄λ―λ‘ νλ ¨μ μ€λ μκ°μ΄ 걸릴 μ μμ΅λλ€.
κ·Έλ¬λ μ΅κ·Ό λλΆλΆμ Intel λ° AMD CPUμμλ SIMD λͺ λ Ήμ΄ μΈνΈλ₯Ό μ§μνλ―λ‘ SIMD κ°μμ΄ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ κ²μ λλ€.κ°λ¨ν μμ λ‘ 'sample.txt' νμΌλ‘ LDA λͺ¨λΈμ νμ΅νλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
::import tomotopy as tp
mdl = tp.LDAModel(k=20)
for line in open('sample.txt'):
mdl.add_doc(line.strip().split())
for i in range(0, 100, 10):
mdl.train(10)
print('Iteration: {}\tLog-likelihood: {}'.format(i, mdl.ll_per_word))
for k in range(mdl.k):
print('Top 10 words of topic #{}'.format(k))
print(mdl.get_topic_words(k, top_n=10))
mdl.summary()tomotopyμ μ±λ₯
-----------------------
`tomotopy`λ μ£Όμ λΆν¬μ λ¨μ΄ λΆν¬λ₯Ό μΆλ‘ νκΈ° μν΄ Collapsed Gibbs-Sampling(CGS) κΈ°λ²μ μ¬μ©ν©λλ€.
μΌλ°μ μΌλ‘ CGSλ `gensimμ LdaModel`_κ° μ΄μ©νλ Variational Bayes(VB) λ³΄λ€ λλ¦¬κ² μλ ΄νμ§λ§ κ°κ°μ λ°λ³΅μ λΉ λ₯΄κ² κ³μ° κ°λ₯ν©λλ€.
κ²λ€κ° `tomotopy`λ λ©ν°μ€λ λλ₯Ό μ§μνλ―λ‘ SIMD λͺ λ Ήμ΄ μΈνΈλΏλ§ μλλΌ λ€μ€ μ½μ΄ CPUμ μ₯μ κΉμ§ νμ©ν μ μμ΅λλ€. μ΄ λλΆμ κ°κ°μ λ°λ³΅μ΄ ν¨μ¬ λΉ λ₯΄κ² κ³μ° κ°λ₯ν©λλ€... _gensimμ LdaModel: https://radimrehurek.com/gensim/models/ldamodel.html
λ€μμ μ°¨νΈλ `tomotopy`μ `gensim`μ LDA λͺ¨ν μ€ν μκ°μ λΉκ΅νμ¬ λ³΄μ¬μ€λλ€.
μ λ ₯ λ¬Ένμ μμ΄ μν€λ°±κ³Όμμ κ°μ Έμ¨ 1000κ°μ μμ λ¬Έμμ΄λ©° μ 체 λ¬Έν μ§ν©μ μ΄ 1,506,966κ°μ λ¨μ΄λ‘ ꡬμ±λμ΄ μμ΅λλ€. (μ½ 10.1 MB).
`tomotopy`λ 200νλ₯Ό, `gensim` 10νλ₯Ό λ°λ³΅ νμ΅νμμ΅λλ€... image:: https://bab2min.github.io/tomotopy/images/tmt_i5.png
Intel i5-6600, x86-64 (4 cores)μμμ μ±λ₯
.. image:: https://bab2min.github.io/tomotopy/images/tmt_xeon.png
Intel Xeon E5-2620 v4, x86-64 (8 cores, 16 threads)μμμ μ±λ₯
`tomotopy`κ° 20λ°° λ λ§μ΄ λ°λ³΅νμμ§λ§ μ 체 μ€νμκ°μ `gensim`λ³΄λ€ 5~10λ°° λ λΉ¨λμ΅λλ€. λν `tomotopy`λ μ λ°μ μΌλ‘ μμ μ μΈ κ²°κ³Όλ₯Ό 보μ¬μ£Όκ³ μμ΅λλ€.
CGSμ VBλ μλ‘ μ κ·Όλ°©λ²μ΄ μμ λ€λ₯Έ κΈ°λ²μ΄κΈ° λλ¬Έμ λμ μ§μ μ μΌλ‘ λΉκ΅νκΈ°λ μ΄λ ΅μ΅λλ€λ§, μ€μ©μ μΈ κ΄μ μμ λ κΈ°λ²μ μλμ κ²°κ³Όλ¬Όμ λΉκ΅ν΄λ³Ό μ μμ΅λλ€.
λ€μμ μ°¨νΈμλ λ κΈ°λ²μ΄ νμ΅ ν 보μ¬μ€ λ¨μ΄λΉ λ‘κ·Έ κ°λ₯λ κ°μ΄ ννλμ΄ μμ΅λλ€... image:: https://bab2min.github.io/tomotopy/images/LLComp.png
μ΄λ€ SIMD λͺ λ Ήμ΄ μΈνΈλ₯Ό μ¬μ©νλμ§λ μ±λ₯μ ν° μν₯μ λ―ΈμΉ©λλ€.
λ€μ μ°¨νΈλ SIMD λͺ λ Ήμ΄ μΈνΈμ λ°λ₯Έ μ±λ₯ μ°¨μ΄λ₯Ό 보μ¬μ€λλ€... image:: https://bab2min.github.io/tomotopy/images/SIMDComp.png
λ€ννλ μ΅μ x86-64 CPUλ€μ λλΆλΆ AVX2 λͺ λ Ήμ΄ μΈνΈλ₯Ό μ§μνκΈ° λλ¬Έμ λλΆλΆμ κ²½μ° AVX2μ λμ μ±λ₯μ νμ©ν μ μμ κ²μ λλ€.
λͺ¨λΈμ μ μ₯κ³Ό λΆλ¬μ€κΈ°
-------------------
`tomotopy`λ κ°κ°μ ν ν½ λͺ¨λΈ ν΄λμ€μ λν΄ `save`μ `load` λ©μλλ₯Ό μ 곡ν©λλ€.
λ°λΌμ νμ΅μ΄ λλ λͺ¨λΈμ μΈμ λ μ§ νμΌμ μ μ₯νκ±°λ, νμΌλ‘λΆν° λ€μ μ½μ΄μμ λ€μν μμ μ μνν μ μμ΅λλ€.
::import tomotopy as tp
mdl = tp.HDPModel()
for line in open('sample.txt'):
mdl.add_doc(line.strip().split())
for i in range(0, 100, 10):
mdl.train(10)
print('Iteration: {}\tLog-likelihood: {}'.format(i, mdl.ll_per_word))
# νμΌμ μ μ₯
mdl.save('sample_hdp_model.bin')
# νμΌλ‘λΆν° λΆλ¬μ€κΈ°
mdl = tp.HDPModel.load('sample_hdp_model.bin')
for k in range(mdl.k):
if not mdl.is_live_topic(k): continue
print('Top 10 words of topic #{}'.format(k))
print(mdl.get_topic_words(k, top_n=10))
# μ μ₯λ λͺ¨λΈμ΄ HDP λͺ¨λΈμ΄μκΈ° λλ¬Έμ,
# LDA λͺ¨λΈμμ μ΄ νμΌμ μ½μ΄μ€λ €κ³ νλ©΄ μμΈκ° λ°μν©λλ€.
mdl = tp.LDAModel.load('sample_hdp_model.bin')νμΌλ‘λΆν° λͺ¨λΈμ λΆλ¬μ¬ λλ λ°λμ μ μ₯λ λͺ¨λΈμ νμ κ³Ό μ½μ΄μ¬ λͺ¨λΈμ νμ μ΄ μΌμΉν΄μΌν©λλ€.
μ΄μ λν΄μλ `tomotopy.LDAModel.save`μ `tomotopy.LDAModel.load`μμ λ μμΈν λ΄μ©μ νμΈν μ μμ΅λλ€.
λͺ¨λΈ μμ λ¬Ένκ³Ό λͺ¨λΈ λ°μ λ¬Έν
-------------------------------------------
ν ν½ λͺ¨λΈμ ν¬κ² 2κ°μ§ λͺ©μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
κΈ°λ³Έμ μΌλ‘λ λ¬Έν μ§ν©μΌλ‘λΆν° λͺ¨λΈμ νμ΅νμ¬ λ¬Έν λ΄μ μ£Όμ λ€μ λ°κ²¬νκΈ° μν΄ ν ν½ λͺ¨λΈμ μ¬μ©ν μ μμΌλ©°,
λ λμκ° νμ΅λ λͺ¨λΈμ νμ©νμ¬ νμ΅ν λλ μ£Όμ΄μ§μ§ μμλ μλ‘μ΄ λ¬Ένμ λν΄ μ£Όμ λΆν¬λ₯Ό μΆλ‘ νλ κ²λ κ°λ₯ν©λλ€.
μ μμ κ³Όμ μμ μ¬μ©λλ λ¬Έν(νμ΅ κ³Όμ μμ μ¬μ©λλ λ¬Έν)μ **λͺ¨λΈ μμ λ¬Έν**,
νμμ κ³Όμ μμ μ£Όμ΄μ§λ μλ‘μ΄ λ¬Έν(νμ΅ κ³Όμ μ ν¬ν¨λμ§ μμλ λ¬Έν)μ **λͺ¨λΈ λ°μ λ¬Έν**μ΄λΌκ³ κ°λ¦¬ν€λλ‘ νκ² μ΅λλ€.`tomotopy`μμ μ΄ λ μ’ λ₯μ λ¬Ένμ μμ±νλ λ°©λ²μ λ€λ¦ λλ€. **λͺ¨λΈ μμ λ¬Έν**μ `tomotopy.LDAModel.add_doc`μ μ΄μ©νμ¬ μμ±ν©λλ€.
add_docμ `tomotopy.LDAModel.train`μ μμνκΈ° μ κΉμ§λ§ μ¬μ©ν μ μμ΅λλ€.
μ¦ trainμ μμν μ΄νλ‘λ νμ΅ λ¬Έν μ§ν©μ΄ κ³ μ λκΈ° λλ¬Έμ add_docμ μ΄μ©νμ¬ μλ‘μ΄ λ¬Ένμ λͺ¨λΈ λ΄μ μΆκ°ν μ μμ΅λλ€.λν μμ±λ λ¬Ένμ μΈμ€ν΄μ€λ₯Ό μ»κΈ° μν΄μλ λ€μκ³Ό κ°μ΄ `tomotopy.LDAModel.docs`λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
::
mdl = tp.LDAModel(k=20)
idx = mdl.add_doc(words)
if idx < 0: raise RuntimeError("Failed to add doc")
doc_inst = mdl.docs[idx]
# doc_inst is an instance of the added document**λͺ¨λΈ λ°μ λ¬Έν**μ `tomotopy.LDAModel.make_doc`μ μ΄μ©ν΄ μμ±ν©λλ€. make_docμ add_docκ³Ό λ°λλ‘ trainμ μμν μ΄νμ μ¬μ©ν μ μμ΅λλ€.
λ§μ½ trainμ μμνκΈ° μ μ make_docμ μ¬μ©ν κ²½μ° μ¬λ°λ₯΄μ§ μμ κ²°κ³Όλ₯Ό μ»κ² λλ μ΄ μ μ μνμκΈΈ λ°λλλ€. make_docμ λ°λ‘ μΈμ€ν΄μ€λ₯Ό λ°ννλ―λ‘ λ°νκ°μ λ°μ λ°λ‘ μ¬μ©ν μ μμ΅λλ€.::
mdl = tp.LDAModel(k=20)
# add_doc ...
mdl.train(100)
doc_inst = mdl.make_doc(unseen_doc) # doc_inst is an instance of the unseen documentμλ‘μ΄ λ¬Ένμ λν΄ μΆλ‘ νκΈ°
------------------------------
`tomotopy.LDAModel.make_doc`μ μ΄μ©ν΄ μλ‘μ΄ λ¬Ένμ μμ±νλ€λ©΄ μ΄λ₯Ό λͺ¨λΈμ μ λ ₯ν΄ μ£Όμ λΆν¬λ₯Ό μΆλ‘ νλλ‘ ν μ μμ΅λλ€.
μλ‘μ΄ λ¬Ένμ λν μΆλ‘ μ `tomotopy.LDAModel.infer`λ₯Ό μ¬μ©ν©λλ€.::
mdl = tp.LDAModel(k=20)
# add_doc ...
mdl.train(100)
doc_inst = mdl.make_doc(unseen_doc)
topic_dist, ll = mdl.infer(doc_inst)
print("Topic Distribution for Unseen Docs: ", topic_dist)
print("Log-likelihood of inference: ", ll)infer λ©μλλ `tomotopy.Document` μΈμ€ν΄μ€ νλλ₯Ό μΆλ‘ νκ±°λ `tomotopy.Document` μΈμ€ν΄μ€μ `list`λ₯Ό μΆλ‘ νλλ° μ¬μ©ν μ μμ΅λλ€.
μμΈν κ²μ `tomotopy.LDAModel.infer`μ μ°Έμ‘°νκΈΈ λ°λλλ€.Corpusμ transform
--------------------
`tomotopy`μ λͺ¨λ ν ν½ λͺ¨λΈλ€μ κ°μ λ³λμ λ΄λΆμ μΈ λ¬Έν νμ μ κ°μ§κ³ μμ΅λλ€.
κ·Έλ¦¬κ³ μ΄ λ¬Έν νμ λ€μ λ§λ λ¬Ένλ€μ κ° λͺ¨λΈμ `add_doc` λ©μλλ₯Ό ν΅ν΄ μμ±λ μ μμ΅λλ€.
νμ§λ§ μ΄ λλ¬Έμ λμΌν λͺ©λ‘μ λ¬Ένλ€μ μλ‘ λ€λ₯Έ ν ν½ λͺ¨λΈμ μ λ ₯ν΄μΌ νλ κ²½μ°
맀 λͺ¨λΈμ κ° λ¬Ένμ μΆκ°ν λλ§λ€ `add_doc`μ νΈμΆν΄μΌνκΈ° λλ¬Έμ λΉν¨μ¨μ΄ λ°μν©λλ€.
λ°λΌμ `tomotopy`μμλ μ¬λ¬ λ¬Ένμ λ¬Άμ΄μ κ΄λ¦¬ν΄μ£Όλ `tomotopy.utils.Corpus` ν΄λμ€λ₯Ό μ 곡ν©λλ€.
ν ν½ λͺ¨λΈ κ°μ²΄λ₯Ό μμ±ν λ `tomotopy.utils.Corpus`λ₯Ό `__init__` λ©μλμ `corpus` μΈμλ‘ λ겨μ€μΌλ‘μ¨
μ΄λ€ λͺ¨λΈμλ μ½κ² λ¬Ένλ€μ μ½μ ν μ μκ² ν΄μ€λλ€.
`tomotopy.utils.Corpus`λ₯Ό ν ν½ λͺ¨λΈμ μ½μ νλ©΄ corpus κ°μ²΄κ° κ°μ§κ³ μλ λ¬Ένλ€ μ λΆκ° λͺ¨λΈμ μλμΌλ‘ μ½μ λ©λλ€.κ·Έλ°λ° μΌλΆ ν ν½ λͺ¨λΈμ κ²½μ° λ¬Ένμ μμ±νκΈ° μν΄ μλ‘ λ€λ₯Έ λ°μ΄ν°λ₯Ό μꡬν©λλ€.
μλ₯Ό λ€μ΄ `tomotopy.DMRModel`λ `metadata`λΌλ `str` νμ μ λ°μ΄ν°λ₯Ό μꡬνκ³ ,
`tomotopy.PLDAModel`λ `labels`λΌλ `List[str]` νμ μ λ°μ΄ν°λ₯Ό μꡬν©λλ€.
κ·Έλ¬λ `tomotopy.utils.Corpus`λ ν ν½ λͺ¨λΈμ μ’ μλμ§ μμ λ 립μ μΈ λ¬Έν λ°μ΄ν°λ₯Ό 보κ΄νκΈ° λλ¬Έμ,
corpusκ° κ°μ§κ³ μλ λ¬Έν λ°μ΄ν°κ° μ€μ ν ν½ λͺ¨λΈμ΄ μꡬνλ λ°μ΄ν°μ μΌμΉνμ§ μμ κ°λ₯μ±μ΄ μμ΅λλ€.
μ΄ κ²½μ° `transform`λΌλ μΈμλ₯Ό ν΅ν΄ corpus λ΄μ λ°μ΄ν°λ₯Ό λ³νμμΌ ν ν½ λͺ¨λΈμ΄ μꡬνλ μ€μ λ°μ΄ν°μ μΌμΉμν¬ μ μμ΅λλ€.
μμΈν λ΄μ©μ μλμ μ½λλ₯Ό νμΈν΄μ£ΌμΈμ:::
from tomotopy import DMRModel
from tomotopy.utils import Corpuscorpus = Corpus()
corpus.add_doc("a b c d e".split(), a_data=1)
corpus.add_doc("e f g h i".split(), a_data=2)
corpus.add_doc("i j k l m".split(), a_data=3)model = DMRModel(k=10)
model.add_corpus(corpus)
# `corpus`μ μλ `a_data`λ μ¬λΌμ§κ³
# `DMRModel`μ΄ μꡬνλ `metadata`μλ κΈ°λ³Έκ°μΈ λΉ λ¬Έμμ΄μ΄ μ±μμ§λλ€.assert model.docs[0].metadata == ''
assert model.docs[1].metadata == ''
assert model.docs[2].metadata == ''def transform_a_data_to_metadata(misc: dict):
return {'metadata': str(misc['a_data'])}
# μ΄ ν¨μλ `a_data`λ₯Ό `metadata`λ‘ λ³νν©λλ€.model = DMRModel(k=10)
model.add_corpus(corpus, transform=transform_a_data_to_metadata)
# μ΄μ `model`μλ κΈ°λ³Έκ°μ΄ μλ `metadata`κ° μ λ ₯λ©λλ€. μ΄λ€μ `transform`μ μν΄ `a_data`λ‘λΆν° μμ±λ©λλ€.assert model.docs[0].metadata == '1'
assert model.docs[1].metadata == '2'
assert model.docs[2].metadata == '3'λ³λ ¬ μνλ§ μκ³ λ¦¬μ¦
----------------------------
`tomotopy`λ 0.5.0λ²μ λΆν° λ³λ ¬ μκ³ λ¦¬μ¦μ κ³ λ₯Ό μ μλ μ νμ§λ₯Ό μ 곡ν©λλ€.
0.4.2 μ΄μ λ²μ κΉμ§ μ 곡λλ μκ³ λ¦¬μ¦μ `COPY_MERGE`λ‘ μ΄ κΈ°λ²μ λͺ¨λ ν ν½ λͺ¨λΈμ μ¬μ© κ°λ₯ν©λλ€.
μλ‘μ΄ μκ³ λ¦¬μ¦μΈ `PARTITION`μ 0.5.0μ΄νλΆν° μ¬μ©κ°λ₯νλ©°, μ΄λ₯Ό μ¬μ©νλ©΄ λ λΉ λ₯΄κ³ λ©λͺ¨λ¦¬ ν¨μ¨μ μΌλ‘ νμ΅μ μνν μ μμ΅λλ€. λ¨ μ΄ κΈ°λ²μ μΌλΆ ν ν½ λͺ¨λΈμ λν΄μλ§ μ¬μ© κ°λ₯ν©λλ€.λ€μ μ°¨νΈλ ν ν½ κ°μμ μ½μ΄ κ°μμ λ°λΌ λ κΈ°λ²μ μλ μ°¨μ΄λ₯Ό 보μ¬μ€λλ€.
.. image:: https://bab2min.github.io/tomotopy/images/algo_comp.png
.. image:: https://bab2min.github.io/tomotopy/images/algo_comp2.png
λ²μ λ³ μλ μ°¨μ΄
----------------------
μλ κ·Έλνλ λ²μ λ³ μλ μ°¨μ΄λ₯Ό νμν κ²μ λλ€.
LDAλͺ¨λΈλ‘ 1000ν iterationμ μνμ 걸리λ μκ°μ μ΄ λ¨μλ‘ νμνμμ΅λλ€.
(Docs: 11314, Vocab: 60382, Words: 2364724, Intel Xeon Gold 5120 @2.2GHz).. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t1.png
.. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t4.png
.. image:: https://bab2min.github.io/tomotopy/images/lda-perf-t8.png
μ΄ν μ¬μ λΆν¬λ₯Ό μ΄μ©νμ¬ μ£Όμ κ³ μ νκΈ°
--------------------------------------
0.6.0 λ²μ λΆν° `tomotopy.LDAModel.set_word_prior`λΌλ λ©μλκ° μΆκ°λμμ΅λλ€. μ΄ λ©μλλ‘ νΉμ λ¨μ΄μ μ¬μ λΆν¬λ₯Ό μ‘°μ ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ λ€μ μ½λμ²λΌ λ¨μ΄ 'church'μ κ°μ€μΉλ₯Ό Topic 0μ λν΄μλ 1.0, λλ¨Έμ§ Topicμ λν΄μλ 0.1λ‘ μ€μ ν μ μμ΅λλ€.
μ΄λ λ¨μ΄ 'church'κ° Topic 0μ ν λΉλ νλ₯ μ΄ λ€λ₯Έ Topicμ ν λΉλ νλ₯ λ³΄λ€ 10λ°° λλ€λ κ²μ μλ―Ένλ©°, λ°λΌμ λλΆλΆμ 'church'λ Topic 0μ ν λΉλκ² λ©λλ€.
κ·Έλ¦¬κ³ νμ΅μ κ±°μΉλ©° 'church'μ κ΄λ ¨λ λ¨μ΄λ€ μμ Topic 0μ λͺ¨μ΄κ² λλ―λ‘, μ΅μ’ μ μΌλ‘ Topic 0μ 'church'μ κ΄λ ¨λ μ£Όμ κ° λ κ²μ λλ€.
μ΄λ₯Ό ν΅ν΄ νΉμ λ΄μ©μ μ£Όμ λ₯Ό μνλ Topic λ²νΈμ κ³ μ μν¬ μ μμ΅λλ€.::
import tomotopy as tp
mdl = tp.LDAModel(k=20)
# add documents into `mdl`# setting word prior
mdl.set_word_prior('church', [1.0 if k == 0 else 0.1 for k in range(20)])μμΈν λ΄μ©μ `example.py`μ `word_prior_example` ν¨μλ₯Ό μ°Έμ‘°νμμμ€.
μμ μ½λ
---------
tomotopyμ Python3 μμ μ½λλ https://github.com/bab2min/tomotopy/blob/main/examples/ λ₯Ό νμΈνμκΈΈ λ°λλλ€.μμ μ½λμμ μ¬μ©νλ λ°μ΄ν° νμΌμ https://drive.google.com/file/d/18OpNijd4iwPyYZ2O7pQoPyeTAKEXa71J/view μμ λ€μ΄λ°μ μ μμ΅λλ€.
λΌμ΄μΌμ€
---------
`tomotopy`λ MIT License νμ λ°°ν¬λ©λλ€.μμ¬
-------
* 0.12.7 (2023-12-19)
* μ κ· κΈ°λ₯
* ν ν½ λͺ¨λΈ λ·°μ΄μΈ `tomotopy.viewer.open_viewer()`κ° μΆκ°λμμ΅λλ€.
* `tomotopy.utils.Corpus.process()`μ μλλ₯Ό κ°μ νμ΅λλ€.
* Bug fixes
* `Document.span`μ΄ μ΄μ λ°μ΄νΈ λ¨μκ° μλλΌ λ¬Έμ λ¨μλ‘ λ²μλ₯Ό μ λλ‘ λ°νν©λλ€.* 0.12.6 (2023-12-11)
* μ κ· κΈ°λ₯
* `tomotopy.LDAModel.train`κ³Ό `tomotopy.LDAModel.set_word_prior`μ λͺκ°μ§ νΈμ κΈ°λ₯μ μΆκ°νμ΅λλ€.
* `LDAModel.train`κ° μ΄μ νμ΅ μ§νμν©μ λͺ¨λν°λ§ν μ μλ `callback`, `callback_interval`, `show_progres` μΈμλ₯Ό μ§μν©λλ€.
* `LDAModel.set_word_prior`κ° μ΄μ `prior` μΈμλ‘ `Dict[int, float]` νμ λ λ°μ μ μκ² λμμ΅λλ€.* 0.12.5 (2023-08-03)
* μ κ· κΈ°λ₯
* Linux ARM64 μν€ν μ²μ λν μ§μμ μΆκ°νμ΅λλ€.* 0.12.4 (2023-01-22)
* New features
* macOS ARM64 μν€ν μ²μ λν μ§μμ μΆκ°νμ΅λλ€.
* Bug fixes
* `tomotopy.Document.get_sub_topic_dist()`κ° bad argument μμΈλ₯Ό λ°μμν€λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* μμΈ λ°μμ΄ μ’ μ’ ν¬λμλ₯Ό λ°μμν€λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.* 0.12.3 (2022-07-19)
* κΈ°λ₯ κ°μ
* μ΄μ `tomotopy.LDAModel.add_doc()`λ‘ λΉ λ¬Έμλ₯Ό μ½μ ν κ²½μ° μμΈλ₯Ό λ°μμν€λ λμ κ·Έλ₯ 무μν©λλ€. μλ‘ μΆκ°λ μΈμμΈ `ignore_empty_words`λ₯Ό Falseλ‘ μ€μ ν κ²½μ° μ΄μ μ²λΌ μμΈλ₯Ό λ°μμν΅λλ€.
* μ ν¨νμ§ μμ ν ν½λ€μ λͺ¨λΈμμ μ κ±°νλ `tomotopy.HDPModel.purge_dead_topics()` λ©μλκ° μΆκ°λμμ΅λλ€.
* λ²κ·Έ μμ
* `tomotopy.SLDAModel`μμ `nuSq` κ°μ μ§μ ν λ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. (by @jucendrero)
* `tomotopy.utils.Coherence`κ° `tomotopy.DTModel`μ λν΄μ μλνμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `train()` νΈμΆ μ μ `make_dic()`μ νΈμΆν λ μ’ μ’ ν¬λμκ° λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* seedκ° κ³ μ λ μνμμλ `tomotopy.DMRModel`, `tomotopy.GDMRModel`μ κ²°κ³Όκ° λ€λ₯΄κ² λμ€λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.DMRModel`, `tomotopy.GDMRModel`μ νλΌλ―Έν° μ΅μ ν κ³Όμ μ΄ λΆμ ννλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.PTModel.copy()` νΈμΆ μ μ’ μ’ ν¬λμκ° λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* μ±κΈμ€λ λμμμ μλ ν¨μ¨μ κ°μ νμ΅λλ€.* 0.12.2 (2021-09-06)
* `min_cf > 0`, `min_df > 0`λ `rm_top > 0`λ‘ μ€μ λ `tomotopy.HDPModel`μμ `convert_to_lda`λ₯Ό νΈμΆν λ ν¬λμκ° λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.Document.get_topics`μ `tomotopy.Document.get_topic_dist`μ `from_pseudo_doc` μΈμκ° μΆκ°λμμ΅λλ€.
μ΄ μΈμλ `PTModel`μ λν΄μλ§ μ ν¨νλ©°, μ΄λ₯Ό ν΅ν΄ ν ν½ λΆν¬λ₯Ό ꡬν λ κ°μ λ¬Ένμ μ¬μ©ν μ§ μ¬λΆλ₯Ό μ νν μ μμ΅λλ€.
* `tomotopy.PTModel` μμ±μ κΈ°λ³Έ μΈμκ°μ΄ λ³κ²½λμμ΅λλ€. `p`λ₯Ό μλ΅μ `k * 10`μΌλ‘ μ€μ λ©λλ€.
* `make_doc`μΌλ‘ μμ±ν λ¬Ένμ `infer` μμ΄ μ¬μ©ν κ²½μ° λ°μνλ ν¬λμλ₯Ό ν΄κ²°νκ³ κ²½κ³ λ©μΈμ§λ₯Ό μΆκ°νμ΅λλ€.
* λ΄λΆ C++μ½λκ° clang c++17 νκ²½μμ μ»΄νμΌμ μ€ν¨νλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.* 0.12.1 (2021-06-20)
* `tomotopy.LDAModel.set_word_prior()`κ° ν¬λμλ₯Ό λ°μμν€λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* μ΄μ `tomotopy.LDAModel.perplexity`μ `tomotopy.LDAModel.ll_per_word`κ° TermWeightκ° ONEμ΄ μλ κ²½μ°μλ μ νν κ°μ λ°νν©λλ€.
* μ©μ΄κ°μ€μΉκ° μ μ©λ λΉλμλ₯Ό λ°ννλ `tomotopy.LDAModel.used_vocab_weighted_freq`κ° μΆκ°λμμ΅λλ€.
* μ΄μ `tomotopy.LDAModel.summary()`κ° λ¨μ΄μ μνΈλ‘νΌλΏλ§ μλλΌ, μ©μ΄ κ°μ€μΉκ° μ μ©λ λ¨μ΄μ μνΈλ‘νΌλ ν¨κ» 보μ¬μ€λλ€.* 0.12.0 (2021-04-26)
* μ΄μ `tomotopy.DMRModel`μ `tomotopy.GDMRModel`κ° λ€μ€ λ©νλ°μ΄ν°λ₯Ό μ§μν©λλ€. (https://github.com/bab2min/tomotopy/blob/main/examples/dmr_multi_label.py μ°Έμ‘°)
* `tomotopy.GDMRModel`μ μ±λ₯μ΄ κ°μ λμμ΅λλ€.
* κΉμ 볡μ¬λ₯Ό μννλ `copy()` λ©μλκ° λͺ¨λ ν ν½ λͺ¨λΈ ν΄λμ€μ μΆκ°λμμ΅λλ€.
* `min_cf`, `min_df` λ±μ μν΄ νμ΅μμ μ μΈλ λ¨μ΄κ° μλͺ»λ ν ν½idκ°μ κ°μ§λ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€. μ΄μ μ μΈλ¨ λ¨μ΄λ€μ ν ν½idλ‘ λͺ¨λ `-1` κ°μ κ°μ§λλ€.
* μ΄μ `tomotopy`μ μν΄ μμ±λλ μμΈ λ° κ²½κ³ κ° λͺ¨λ Python νμ€ νμ μ λ°λ¦ λλ€.
* μ»΄νμΌλ¬ μꡬμ¬νμ΄ C++14λ‘ μν₯λμμ΅λλ€.* 0.11.1 (2021-03-28)
* λΉλμΉ alphaμ κ΄λ ¨λ μΉλͺ μ μΈ λ²κ·Έκ° μμ λμμ΅λλ€. μ΄ λ²κ·Έλ‘ μΈν΄ 0.11.0 λ²μ μ 릴리μ¦μμ μμ λμμ΅λλ€.* 0.11.0 (2021-03-26)
* 짧μ ν μ€νΈλ₯Ό μν ν ν½ λͺ¨λΈμΈ `tomotopy.PTModel`κ° μΆκ°λμμ΅λλ€.
* `tomotopy.HDPModel.infer`κ° μ’ μ’ segmentation faultλ₯Ό λ°μμν€λ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* numpy API λ²μ μΆ©λμ΄ ν΄κ²°λμμ΅λλ€.
* μ΄μ λΉλμΉ λ¬Έν-ν ν½ μ¬μ λΆν¬κ° μ§μλ©λλ€.
* ν ν½ λͺ¨λΈ κ°μ²΄λ₯Ό λ©λͺ¨λ¦¬ μμ `bytes`λ‘ μ§λ ¬ννλ κΈ°λ₯μ΄ μ§μλ©λλ€.
* `get_topic_dist()`, `get_topic_word_dist()`, `get_sub_topic_dist()`μ κ²°κ³Όμ μ κ·ν μ¬λΆλ₯Ό μ‘°μ νλ `normalize` μΈμκ° μΆκ°λμμ΅λλ€.
* `tomotopy.DMRModel.lambdas`μ `tomotopy.DMRModel.alpha`κ° μλͺ»λ κ°μ μ 곡νλ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* `tomotopy.GDMRModel`μ λ²μ£Όν λ©νλ°μ΄ν° μ§μμ΄ μΆκ°λμμ΅λλ€. (https://github.com/bab2min/tomotopy/blob/main/examples/gdmr_both_categorical_and_numerical.py μ°Έμ‘°)
* Python3.5 μ§μμ΄ μ’ λ£λμμ΅λλ€.* 0.10.2 (2021-02-16)
* `tomotopy.CTModel.train`κ° ν° Kκ°μ λν΄ μ€ν¨νλ λ¬Έμ κ° μμ λμμ΅λλ€.
* `tomotopy.utils.Corpus`κ° `uid`κ°μ μλ λ¬Έμ κ° μμ λμμ΅λλ€.* 0.10.1 (2021-02-14)
* `tomotopy.utils.Corpus.extract_ngrams`μ λΉ λ¬Ένμ μ λ ₯μ λ°μνλ μλ¬λ₯Ό μμ νμ΅λλ€.
* `tomotopy.LDAModel.infer`κ° μ¬λ°λ₯Έ μ λ ₯μλ μμΈλ₯Ό λ°μμν€λ λ¬Έμ λ₯Ό μμ νμ΅λλ€.
* `tomotopy.HLDAModel.infer`κ° μλͺ»λ `tomotopy.Document.path` κ°μ μμ±νλ λ¬Έμ λ₯Ό μμ νμ΅λλ€.
* `tomotopy.HLDAModel.train`μ μλ‘μ΄ νλΌλ―Έν° `freeze_topics`κ° μΆκ°λμμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νμ΅ μ μ κ· ν ν½ μμ± μ¬λΆλ₯Ό μ‘°μ ν μ μμ΅λλ€.
* 0.10.0 (2020-12-19)
* `tomotopy.utils.Corpus`μ `tomotopy.LDAModel.docs` κ°μ μΈν°νμ΄μ€κ° ν΅μΌλμμ΅λλ€. μ΄μ λμΌν λ°©λ²μΌλ‘ μ½νΌμ€ λ΄μ λ¬Ένλ€μ μ κ·Όν μ μμ΅λλ€.
* `tomotopy.utils.Corpus`μ __getitem__μ΄ κ°μ λμμ΅λλ€. int νμ μΈλ±μ±λΏλ§ μλλΌ Iterable[int]λ slicingλ₯Ό μ΄μ©ν λ€μ€ μΈλ±μ±, uidλ₯Ό μ΄μ©ν μΈλ±μ± λ±μ΄ μ 곡λ©λλ€.
* `tomotopy.utils.Corpus.extract_ngrams`μ `tomotopy.utils.Corpus.concat_ngrams`μ΄ μΆκ°λμμ΅λλ€. PMIλ₯Ό μ΄μ©ν΄ μ½νΌμ€ λ΄μμ μλμΌλ‘ n-gram collocationμ λ°κ²¬ν΄ ν λ¨μ΄λ‘ ν©μΉλ κΈ°λ₯μ μνν©λλ€.
* `tomotopy.LDAModel.add_corpus`κ° μΆκ°λμκ³ , `tomotopy.LDAModel.infer`κ° Raw μ½νΌμ€λ₯Ό μ λ ₯μΌλ‘ λ°μ μ μκ² λμμ΅λλ€.
* `tomotopy.coherence` λͺ¨λμ΄ μΆκ°λμμ΅λλ€. μμ±λ ν ν½ λͺ¨λΈμ coherenceλ₯Ό κ³μ°νλ κΈ°λ₯μ λ΄λΉν©λλ€.
* `tomotopy.label.FoRelevance`μ window_size νλΌλ―Έν°κ° μΆκ°λμμ΅λλ€.
* `tomotopy.HDPModel` νμ΅ μ μ’ μ’ NaNμ΄ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* μ΄μ Python3.9λ₯Ό μ§μν©λλ€.
* py-cpuinfoμ λν μμ‘΄μ±μ΄ μ κ±°λκ³ , λͺ¨λ λ‘λ©μλκ° κ°μ λμμ΅λλ€.* 0.9.1 (2020-08-08)
* 0.9.0 λ²μ μ λ©λͺ¨λ¦¬ λμ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* `tomotopy.CTModel.summary()`κ° μλͺ»λ κ²°κ³Όλ₯Ό μΆλ ₯νλ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.* 0.9.0 (2020-08-04)
* λͺ¨λΈμ μνλ₯Ό μμ보기 μ½κ² μΆλ ₯ν΄μ£Όλ `tomotopy.LDAModel.summary()` λ©μλκ° μΆκ°λμμ΅λλ€.
* λμ μμ±κΈ°λ₯Ό `EigenRand`_λ‘ λ체νμ¬ μμ± μλλ₯Ό λμ΄κ³ νλ«νΌ κ°μ κ²°κ³Ό μ°¨μ΄λ₯Ό ν΄μνμμ΅λλ€.
* μ΄λ‘ μΈν΄ `seed`κ° λμΌν΄λ λͺ¨λΈ νμ΅ κ²°κ³Όκ° 0.9.0 μ΄μ λ²μ κ³Ό λ¬λΌμ§ μ μμ΅λλ€.
* `tomotopy.HDPModel`μμ κ°νμ μΌλ‘ λ°μνλ νμ΅ μ€λ₯λ₯Ό μμ νμ΅λλ€.
* μ΄μ `tomotopy.DMRModel.alpha`κ° λ©νλ°μ΄ν°λ³ ν ν½ λΆν¬μ μ¬μ νλΌλ―Έν°λ₯Ό 보μ¬μ€λλ€.
* `tomotopy.DTModel.get_count_by_topics()`κ° 2μ°¨μ `ndarray`λ₯Ό λ°ννλλ‘ μμ λμμ΅λλ€.
* `tomotopy.DTModel.alpha`κ° `tomotopy.DTModel.get_alpha()`μ λμΌν κ°μ λ°ννλλ‘ μμ λμμ΅λλ€.
* `tomotopy.GDMRModel`μ documentμ λν΄ `metadata` κ°μ μ»μ΄μ¬ μ μλ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* μ΄μ `tomotopy.HLDAModel.alpha`κ° λ¬Ένλ³ κ³μΈ΅ λΆν¬μ μ¬μ νλΌλ―Έν°λ₯Ό 보μ¬μ€λλ€.
* `tomotopy.LDAModel.global_step`μ΄ μΆκ°λμμ΅λλ€.
* μ΄μ `tomotopy.MGLDAModel.get_count_by_topics()`κ° μ μ ν ν½κ³Ό μ§μ ν ν½ λͺ¨λμ λ¨μ΄ κ°μλ₯Ό 보μ¬μ€λλ€.
* `tomotopy.PAModel.alpha`, `tomotopy.PAModel.subalpha`, `tomotopy.PAModel.get_count_by_super_topic()`μ΄ μΆκ°λμμ΅λλ€... _EigenRand: https://github.com/bab2min/EigenRand
* 0.8.2 (2020-07-14)
* `tomotopy.DTModel.num_timepoints`μ `tomotopy.DTModel.num_docs_by_timepoint` νλ‘νΌν°κ° μΆκ°λμμ΅λλ€.
* `seed`κ° λμΌν΄λ νλ«νΌμ΄ λ€λ₯΄λ©΄ λ€λ₯Έ κ²°κ³Όλ₯Ό λ΄λ λ¬Έμ κ° μΌλΆ ν΄κ²°λμμ΅λλ€. μ΄λ‘ μΈν΄ 32bit λ²μ μ λͺ¨λΈ νμ΅ κ²°κ³Όκ° μ΄μ λ²μ κ³Όλ λ¬λΌμ‘μ΅λλ€.* 0.8.1 (2020-06-08)
* `tomotopy.LDAModel.used_vocabs`κ° μλͺ»λ κ°μ λ°ννλ λ²κ·Έκ° μμ λμμ΅λλ€.
* μ΄μ `tomotopy.CTModel.prior_cov`κ° `[k, k]` λͺ¨μμ 곡λΆμ° νλ ¬μ λ°νν©λλ€.
* μ΄μ μΈμ μμ΄ `tomotopy.CTModel.get_correlations`λ₯Ό νΈμΆνλ©΄ `[k, k]` λͺ¨μμ μκ΄κ΄κ³ νλ ¬μ λ°νν©λλ€.* 0.8.0 (2020-06-06)
* NumPyκ° tomotopyμ λμ λ¨μ λ°λΌ λ§μ λ©μλμ νλ‘νΌν°λ€μ΄ `list`κ° μλλΌ `numpy.ndarray`λ₯Ό λ°ννλλ‘ λ³κ²½λμμ΅λλ€.
* Tomotopyμ μ μμ‘΄κ΄κ³ `NumPy >= 1.10.0`κ° μΆκ°λμμ΅λλ€..
* `tomotopy.HDPModel.infer`κ° μλͺ»λ μΆλ‘ μ νλ λ¬Έμ κ° μμ λμμ΅λλ€.
* HDP λͺ¨λΈμ LDA λͺ¨λΈλ‘ λ³ννλ λ©μλκ° μΆκ°λμμ΅λλ€.
* `tomotopy.LDAModel.used_vocabs`, `tomotopy.LDAModel.used_vocab_freq`, `tomotopy.LDAModel.used_vocab_df` λ±μ μλ‘μ΄ νλ‘νΌν°κ° λͺ¨λΈμ μΆκ°λμμ΅λλ€.
* μλ‘μ΄ ν ν½ λͺ¨λΈμΈ g-DMR(`tomotopy.GDMRModel`)κ° μΆκ°λμμ΅λλ€.
* macOSμμ `tomotopy.label.FoRelevance`λ₯Ό μμ±ν λ λ°μνλ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* `tomotopy.utils.Corpus.add_doc`λ‘ `raw`κ° μλ λ¬Ένμ μμ±ν λ€ ν ν½ λͺ¨λΈμ μ λ ₯ν μ λ°μνλ μ€λ₯λ₯Ό μμ νμ΅λλ€.* 0.7.1 (2020-05-08)
* `tomotopy.HLDAModel`μ©μΌλ‘ `tomotopy.Document.path`κ° μλ‘ μΆκ°λμμ΅λλ€.
* `tomotopy.label.PMIExtractor` μ¬μ©μμ λ°μνλ λ©λͺ¨λ¦¬ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
* gcc 7μμ λ°μνλ μ»΄νμΌ μ€λ₯κ° ν΄κ²°λμμ΅λλ€.* 0.7.0 (2020-04-18)
* `tomotopy.DTModel`μ΄ μΆκ°λμμ΅λλ€.
* `tomotopy.utils.Corpus.save`κ° μ λλ‘ μλνμ§ μλ λ²κ·Έκ° μμ λμμ΅λλ€.
* `tomotopy.Document.get_count_vector`κ° μΆκ°λμμ΅λλ€.
* 리λ μ€μ© λ°μ΄λλ¦¬κ° manylinux2010 λ²μ μΌλ‘ λ³κ²½λμκ³ μ΄μ λ°λ₯Έ μ΅μ νκ° μ§νλμμ΅λλ€.* 0.6.2 (2020-03-28)
* `save`μ `load`μ κ΄λ ¨λ μΉλͺ μ μΈ λ²κ·Έκ° μμ λμμ΅λλ€. ν΄λΉ λ²κ·Έλ‘ 0.6.0 λ° 0.6.1 λ²μ μ 릴리μ¦μμ μμ λμμ΅λλ€.* 0.6.1 (2020-03-22) (μμ λ¨)
* λͺ¨λ λ‘λ©κ³Ό κ΄λ ¨λ λ²κ·Έκ° μμ λμμ΅λλ€.* 0.6.0 (2020-03-22) (μμ λ¨)
* λλμ λ¬Ένμ κ΄λ¦¬νκΈ° μν `tomotopy.utils.Corpus`κ° μΆκ°λμμ΅λλ€.
* μ΄ν-μ£Όμ λΆν¬μ μ¬μ νλ₯ μ μ‘°μ ν μ μλ `tomotopy.LDAModel.set_word_prior` λ©μλκ° μΆκ°λμμ΅λλ€.
* λ¬Έν λΉλλ₯Ό κΈ°λ°μΌλ‘ μ΄νλ₯Ό νν°λ§ν μ μλλ‘ ν ν½ λͺ¨λΈμ μμ±μμ `min_df`κ° μΆκ°λμμ΅λλ€.
* ν ν½ λΌλ²¨λ§ κ΄λ ¨ μλΈλͺ¨λμΈ `tomotopy.label`μ΄ μΆκ°λμμ΅λλ€. νμ¬λ `tomotopy.label.FoRelevance`λ§ μ 곡λ©λλ€.* 0.5.2 (2020-03-01)
* `tomotopy.LLDAModel.add_doc` μ€νμ segmentation faultκ° λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.HDPModel`μμ `infer` μ€νμ μ’ μ’ νλ‘κ·Έλ¨μ΄ μ’ λ£λλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.LDAModel.infer`μμ ps=tomotopy.ParallelScheme.PARTITION, together=Trueλ‘ μ€νμ λ°μνλ μ€λ₯λ₯Ό ν΄κ²°νμ΅λλ€.* 0.5.1 (2020-01-11)
* `tomotopy.SLDAModel.make_doc`μμ κ²°μΈ‘κ°μ μ§μνμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.SLDAModel`μ΄ μ΄μ κ²°μΈ‘κ°μ μ§μν©λλ€. κ²°μΈ‘κ°μ κ°μ§ λ¬Ένμ ν ν½ λͺ¨λΈλ§μλ μ°Έμ¬νμ§λ§, μλ΅ λ³μ νκ·μμλ μ μΈλ©λλ€.* 0.5.0 (2019-12-30)
* `tomotopy.PAModel.infer`κ° topic distributionκ³Ό sub-topic distributionμ λμμ λ°νν©λλ€.
* `tomotopy.Document`μ get_sub_topics, get_sub_topic_dist λ©μλκ° μΆκ°λμμ΅λλ€. (PAModel μ μ©)
* `tomotopy.LDAModel.train` λ° `tomotopy.LDAModel.infer` λ©μλμ parallel μ΅μ μ΄ μΆκ°λμμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νμ΅ λ° μΆλ‘ μ μ¬μ©ν λ³λ ¬ν μκ³ λ¦¬μ¦μ μ νν μ μμ΅λλ€.
* `tomotopy.ParallelScheme.PARTITION` μκ³ λ¦¬μ¦μ΄ μΆκ°λμμ΅λλ€. μ΄ μκ³ λ¦¬μ¦μ μμ μ μκ° λ§κ±°λ ν ν½μ κ°μλ μ΄ν ν¬κΈ°κ° ν΄ λλ ν¨μ¨μ μΌλ‘ μλν©λλ€.
* λͺ¨λΈ μμ±μ min_cf < 2μΌλ rm_top μ΅μ μ΄ μ μ©λμ§ μλ λ¬Έμ λ₯Ό μμ νμμ΅λλ€.* 0.4.2 (2019-11-30)
* `tomotopy.LLDAModel`μ `tomotopy.PLDAModel` λͺ¨λΈμμ ν ν½ ν λΉμ΄ μλͺ» μΌμ΄λλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `tomotopy.Document` λ° `tomotopy.Dictionary` ν΄λμ€μ κ°λ μ±μ΄ μ’μ __repr__κ° μΆκ°λμμ΅λλ€.* 0.4.1 (2019-11-27)
* `tomotopy.PLDAModel` μμ±μμ λ²κ·Έλ₯Ό μμ νμ΅λλ€.* 0.4.0 (2019-11-18)
* `tomotopy.PLDAModel`μ `tomotopy.HLDAModel` ν ν½ λͺ¨λΈμ΄ μλ‘ μΆκ°λμμ΅λλ€.* 0.3.1 (2019-11-05)
* `min_cf` νΉμ `rm_top`κ° μ€μ λμμ λ `get_topic_dist()`μ λ°νκ°μ΄ λΆμ νν λ¬Έμ λ₯Ό μμ νμμ΅λλ€.
* `tomotopy.MGLDAModel` λͺ¨λΈμ λ¬Ένμ `get_topic_dist()`κ° μ§μ ν ν½μ λν λΆν¬λ ν¨κ» λ°ννλλ‘ μμ νμμ΅λλ€..
* `tw=ONE`μΌλμ νμ΅ μλκ° κ°μ λμμ΅λλ€.
* 0.3.0 (2019-10-06)
* `tomotopy.LLDAModel` ν ν½ λͺ¨λΈμ΄ μλ‘ μΆκ°λμμ΅λλ€.
* `HDPModel`μ νμ΅ν λ νλ‘κ·Έλ¨μ΄ μ’ λ£λλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
* `HDPModel`μ νμ΄νΌνλΌλ―Έν° μΆμ κΈ°λ₯μ΄ μΆκ°λμμ΅λλ€. μ΄ λλ¬Έμ μ λ²μ μ `HDPModel` κ²°κ³Όλ μ΄μ λ²μ κ³Ό λ€λ₯Ό μ μμ΅λλ€.
μ΄μ λ²μ μ²λΌ νμ΄νΌνλΌλ―Έν° μΆμ μ λλ €λ©΄, `optim_interval`μ 0μΌλ‘ μ€μ νμμμ€.* 0.2.0 (2019-08-18)
* `tomotopy.CTModel`μ `tomotopy.SLDAModel` ν ν½ λͺ¨λΈμ΄ μλ‘ μΆκ°λμμ΅λλ€.
* `rm_top` νλΌλ―Έν° μ΅μ μ΄ λͺ¨λ ν ν½ λͺ¨λΈμ μΆκ°λμμ΅λλ€.
* `PAModel`κ³Ό `HPAModel` λͺ¨λΈμμ `save`μ `load`κ° μ λλ‘ μλνμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.
* `HDPModel` μΈμ€ν΄μ€λ₯Ό νμΌλ‘λΆν° λ‘λ©ν λ μ’ μ’ νλ‘κ·Έλ¨μ΄ μ’ λ£λλ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.
* `min_cf` > 0μΌλ‘ μ€μ νμμ λ `ll_per_word` κ°μ΄ μλͺ» κ³μ°λλ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.* 0.1.6 (2019-08-09)
* macOSμ clangμμ μ λλ‘ μ»΄νμΌλμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.* 0.1.4 (2019-08-05)
* `add_doc` λ©μλκ° λΉ λ¦¬μ€νΈλ₯Ό λ°μμ λ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.
* `tomotopy.PAModel.get_topic_words`κ° νμν ν½μ λ¨μ΄ λΆν¬λ₯Ό μ λλ‘ λ°ννμ§ λͺ»νλ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.* 0.1.3 (2019-05-19)
* `min_cf` νλΌλ―Έν°μ λΆμ©μ΄ μ κ±° κΈ°λ₯μ΄ λͺ¨λ ν ν½ λͺ¨λΈμ μΆκ°λμμ΅λλ€.* 0.1.0 (2019-05-12)
* **tomotopy**μ μ΅μ΄ λ²μ λ€λ₯Έ μΈμ΄μ© λ°μΈλ©
-------------------
* Ruby: https://github.com/ankane/tomotoν¬ν¨λ λΌμ΄λΈλ¬λ¦¬λ€μ λΌμ΄μΌμ€
-------------------------------
* Eigen:
This application uses the MPL2-licensed features of Eigen, a C++ template library for linear algebra.
A copy of the MPL2 license is available at https://www.mozilla.org/en-US/MPL/2.0/.
The source code of the Eigen library can be obtained at http://eigen.tuxfamily.org/.* EigenRand: `MIT License
`_* Mapbox Variant: `BSD License
`_