Yapılandırılmamış metin sınıflandırması


12

Yapılandırılmamış metin belgelerini, yani bilinmeyen yapıdaki web sitelerini sınıflandıracağım. Sınıflandırdığım sınıfların sayısı sınırlıdır (bu noktada üçten fazla olmadığına inanıyorum). Nasıl başlayabileceğim konusunda bir önerisi olan var mı?

Burada "kelime torbası" yaklaşımı uygulanabilir mi? Daha sonra, belge yapısına (belki de karar ağaçları) dayalı başka bir sınıflandırma aşaması ekleyebilirim.

Mahout ve Hadoop'a biraz aşinayım, bu yüzden Java tabanlı çözümleri tercih ediyorum. Gerekirse, Scala ve / veya Spark motoruna (ML kütüphanesi) geçebilirim.

Yanıtlar:


14

En baştan başlayalım. Sınıflandırma (sınıflandırma olarak da bilinir) denetimli öğrenmeye bir örnektir . Denetimli öğrenmede:

  • model - verilerinizdeki iç yapıya yaklaşan, bu konuda mantık yürütmenizi ve yararlı tahminler yapmanızı sağlayan bir şey (örneğin, bir nesnenin sınıfını tahmin etme); normalde modelde "öğrenmek" istediğiniz parametreler vardır
  • eğitim ve test veri kümeleri - modelinizi eğitmek (parametreler için iyi değerler bulmak) ve daha fazla değerlendirme yapmak için kullandığınız nesne kümeleri
  • eğitim ve sınıflandırma algoritmaları - önce eğitim veri kümesinden modelin nasıl öğrenileceğini açıklar, ikincisi eğitimli model verilen yeni bir nesnenin sınıfının nasıl türetileceğini gösterir

Şimdi basit bir spam sınıflandırması vakası ele alalım. Eğitim veri kümeniz, "spam" veya "spam değil" e-postaları + karşılık gelen etiketlerden oluşan bir gruptur. Test veri seti aynı yapıya sahiptir, ancak bazı bağımsız e-postalardan yapılmıştır (normalde veri kümesini böler ve 9/10'u eğitim için ve 1/10 - test için kullanılmasını sağlar). E-postaları modellemenin bir yolu, her birini bir kelime kümesi (çanta) olarak temsil etmektir. Kelimelerin birbirinden bağımsız olduğunu varsayarsak, Naive Bayes sınıflandırıcısını kullanabiliriz , yani her bir kelime ve her sınıf için önceki olasılıkları hesaplayabiliriz (eğitim algoritması) ve sonra yeni bir belgenin ait olma olasılığını bulmak için Bayes teoremini uygulayabiliriz. belirli sınıf.

Yani, temelde:

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

Şimdi nesnelerimizi (belgelerimizi) bir kelime torbası olarak temsil ettiğimizi unutmayın. Ama tek yol bu mu? Aslında, ham metinden çok daha fazlasını çıkarabiliriz. Örneğin, kelimeler yerine saplarını veya lemmalarını kullanabilir, gürültülü durma sözcükleri atabilir , kelimelerin POS etiketlerini ekleyebilir , adlandırılmış varlıkları çıkarabilir ve hatta belgenin HTML yapısını keşfedebiliriz. Aslında, bir belgenin (ve genel olarak herhangi bir nesnenin) daha genel temsili bir özellik vektörüdür . Örneğin, metin için:

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

Burada ilk satır olası özelliklerin bir listesidir ve sonraki satırlar bu özelliğin bir belgede kaç kez oluştuğunu gösterir. Örneğin ilk belgede "aktör" kelimesi, 1 "yanık" kelimesi, 5 isim, 2 sıfat ve 2 metin kalın harfle yazılmıştır. Son sütun sonuçta ortaya çıkan bir sınıf etiketine karşılık gelir.

Özellik vektörünü kullanarak metinlerinizin herhangi bir özelliğini dahil edebilirsiniz. İyi özelliklerin bulunması biraz zaman alabilir.

Peki ya model ve algoritmalar? Naif Bayes'e bağlı mıyız? Bir şey değil. lojistik regresyon , SVM , karar ağaçları - sadece birkaç popüler sınıflandırıcıdan bahsetmek. (Çoğu durumda "sınıflandırıcı" dediğimizi, eğitim ve sınıflandırma için model + karşılık gelen algoritmaları kastettiğimizi unutmayın).

Uygulamaya gelince, görevi 2 bölüme ayırabilirsiniz:

  1. Ekstraksiyon - ham metinleri özellik vektörlerine dönüştürme.
  2. Nesne sınıflandırması - model oluşturma ve uygulama.

İlk nokta, birçok NLP kütüphanesinde iyi çalışılmıştır . İkincisi, makine öğrenmeyle ilgilidir, bu nedenle veri kümenize bağlı olarak Weka veya MLlib kullanabilirsiniz .


Orijinal Poster "sınıflandır" kelimesini kullandı, ancak "küme" probleminin daha doğru bir tanımı çünkü kategorilerin a priori tanımları yok. Bu nedenle, bu mutlaka denetimli bir öğrenme sorunu değildir.
MrMeritology

@MrMeritology: hmm, bağlamdan, yazarın kullanacağı somut sınıflar hakkında emin olmadığını söyleyebilirim, ancak yine de sınıflandırma istiyor, kümeleme değil. Her neyse, gerçeği bilen tek kişi :)
arkadaş

Belki bu noktada net değildim. Kategoriler tavsiye olarak seçilecektir, bu yüzden kümeleme probleminden ziyade sınıflandırmadır. Karmaşık özellikler vektörü oluşturma fikri oldukça makul görünmektedir - özellikle, bazı örnekleri hızlı bir şekilde sınıflandırması muhtemel bazı belirli etiketler vardır. Yüksek doğrusal olmayanlıkları tahmin ettiğim için SVM'nin soruna uygun olup olmayacağından emin değilim, ancak karar ağaçları ve Bayes uygulanabilir gibi görünüyor. Ayrıca hibrit bir algoritmanın (SVM tabanlı karar ağaçları) uygulanmasını düşünmeye başlıyorum.
Grzegorz E.

@GrzegorzE. - Kategorileriniz önceden tanımlanmışsa, lütfen sorunuzdaki bu üç kategoriyi listeleyin. Bence, ML algoritmalarına çok odaklanıyorsunuz ve probleminizin doğasına ve verilerinizin doğasına yeterli değilsiniz. Örneğin, yapısı bilinmeyen web sitelerinin özelliklerinde "satır olmayanlar" ı tahmin edersiniz. Neden? Ayrıca, etiketleri web sayfası metniyle başka kim bilir ne ile karıştırıyorsunuz ve bunların farklı anlamsal önemi var.
MrMeritology

@GrzegorzE. - Sınıflandırma yönteminizin öncelikle öncelikli kategorilerinizin doğası ve verilerin doğası tarafından yönlendirilmesini önemle tavsiye ederim. Keyfi web sitelerini 3 kategoriye ayırmanın sonsuz sayıda yolu vardır. Kategorilere ayırmanın her yolu, verilerdeki veya göze çarpan desenlerde göze çarpan özellikler önerir. Tek tek veri öğelerinin (web sayfaları) ve içeriklerinin manuel analizinin yerini tutamaz.
MrMeritology

5

Konu Modelleme, sorununuz için çok uygun bir yöntem olacaktır. Konu Modelleri, belirli (veya keşfedilen) sayıda konunun birlikte görünme olasılığı yüksek olan sözcüklerin bir listesi ile tanımlandığı, denetimsiz öğrenme / keşif biçimidir. Ayrı bir adımda, her konuyu konu uzmanlarını kullanarak etiketleyebilirsiniz, ancak amaçlarınız için bu yalnızca üç kümeye ulaşmak istediğiniz için gerekli değildir.

Her belgeye bir kelime torbası gibi davranırsınız ve durma sözcüklerini, vb. Kaldırmak için ön işlemleri yaparsınız. En basit yöntemlerle, konu sayısını önceden belirtirsiniz. Sizin durumunuzda, kategoriler üzerindeki sabit sınırınız olan "3" ü belirtebilir veya daha fazla sayıda konu (10 ile 100 arasında) seçebilir ve ardından ayrı bir adımda, genel vurgu yapan belgeler için üç küme oluşturabilirsiniz konular. K-araçları veya diğer kümeleme yöntemleri kullanılabilir. (İkinci yaklaşımı tavsiye ederim)

Konu modelleme yazılımını sıfırdan kodlamanıza gerek yoktur. Aşağıda , yazılım kitaplıkları / paketleri de dahil olmak üzere birçok kaynağı olan bir web sayfası bulunmaktadır .

Hiçbiri Java'da değildir, ancak Java altında C ++ ve Python'u çalıştırmanın yolları vardır.


4

İşte başlamanıza yardımcı olacak metin sınıflandırması için gerçekten harika bir açık kaynak yazılım paketi:

  • MALLET , metin verileriyle çalışmak için UMass tarafından geliştirilen CPL lisanslı Java tabanlı bir makine öğrenme araç takımıdır. Çeşitli sınıflandırma algoritmalarının (örn. Saf Bayes, maksimum entropi, karar ağaçları) uygulamalarını içerir.
  • Stanford Sınıflandırıcı Stanford NLP Grubundan metin veri ile çalışması için tasarlanmış bir Maksimum entropi sınıflandırıcı bir GPL lisanslı Java uygulamasıdır.
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.