Thứ Tư, 28 tháng 11, 2018

[Natural Language Processing] LDA trong Xử lý ngôn ngữ tự nhiên


Latent Dirichlet Allocation (LDA)
Quá trình tạo ra một document d trong collection D được định nghĩa như sau (||D|| là số documents trong collection):

Với α là tham số đặc trưng cho sự phân bố của các topic trên mỗi document
(Ví dụ document d có 0.1 là topic 1, 0.4 topic 2, 0.05 topic 3 ...). Do đó nếu ta có 10 topic, vector α sẽ có 10 thành phần. Ví dụ 4 topic. α = (0.4,0.1,0.3,0.2)
β là tham số đặc trưng cho sự phân bố của các word trong một vocabulary V trên một topic
(Ví dụ topic 1 có 0.01 là từ "computer", 0.04 là từ "human" ...). Do đó nếu số lượng từ trong vocabulary là ||V|| thì đó cũng là số thành phần của vector β. β = (β1,β2, .... β||V||)
  (hay đọc là phi, biểu diễn hơi khác trong công thức trên 1 chút do hơi khó biểu diễn khi viết blog) được tính là phân bố Dirichlet của β. Nghĩa là với K topic, ta sẽ có K phân bố trên vocabulary, và   đại diện cho phân bố của các term trên 1 topic
 được tính là phân bố Dirichlet của α. Do đó ta sẽ có ||D|| phân bố trên các topic, và  đại diện cho phân bố của các topic trên 1 document

Tiếp theo đó, Zi được tính là phân bố Mutinomial (trong công thức biểu diễn là Discrete) của , lúc này Zi là chỉ số của topic của từ thứ i trong document d. Ví dụ Zi = 1 tức là từ thứ i trong document d thuộc về topic thứ 1.

Wi cũng tương tự nhưng được tính bởi , Wi là từ thứ i trong vocabulary. Ví dụ từ thứ 5 trong vocab là "cat" thì W5 sẽ là "cat"

Quá trình trên hay còn được biểu diễn như sau:

Posterior Inference

Ta cũng có thể biểu diễn LDA như sau:


Tuy nhiên, ta không thể tính toán với công thức trên được vì p(w|α, β) không thể tính toán được một cách chính xác. Ta phải dùng công thức xấp xỉ để có thể giải được công thức này, một trong số đó là Gibbs Sampling.

Với công thức xấp xỉ này, ta có thể tính xác suất xấp xỉ như sau:




Ở đây ta đang tính xác suất để từ có vị trí thứ i trong 1 document thuộc topic k, lưu ý rằng ta sẽ phải tính xác suất này cho tất cả các topic k thuộc K.

Tôi tham khảo ở đây:

http://www.ccs.neu.edu/home/vip/teach/DMcourse/5_topicmodel_summ/notes_slides/sampling/darling-lda.pdf

Thứ Tư, 14 tháng 11, 2018

[Python Programming] Các kiểu dữ liệu thường dùng trong Python

Khi mới bắt đầu làm việc với Python, bởi vì Python là một ngôn ngữ rất mạnh trong việc biểu diễn số liệu do đó kiểu dữ liệu trong Python cũng phức tạp hơn nhiều so với các ngôn ngữ khác, nên tôi nghĩ việc viết một bài về các kiểu dữ liệu vừa là để giúp bản thân ghi nhớ các kiểu dữ liệu cho đỡ mất công đọc lại mỗi khi làm việc, vừa giúp tôi hiểu rõ hơn về các kiểu dữ liệu này.

Đầu tiên là tuple:
Tuple: Tuple là kiểu dữ liệu thường dùng trong python có kiểu đánh index giống với list nhưng khác với list là các phần tử trong Tuple không thay đổi được còn List lại thay đổi được. Ngoài ra tuple được biểu diễn bởi () chứ không phải [] như list
thistuple = ("apple", "banana", "cherry")

List: Xem Tuple để hiểu về List
thislist = ["apple", "banana", "cherry"]

Set: Set là kiểu dữ liệu không thể index và sắp xếp. Các phần tử trong set là unique. Ta có thể thay đổi nội dung của set
thisset = {"apple", "banana", "cherry"}

Dataframe - pandas: Đây là một kiểu dữ liệu mà python thừa kế từ ngôn ngữ R, gồm các hàng và các cột như một ma trận nhưng cách index lại khác.

Dictionary: thisdict = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964
}

Bao gồm key và value