การจัดกลุ่มรายการสตริง (คำ) แบบยาวเป็นกลุ่มที่คล้ายคลึงกัน


31

ฉันมีปัญหาต่อไปนี้: ฉันมีรายการคำที่ยาวมากอาจเป็นชื่อนามสกุล ฯลฯ ฉันต้องจัดกลุ่มรายการคำศัพท์นี้เช่นคำที่คล้ายกันเช่นคำที่มีการแก้ไขที่คล้ายกัน (Levenshtein) ระยะทางปรากฏใน คลัสเตอร์เดียวกัน ตัวอย่างเช่น "อัลกอริทึม" และ "alogrithm" ควรมีโอกาสสูงที่จะปรากฏในคลัสเตอร์เดียวกัน

ฉันตระหนักดีถึงวิธีการจัดกลุ่มแบบไม่ได้รับการสนับสนุนแบบคลาสสิกเช่นการจัดกลุ่ม k-mean, การจัดกลุ่ม EM ในวรรณคดีการจดจำรูปแบบ ปัญหานี่คือวิธีการเหล่านี้ทำงานในจุดที่อยู่ในพื้นที่เวกเตอร์ ฉันมีคำพูดในมืออยู่ที่นี่ ดูเหมือนว่าคำถามของวิธีการแสดงสตริงในพื้นที่เวกเตอร์ที่เป็นตัวเลขและการคำนวณ "หมายถึง" ของกลุ่มสตริงนั้นยังไม่ได้รับคำตอบที่เพียงพอตามความพยายามในการสำรวจของฉันจนถึงตอนนี้ วิธีการที่ไร้เดียงสาในการโจมตีปัญหานี้คือการรวมกลุ่ม k-Means กับระยะทาง Levenshtein แต่คำถามยังคงเป็น "วิธีการแสดง" หมายถึง "ของสตริงหรือไม่? มีน้ำหนักที่เรียกว่าน้ำหนัก TF-IDF แต่ดูเหมือนว่าส่วนใหญ่เกี่ยวข้องกับพื้นที่ของการจัดกลุ่ม "เอกสารข้อความ" ไม่ใช่สำหรับการจัดกลุ่มคำเดียว http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

การค้นหาของฉันในพื้นที่นี้ยังดำเนินต่อไป แต่ฉันต้องการได้แนวคิดจากที่นี่เช่นกัน คุณจะแนะนำอะไรในกรณีนี้มีใครรู้วิธีการใด ๆ สำหรับปัญหาประเภทนี้บ้าง


1
ฉันได้เรียนรู้เกี่ยวกับการดำรงอยู่ของตัวแปร k-mean ที่ชื่อว่า "K-medoids" en.wikipedia.org/wiki/K-medoidsมันไม่ทำงาน witk L2 Euclidian ระยะทางและไม่จำเป็นต้องคำนวณหาค่าเฉลี่ย มันใช้จุดข้อมูลที่อยู่ใกล้กับคนอื่น ๆ ในกลุ่มเป็น "medoid"
Ufuk Can Bicici

1
It seems that there are some special string clustering algorithms. หากคุณมาจากเขตการขุดเฉพาะข้อความไม่ใช่การวิเคราะห์สถิติ / ข้อมูลคำสั่งนี้รับประกัน อย่างไรก็ตามหากคุณได้เรียนรู้การจัดกลุ่มสาขาเนื่องจากเป็นคุณจะพบว่าไม่มีอัลกอริทึม "พิเศษ" สำหรับข้อมูลสตริง "พิเศษ" เป็นวิธีที่คุณประมวลผลข้อมูลดังกล่าวก่อนที่คุณจะป้อนลงในการวิเคราะห์กลุ่ม
ttnphns

เกี่ยวข้อง: stackoverflow.com/questions/21511801/…
Andre Holzner

สังเกตเห็นความแตกต่างระหว่าง Affinity Propagation และการทำคลัสเตอร์ K-Means และวิธีที่จะมีผลต่อเวลาในการคำนวณ quora.com/…
Gabriel Alon

คำตอบ:


37

seconding @ mican ของข้อเสนอแนะสำหรับการขยายพันธุ์เป็นพี่น้องกัน

จากบทความ: L Frey, Brendan J. และ Delbert Dueck "การทำคลัสเตอร์โดยส่งข้อความระหว่างจุดข้อมูล" วิทยาศาสตร์ 315.5814 (2007): 972-976 .

มันสุดยอดใช้งานง่ายผ่านหลายแพ็คเกจ มันทำงานกับทุกสิ่งที่คุณสามารถกำหนดความคล้ายคลึงกันแบบหนึ่ง ซึ่งคุณจะได้รับโดยการคูณระยะทาง Levenshtein ด้วย -1

ฉันได้รวมตัวอย่างรวดเร็วโดยใช้ย่อหน้าแรกของคำถามของคุณเป็นข้อมูลป้อนเข้า ใน 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))

เอาต์พุตคือ (ตัวอย่างในตัวเอียงทางด้านซ้ายของคลัสเตอร์ที่เป็นแบบอย่าง):

  • มี:โอกาส, แก้ไข, มือ, มี, สูง
  • ต่อไปนี้ต่อไป
  • ปัญหา:ปัญหา
  • I: I, a, at, etc, in, list, of
  • อาจจะเป็น:อาจจะเป็น
  • คลัสเตอร์:คลัสเตอร์
  • คำ:สำหรับ, และ, สำหรับ, ยาว, ต้องการ, ควร, มาก, คำ, คำ
  • คล้ายกัน:คล้ายกัน
  • Levenshtein: Levenshtein
  • ระยะทาง:ระยะทาง
  • :นั่น, สิ่งนี้, กับ, ด้วย
  • เดียวกัน:ตัวอย่างรายการชื่อชื่อเดียวกันเช่นเดียวกัน
  • อัลกอริทึม:อัลกอริทึม, alogrithm
  • ปรากฏ:ปรากฏขึ้นปรากฏขึ้น

เรียกใช้บนรายการ50 ชื่อแรกแบบสุ่ม :

  • ไดแอน: 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:ฤดูใบไม้ร่วง, Haydee, Laureen, Lauren
  • Alberto: Albertha, Alberto, Robert
  • ตำนาน: Ammie, Doreen, Eura, Josef, ตำนาน, Lori, Porter

ดูดีมากสำหรับฉัน (สนุกมาก)


เป็นไปได้หรือไม่ที่จะมีอัลกอริทึมแบบเดียวกันโดยใช้ sklearn เท่านั้น? หรือใช้ scipy.spatial.distance กับ hamming? ข้อดีของการใช้ levenshtein คืออะไร? ฉันเดาว่าฉันจะต้องลองใช้คำถามนี้: stackoverflow.com/questions/4588541/…
pierre

1
@pierre Levenshtein เป็นสิ่งที่ฉันเรียกว่า "นักสะกดคำระยะทาง" มันเป็นพร็อกซีที่ดีสำหรับโอกาสในการสะกดผิดของมนุษย์ Damerau Levenshteinอาจจะดีกว่า ฉันไม่รู้ว่าHamming Distanceนั้นถูกกำหนดไว้สำหรับสตริงที่ไม่มีความยาวเท่ากัน อนุญาตเฉพาะการสลับเท่านั้นไม่ใช่การแทรก การกำหนดวิธีการตัด / ตัดแต่งสตริงส่วนใหญ่สมเหตุสมผลเกือบจะยากเท่ากับการคำนวณระยะทางของ Levenshtein คุณควร pad / ตัดแต่งจุดเริ่มต้นหรือไม่ ตอนจบ? บางส่วนจากกลาง?
Lyndon White

หากคุณต้องการหลีกเลี่ยงการพึ่งพาระยะทางจริงๆ คุณสามารถใช้การดำเนินการรหัส Rossetta
Lyndon White

อ่านen.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance ฉันสามารถดูว่าการขนย้ายสามารถสร้างความแตกต่างเป็นพิเศษสำหรับ typo และ python มีแพ็คเกจใหม่เอี่ยมสำหรับมัน ฉันเห็นว่าฉันสามารถใช้สิ่งนี้กับรายการคำศัพท์และได้รับ "คำที่ใกล้เคียงที่สุด" แต่อาจไม่ใช่สิ่งที่สำคัญที่สุด ฉันต้องรับรายชื่อของฉันและตรวจสอบกับ tf-idf เยี่ยมมากขอบคุณ
pierre

1
@ddhaime เกือบจะแน่นอน โดยทั่วไป Affinity Propagation ใช้สำหรับการตั้งค่าแบบไม่เกี่ยวกับความรู้สึก แต่เนื่องจากนี่คือสมมาตร ฉันแน่ใจว่าบางสิ่งใน SciPy มีประเภทเมทริกซ์สามเหลี่ยมที่ ducktypes เป็นเมทริกซ์ที่สมบูรณ์ ฉันอยู่ในดินแดนจูเลียแลงนานเกินไปแล้วและจำไม่ได้ว่ามันทำยังไงกับงูหลาม (ใน julia You'reld use Symmetric)
Lyndon White

5

ใช้อัลกอริทึมการจัดกลุ่มกราฟเช่นการทำคลัสเตอร์ Louvain, Clustering ย่านการค้นหาที่ จำกัด (RNSC), Clustering Affinity Propgation (APC) หรืออัลกอริทึม Markov Clustering (MCL)


สิ่งที่เกี่ยวกับวิธี K-medoids ฉันได้พบ? ฉันจำเป็นต้องใช้โซลูชันนี้โดยเร็วที่สุดดังนั้นจึงเป็นทางออกที่ดีสำหรับฉัน ฉันตระหนักถึงการมีอยู่ของวิธีการที่ใช้กราฟเหล่านี้ แต่ฉันกลัวว่าฉันไม่สามารถจ่ายเวลาที่ฉันต้องเข้าใจและนำมาใช้
Ufuk Can Bicici

สำหรับซอฟต์แวร์ทั้งหมดนั้นมีอยู่ในข้อตกลงการอนุญาตใช้งานที่ไม่ จำกัด เช่น GNU GPL ฉันไม่ใช่แฟนตัวยงของอัลกอริทึมชนิด k-mediods ส่วนใหญ่เป็นเพราะพารามิเตอร์ k แต่ขึ้นอยู่กับคุณโดยธรรมชาติ หากคุณต้องการการติดตั้งภายใน บริษัท ฉันคิดว่า APC และ MCL น่าจะเป็นวิธีที่ง่ายที่สุด ถ้าคุณทำอย่างนั้นลองพวกเขาออกก่อนแน่นอน
micans

2

คุณสามารถลองแบบจำลองปริภูมิเวกเตอร์ด้วย n-g ของคำเป็นรายการปริภูมิเวกเตอร์ ฉันคิดว่าคุณจะต้องใช้การวัดเช่นความคล้ายคลึงโคไซน์ในกรณีนี้แทนที่จะแก้ไขระยะทาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.