Phân cụm một danh sách dài các chuỗi (từ) thành các nhóm tương tự


31

Tôi có một vấn đề sau: Tôi có một danh sách rất dài các từ, có thể là tên, họ, v.v. Tôi cần phải phân cụm danh sách từ này, sao cho các từ tương tự, ví dụ các từ có khoảng cách chỉnh sửa tương tự (Levenshtein) xuất hiện trong cùng cụm. Ví dụ: "thuật toán" và "alogrithm" sẽ có cơ hội cao xuất hiện trong cùng một cụm.

Tôi nhận thức rõ về các phương pháp phân cụm không giám sát cổ điển như phân cụm k-nghĩa, phân cụm EM trong tài liệu Nhận dạng mẫu. Vấn đề ở đây là các phương thức này hoạt động trên các điểm nằm trong không gian vectơ. Tôi có lời của chuỗi trong tay của tôi ở đây. Dường như, câu hỏi làm thế nào để biểu diễn các chuỗi trong một không gian vectơ số và tính toán "phương tiện" của các cụm chuỗi không được trả lời đầy đủ, theo những nỗ lực khảo sát của tôi cho đến bây giờ. Một cách tiếp cận ngây thơ để tấn công vấn đề này sẽ là kết hợp phân cụm k-Means với khoảng cách Levenshtein, nhưng câu hỏi vẫn là "Làm thế nào để biểu diễn" nghĩa là "của chuỗi?". Có một trọng số được gọi là trọng số TF-IDF, nhưng dường như nó chủ yếu liên quan đến khu vực phân cụm "tài liệu văn bản", không dành cho việc phân cụm các từ đơn lẻ. http://pike.psu.edu/cleandb06/ con /CameraReady_120.pdf

Tìm kiếm của tôi trong lĩnh vực này vẫn đang diễn ra, nhưng tôi cũng muốn lấy ý tưởng từ đây. Bạn muốn làm gì trong trường hợp này, có ai biết về bất kỳ phương pháp nào cho loại vấn đề này không?


1
Tôi đã tìm hiểu về sự tồn tại của một biến thể của phương tiện k được đặt tên là "K-medoid". vi.wikipedia.org/wiki/K-medoids Nó không hoạt động với khoảng cách Euclidian L2 và không cần tính toán phương tiện. Nó sử dụng điểm dữ liệu gần nhất với điểm khác trong cụm là "medoid".
Ufuk Can bicici 7/11 '

1
It seems that there are some special string clustering algorithms. Nếu bạn đến từ lĩnh vực khai thác văn bản cụ thể, không phải phân tích thống kê / dữ liệu, tuyên bố này được bảo hành. Tuy nhiên, nếu bạn học cách phân nhánh vì bạn sẽ thấy rằng không tồn tại thuật toán "đặc biệt" cho dữ liệu chuỗi. "Đặc biệt" là cách bạn xử lý trước dữ liệu đó trước khi nhập dữ liệu vào phân tích cụm.
ttnphns


Lưu ý sự khác biệt giữa Tuyên truyền mối quan hệ và phân cụm K-Means và cách nó sẽ ảnh hưởng đến thời gian tính toán. quora.com/ Quảng cáo
Gabriel Alon

Câu trả lời:


37

Đề xuất thứ hai @ mican cho tuyên truyền ái lực .

Từ bài báo: L Frey, Brendan J. và Delbert Dueck. "Phân cụm bằng cách chuyển tin nhắn giữa các điểm dữ liệu." khoa học 315.5814 (2007): 972-976. .

Nó siêu dễ sử dụng thông qua nhiều gói. Nó hoạt động trên bất cứ thứ gì bạn có thể xác định tương tự cặp đôi. Mà bạn có thể nhận được bằng cách nhân khoảng cách Levenshtein với -1.

Tôi đã đưa ra một ví dụ nhanh bằng cách sử dụng đoạn đầu tiên của câu hỏi của bạn làm đầu vào. Trong Python 3:

import numpy as np
import sklearn.cluster
import distance

words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])

affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

Đầu ra là (ví dụ in nghiêng ở bên trái của cụm mà chúng là mẫu của):

  • có: cơ hội, chỉnh sửa, tay, có, cao
  • tiếp theo: sau
  • vấn đề: vấn đề
  • TÔI: I, a, at, v.v., trong danh sách, của
  • có thể: có thể
  • cụm: cụm
  • từ: Vì, và, lâu dài, cần, nên, rất, từ, từ
  • giống: tương tự
  • Levenshtein: Levenshtein
  • khoảng cách: khoảng cách
  • các: đó, cái kia, cái này, với, với
  • tương tự: ví dụ, danh sách, tên, giống nhau, như vậy, họ
  • thuật toán: thuật toán, thuật ngữ
  • xuất hiện: xuất hiện, xuất hiện

Chạy nó trong danh sách 50 tên đầu tiên ngẫu nhiên :

  • Diane: Deana, Diane, Dionne, Gerald, Irina, Lisette, Minna, Nicki, Ricki
  • Jani: Clair, Jani, Jason, Jc, Kimi, Lang, Marcus, Maxima, Randi, Raul
  • Verline: Destiny, Kellye, Marylin, Mercedes, Sterling, Verline
  • Glenn: Elenor, Glenn, Gwenda
  • Armandina: Armandina, Augustina
  • Shiela: Ahmed, Estella, Milissa, Shiela, Thresa, Wynell
  • Laureen: Mùa thu, Haydee, Laureen, Lauren
  • Alberto: Albertha, Alberto, Robert
  • Truyền thuyết : Ammie, Doreen, Eura, Josef, Lore, Lori, Porter

Trông khá tuyệt với tôi (đó là niềm vui).


Có thể có cùng một thuật toán chỉ sử dụng sklearn? hoặc sử dụng scipy.spatial.distance với hamming? lợi thế để sử dụng levenshtein là gì? Tôi đoán tôi sẽ phải thử sử dụng câu hỏi này: stackoverflow.com/questions/4588541/
Khăn

1
@pierre Levenshtein là cái mà tôi sẽ gọi là "khoảng cách kiểm tra chính tả", nó là một đại diện tốt cho khả năng xảy ra lỗi chính tả của con người. Damerau Levenshtein có thể còn tốt hơn. Tôi không biết rằng Hamming Khoảng cách được xác định cho các chuỗi có độ dài không cần thiết. Nó chỉ cho phép hoán đổi, không chèn. xác định làm thế nào để đệm / cắt chuỗi một cách hợp lý gần như khó như tính toán khoảng cách Levenshtein. Bạn nên pad / trim bắt đầu? Kết thúc? Một số từ giữa?
Lyndon White

Nếu bạn thực sự muốn tránh sự phụ thuộc vào khoảng cách. bạn có thể sử dụng Thực thi mã Rossetta
Lyndon White

đọc en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance tôi có thể thấy cách dịch chuyển có thể tạo ra sự khác biệt đặc biệt cho typo và python có một gói hoàn toàn mới cho nó. Tôi có thể thấy làm thế nào tôi có thể sử dụng từ này trong danh sách các từ và lấy từ "gần nhất" nhưng có thể không quan trọng nhất. Tôi phải lấy danh sách của mình và kiểm tra với tf-idf. Thật tuyệt, cảm ơn bạn
pierre

1
@dduhaime gần như chắc chắn. Nói chung, Tuyên truyền về mối quan hệ có tác dụng đối với các cuộc hội thảo không liên quan, nhưng vì điều này là đối xứng đi trước. Tôi chắc chắn một cái gì đó trong SciPy có một loại ma trận hình tam giác mà vịt là một ma trận hoàn chỉnh. Tôi đã ở trên vùng đất julia-lang quá lâu và không thể nhớ lại cách thức này được thực hiện ở trăn. (Trong sử dụng của julia bạn Symmetric)
Lyndon White

5

Sử dụng các thuật toán phân cụm biểu đồ, chẳng hạn như phân cụm Louvain, Phân cụm tìm kiếm vùng lân cận bị hạn chế (RNSC), Phân cụm dự đoán mối quan hệ (APC) hoặc thuật toán Markov Cluster (MCL).


Thế còn phương pháp K-medoid tôi đã tìm thấy thì sao? Tôi cần phải thực hiện giải pháp này càng sớm càng tốt, vì vậy nó có vẻ là một giải pháp tốt cho tôi. Tôi nhận thức được sự tồn tại của các phương pháp dựa trên biểu đồ này nhưng tôi sợ rằng tôi không thể dành thời gian tôi cần để hiểu và thực hiện chúng.
Ufuk Can bicici 7/11/2016

Đối với tất cả chúng, phần mềm có sẵn với các thỏa thuận cấp phép khá hạn chế, chẳng hạn như GNU GPL. Tôi không phải là một fan hâm mộ lớn của loại thuật toán k-mediods chủ yếu là do tham số k nhưng nó tùy thuộc vào bạn một cách tự nhiên. Nếu bạn cần triển khai trong nhà thì tôi nghĩ APC và MCL có lẽ là dễ thực hiện nhất. Nếu bạn muốn làm điều đó, tất nhiên hãy thử chúng trước.
micans

2

Bạn có thể thử mô hình không gian vectơ với n-gram của các từ làm mục nhập không gian vectơ. Tôi nghĩ rằng bạn sẽ phải sử dụng một biện pháp như độ tương tự cosine trong trường hợp này thay vì khoảng cách chỉnh sửa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.