Dizeleri ortak temalara göre nasıl gruplandırabilirim?


10

Örneğin, programlama ile ilgili diğer dizelerle programlama hakkında dizeleri, fizikle ilgili dizeleri fizikle ilgili diğer dizelerle vb. Gruplandırmaya çalışıyorum. Sorunun göze çarpan teorik dilsel yönüne rağmen, aslında bunu programlama / yazılım kullanarak yapmak istiyorum.

Özet: Çok sayıda dizge göz önüne alındığında, bunları semantik temaya göre gruplandırmaya nasıl giderim?

Özel uygulama: Ben ortak gruplara (otomobiller, bilgisayarlar, politika, Kanada, gıda, Barack Obama, vb.) Kategorize etmek istiyorum ~ 200k trivia sorularım var.

Neye baktım: Vikipedi (yapmaya çalıştığım şeyin aslında NLP olduğunu varsayarak) doğal dil işleme araç takımlarının bir listesini var, bu yüzden birkaçına baktım ama hiçbiri ihtiyaçlarıma benzer bir şey yapmıyor gibi görünüyor.

Notlar: Bunu yapmanın ek bilgi gerektirdiğine dikkat çekilmiştir (örneğin, bir Porsche otomobil, C ++ bir programlama dili). O zaman eğitim verilerinin gerekli olduğunu varsayıyorum, ancak yalnızca soru ve cevap listem varsa, eğitim verilerini nasıl oluşturabilirim? Ve sonra eğitim verilerini nasıl kullanırım?

Daha fazla not: Soru ve Cevap yardımımın geçerli biçimlendirmesi (JSON gibi görünse de, temelde bir ham metin dosyasıdır):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Ancak birisi zaten bir kategori olduğunu belirtmeden önce, bunun gibi ~ 200 bin soru ve cevap olduğunu ve temelde birçok "kategori" olduğunu unutmayın. Bunları yukarıda listelenenler gibi daha geniş gruplara ayırmaya çalışıyorum. Ayrıca, bu biçimlendirme tüm sorular için çok kolay bir şekilde değiştirilebilir, programlı olarak yaparım.

Ve daha fazla not: Aslında kaç kategoriye ihtiyacım olacağını bilmiyorum (en az 10-20), çünkü tüm soruları kendim okumadım . Kısmi olarak, sınıflandırma sırasında sonlu sayının bir şekilde belirlenmesini bekliyordum. Her durumda, her zaman manuel olarak bir dizi kategori oluşturabilirim.


Havuçu nasıl kullanıyordun? Bu konudaki kısa okumadan, 200k kayıtlarını kolayca işlemesi gerektiği anlaşılıyor.

Düşündüğümden çok daha uzun sürdü ve JVM'nin ilk bellek tahsisini 1024m'ye ve maksimum belleği 2048m'ye yükseltmeye zorladı. Bu sesi çıkardığım kadar kötü değildi.

Sadece yeterli eğitim verisine ihtiyacınız var ve soruları bu kategorilere ayırabilmelisiniz. Tam otomatik bir yaklaşım muhtemelen onları diğer araçlarla, örneğin "araba" kelimesini içeren sorularla gruplandıracaktır. Eş anlamlı kelimeleri grup oluşturma ile aynı anda öğrenemezsiniz.
QUIT - Anony-Mousse

Eh, toplu işlem yapıyorsunuz; JVM vermek gerçekten sorun değil. Ne kadar sürdü? Belgeleri nereden yüklediniz? Özel bir kaynak mı?

Belki 10 dakika sürdüm, ama katılıyorum, toplu işlem tanımı gereği zaman alıcı ve bellek yoğun. Boğulma konusundaki tüm bu utanç meselesi olmasa da, daha çok bir yan not.

Yanıtlar:


4

Bu NLP'de oldukça standart bir sorundur ve aradığınız sihirli Google kelimeleri "konu modelleme" dir. Dizeleriniz oldukça kısa olmasına rağmen, Latent Dirichlet Ataması veya benzer bir yöntemle bazı başarılarınız olabilir . Burada algoritmanın arkasındaki genel fikri ortaya koyan Edwin Chen tarafından yazılmış güzel bir blog yazısı var . Uygulama ayrıntıları bu notta Yi Wang tarafından kapsanmaktadır .

Hazır bir çözüm arıyorsanız topicmodels, hem LDA hem de daha sofistike bir İlişkili Konu Modeli için oldukça güzel bir arayüz sağladığı için R için paketi denemenizi öneririz . Burada David Mimno tarafından yapılan iyi uygulamaların listesi de var .


Teşekkür ederim, Chen'in blog yazısı ne yapmaya çalıştığımın yerinde görünüyor. Bunu daha önce listelediğiniz / yaptığınız şeyleri kullanma şansınız var mı? Burada tamamen yeni bir zemindeyim ve ne yapmam gerektiğine dair bir izlenimi takdir ediyorum (hazır çözümlerden birini kullanarak). "Belgelerimi" nasıl biçimlendirmeliyim? Hangi grupta hangi belgenin olduğunu belirlememe izin vermek için her bir Soru-Cevap bölümüne kimlik uygulamalıyım? Çıkarılan verileri nasıl kullanırım? Dediğim gibi, pek çok ayrıntıyı anlamıyorum.
Whymarrh

R topicmodels paketini biraz kullandım. Kesinlikle kendi kodunuzu atmanızı tavsiye ederim - cran.r-project.org/web/packages/topicmodels/vignettes/… adresinde çalışılmış bir örnek içeren bazı belgeler var . Her belgenin özel biçimlendirmesi gerçekten önemli değil, çünkü her şey yine de bir "kelime torbası" temsiline indirgenecek. İlişkili tüm metni tek bir dizeye atmanız yeterlidir.
Martin O'Leary

4

Burada iki sorunu çözmeye çalışıyorsunuz.

Sorun 1: Soru dizelerini uygun kategoride sınıflandırın.

Sorun 2: Uygun kategoriler oluşturun.

İlk sorun, denetimli algoritmalar tarafından yapılabilir, birçok sınıflandırıcı çok iyi doğruluk ve performans verebilir. Bununla birlikte, ince havadan kategoriler (tonlarca veri) yaratan sorun 2, çok daha zordur. Bu, denetim altında olmayan bir sorundur, birçok veri göz önüne alındığında, bilgisayar bazı kriterler verildiğinde kategorileri bağımsız olarak belirler. İdeal olarak, bu kriterler ve algoritma verilerinizi kümeler halinde düzgün bir şekilde düzenlemelidir. Bunlar daha sonra etiketlenebilir. Bununla birlikte, bu çok daha zor bir görev olduğundan, büyük olasılıkla uzman gerektirecek çok fazla ayarlama çabası olmadan iyi bir sonuç verecek kabul edilebilir bir bırakma çözümü olmadığını söyleyebilirim.

Korkarım, henüz burada sihirli bir düğme yok. Ancak yapabileceğiniz şey, makineye biraz yardım etmektir. Örneğin, kategori kümesine karar verebilirsiniz. Kategorilere karar verdiğinizde, eğitim verileri oluşturabilirsiniz. Bu kurulumda, eğitim verileri sadece soru ve doğru kategori çiftleridir.

Daha fazla eğitim verisi daha iyidir. Bununla birlikte, görev yine de otomatik olarak bir şey olduğu için, ilk önce işleri manuel olarak yapmaya başlamak mantıklı değildir. Şimdi neden eğitim verisi almak istersiniz? Doğruluk değerlendirmesi. İyi sonuçlar istiyorsanız, bir kurulumun ne kadar iyi olduğu konusunda bir tür değerlendirme yapabilmeniz hayati önem taşır. Ve bunu sistematik olarak yapmanın tek yolu bazı görevleri kendiniz manuel olarak etiketlemektir. Aksi takdirde körlerin içindesiniz.

Sonra bazı yeni sorular ortaya çıkıyor. İlk olarak: Ne kadar eğitim verisine ihtiyacım var? "Değişir". Verilerinizi veya kategorilerinizi görmeden tahmin bile edemeyeceğimden emin değilim; ama bir "basketbol sahası tahmini" alabilir ve yaklaşık 500 soru söyleyebilirim. Büyüklük sırasına göre kapalı olabileceğimi unutmayın.

Bu gerçekten 500 soruyu elle etiketlemeniz gerektiği anlamına mı geliyor? Evet ve hayır. "Bootstrap" sınıflandırıcılarına ara sonuçlar ve biraz akıllılık kullanmak mümkündür. Yine de elle yapılan bir çalışma ve üzerinde düşündüğünüzde 500 soru etiketlemek için uzun sürmeyecek. Burada akıllı olmak, çalışkan olmaktan çok daha kötü sonuçlar verebilir.

Yeterli miktarda egzersiz verileriniz varsa, bunun% 75'ini alın ve favori aracınızı (örneğin burada belirtilenler veya olmayanlar) kullanarak bir sınıflandırıcı oluşturun. Şimdi, sınıflandırıcının verilerin% 25'ini dışarıda bırakmaya çalışmasını sağlayın ve ortaya çıkan doğruyu ölçün. Sonuç iyi ise, o zaman şampanya açın. Değilse, daha fazla egzersiz verisi yapın veya başka bir sınıflandırıcı deneyin.

TL; DR

Özetle, bunu nasıl yapardım.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

Küçük bir soru: Eğitim verileri ve bunları manuel olarak etiketlemek için "yaklaşık 500 soru" diyorsunuz, ama aynı zamanda "büyüklük sırasına göre kapalı olabilirim", yani 5k veya 50k soruları kullanacak olsaydım, yine de manuel olarak bu kadar çok etiket?

Mesele şu; verilerinizi görmeden veya projenizdeki tüm dakika ayrıntıları hakkında net bir fikre sahip olmadan, iyi bir tahmin vermek zordur. Ancak, 500'ün çok düşük olması durumunda, etiketleme çabası boşa gitmediğini hatırlamak önemlidir. Değerlendirme için yine de manuel olarak etiketlenmiş sorulara ihtiyacınız vardır. Ne kadar çok değerlendirme veriniz varsa, o kadar iyi değerlendirme yapabilirsiniz.

Bir büyüklük derken 50-500-5000 demek istedim. 50 bin kişiyi sınıflandırman gerekeceğini sanmıyorum. Tüm cesedinizin 1 / 4'ü! 500 sorunun çok düşük olması halinde, sınıflandırıcıları önyüklemek mümkündür. Buradaki fikir, sınıflandırıcıyı küçük bir başlangıç ​​topluluğunda (örneğin 500'ünüz) eğitmeniz ve geri kalanını etiketlemenizdir. Şimdi, sınıflandırıcının yeni, daha büyük bir sınıflandırıcıyı yeniden eğitmek için kendinden emin olduğu bazı durumları kullanabilirsiniz.

Akılda tutulması gereken bir diğer önemli şey; birçok sınıflandırıcının performansı eğitim verisi miktarında doğrusal değildir, ancak tipik olarak sigmoid benzeri bir eğri olacaktır. Bu, 500 etiketli sorunun 5000 kadar iyi bir fayda olabileceği anlamına geliyor. Tavsiyem küçük adımlarla çalışmak.

Projemle ilgili hangi ayrıntılar ek bilgi sağlayabilir? Biçimlendirmemi göstermek için bazı örnek soruları paylaşabilirim, ancak Soru ve Cevap biçimimi kategorizasyon sürecine uyacak şekilde uyarlamaya hazırım. Yardımı takdir ediyorum.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.