Soru Metinden gelen ifadeleri ve anahtar kelimeleri algılamak için algoritmalar


Yaklaşık 10,000 girişe bölünmüş, yaklaşık 100 megabaytlık metinim var. Otomatik olarak bir 'etiket' listesi oluşturmak istiyorum. Sorun, sadece birlikte gruplandırıldıklarında anlamlı olan kelime grupları (yani sözcük öbekleri) olmasıdır.

Eğer sadece kelimeleri sayıyorsam, çok fazla sayıda yaygın kelime alıyorum (bu, için, in, am, vb.). Kelimeleri ve önceki ve sonraki kelime sayılarını saydım ama şimdi ne yapacağımı şimdi anlayamıyorum 2 ve 3 kelime öbekleri ile ilgili bilgiler mevcut, fakat bu verileri nasıl çıkaracağım?


40
2017-10-29 13:11


Menşei


İlk önce giriş kelimelerini bir 'stop' sözcüğü ile ortak 'gürültü' sözcüklerini kaldırarak temizlemeyi isteyebilirsiniz. - teabot
@teabot, evet, gürültü kelimeleri ile uğraşmak önemlidir ama bu kelimeler başka amaçlara hizmet edene kadar yapılmamalıdır. Örneğin, giriş metnini POS etiketlemeyi düşünüyorsanız, gürültü sözcükleri gerekli olacaktır. POS etiketleme ile bile, daha basit teknikler bu gürültü sözcüklerini ifade sınırlarını vb. - mjv
@Kimvais, lütfen büyük 'etiket listesi' amacına göre daha fazla arka plan sağlar. Sadece metni indekslemek mi, etiket bulutları yaratmanın bir yolunu sağlamak mı, temeldeki belgelerin sınıflandırılması için bir adım mı, vb mi? Bu ek bilgi ile, SO katkıda bulunanlar bu nispeten geniş arayışa daha iyi cevap verebilecekler. İhtiyacınız olan tek şey, her şeyden ziyade Swish-e olabilir, ya da çeşitli NLP uygulamalarının özel bir ihtiyaca hizmet etmek için nasıl uyarlanabileceğine dair daha fazla öneri ve fikre ihtiyacınız olabilir (zorunlu olarak "tekerleği yeniden icat etmeden"). - mjv
Mjv - veri, biletlerle ilgili iletişimdir, amaç, genellikle uzun bir iletişimin anahtar kelimelerini saptamaktır, böylece otomatik bir 'etiket bulutu' ve alakalı / alakalı veya aynı özellikteki anlaşmalarla ilgilenen biletlerimiz olabilirdi. vb. - Kimvais


Cevaplar:


Her şeyden önce, Giriş metninde gelen "sınırlar" ile ilgili bilgileri korumaya çalışın.
(Eğer böyle bir bilgi kolayca kaybolmazsa, sorunuz, belki de sembolleştirmenin hali hazırda yapıldığını gösterir)
Jetonlaştırma sırasında (bu durumda sözcük ayrıştırma) işlem, tanımlayabilecek kalıpları arayın. İfade sınırları (noktalama işaretleri, özellikle periyotlar ve ayrıca çoklu LF / CR ayırma gibi, bunları kullanın. Ayrıca "gibi" gibi kelimeler de sınırlar olarak kullanılabilir. Bu ifade sınırları genellikle "negatif" dir. emin olan örnekleri değil Aynı ifadeye dahil edilmelidir. Birkaç pozitif sınır, özellikle çift tırnak işaretleridir. Bu bilgi türü, n-gramlardan bazılarını filtrelemek için yararlı olabilir (sonraki paragrafa bakınız). Ayrıca "örneğin" ya da "yerine" ya da "ihtiyaç duyma" gibi kelime sıralamaları da ifade sınırları olarak kullanılabilir (ancak bu bilgiyi kullanarak daha sonra tartışacağım "öncelikleri" kullanarak).

Dış veri kullanmadan (giriş metninden farklı olarak), üzerinde istatistik çalıştırarak göreceli bir başarı elde edebilirsiniz. metnin diyagramları ve trigramları (2 ve 3 ardışık kelime dizisi). Ardından, önemli (*) sayıda örneğe sahip olan diziler, büyük olasılıkla, aradığınız "ifade / kelime öbekleri" türünde olacaktır.
Bu biraz ham yöntem birkaç yanlış pozitif getirecektir, ancak bütün olarak uygulanabilir olabilir. İlk paragrafta belirtildiği gibi "sınırlar" ı geçtiği bilinen n-gramları filtreleyerek, doğal dillerin cümlesinin sona ermesi ve cümlenin başlaması, mesaj alanının sınırlı bir alt kümesinden çekilme eğiliminde olduğundan ve bu nedenle de tokenin kombinasyonlarını üretmesi nedeniyle önemli ölçüde yardımcı olabilir. istatistiksel olarak iyi temsil edilmiş gibi görünmektedir, fakat bunlar tipik olarak semantik olarak ilişkili değildir.

Daha iyi yöntemler (muhtemelen daha pahalı, işleme-bilge ve tasarım / yatırım açısından), giriş metninin alanı ve / veya ulusal dilleri ile ilgili ekstra "öncelikleri" kullanacaktır.

  • POS (bölümlendirme) etiketleme çeşitli yönlerden oldukça yararlıdır (ek, daha nesnel ifade sınırları ve ayrıca "gürültü" sözcükleri sınıfları sağlar, örneğin, bütün nesneler, varlıklar bağlamında kullanıldığında bile, tipik olarak OP'nin istediği şekilde etiket bulutlarında çok azdır. üretmek.
  • Sözlükler, sözcükler ve benzerleri de oldukça kullanışlı olabilir. Özellikle, "varlıkları" tanımlayanlar ( WordNet lingo) ve alternatif formları. Varlıkları, bulutları etiketlemek için çok önemlidir (bunlar, içinde bulunan tek kelime sınıfı olmasalar da) ve onları tanımlayarak, onları normalleştirmek de mümkündür (söylenebilecek birçok farklı ifade, "Senatör T. Kennedy "), böylece çiftleri ortadan kaldırır, aynı zamanda alttaki varlıkların sıklığını da arttırır.
  • Eğer kurum bir belge koleksiyonu olarak yapılandırılmışsa, TF (Dönem Frekansı) ve IDF (Ters Belge Sıklığı) ile ilgili çeşitli hilelerin kullanılması yararlı olabilir.

[Üzgünüm, şimdilik, gitmeli (artı özel hedeflerinizden daha fazla ayrıntı vb.). Daha fazla detay ve nokta sağlamayı deneyeceğim]

[BTW, buraya takmak istiyorum Jonathan Feinberg ve Dervin Thunk yanıtları Bu yazıdan, mükemmel bir işaretçi sağladıkları gibi, eldeki görev türü için yöntemler ve araçlar açısından. Özellikle, NTLK ve Python-at-large deney yapmak için mükemmel bir çerçeve sağlayın]


34
2017-10-29 13:25





Harika bir bölümle başlarım, Peter Norvig, O'Reilly kitabında Güzel veri. İhtiyacınız olan ngram verilerini, güzel Python koduyla birlikte (problemlerinizi olduğu gibi çözebilir veya bazı değişikliklerle birlikte) sağlar. kişisel web sitesinde.


11
2017-10-29 13:20



Bu büyük bir bölüm, tamamen okumaya değer - Bilmemden beri bilmeliyim. :-) Ancak bu, yayınlanan soruyu doğrudan ele almıyor. (Sanırım cevabım işe yaramıyor.) Neyle ilgili? tür Bir metin corpus n-gram istatistikleri ile yapabileceğiniz şeylerin, ve nasıl yazım düzeltmesi, cryptograms çözme, ve parçalama wordcrammed to all afterspaces. - Darius Bacon
Evet, ancak bağlantılı ngram verilerini kullanarak, veri kümesini hızlı bir şekilde üfleyebilir ve anlamlı ngramlar çıkarabilir. - Jonathan Feinberg
Kimvais zaten kendi veri kümesinden n-gram verileri hesaplamış gibi geliyor ve veriyi, şans eseri olmaktan çok daha sık görünen sözcük dizilerini ayırt etmek için nasıl kullanacağını soruyor. - Darius Bacon
"Anlamlı" ile kastettiğim buydu :) - Jonathan Feinberg
TAMAM. Cevabım budur ve Norvig'in kodu da öyle değil. Bölümün n-gramlara büyük bir giriş için okumaya değer olduğuna katılıyorum Genel olarakHer ne kadar pek çok kişi o kolleksiyonları takip edemese de o olmadan refu. - Darius Bacon


Aradığın gibi geliyor sıralama çıkarma. Manning ve Schütze adanay bölüm konuya, Bağlantılı Vikipedi makalesinde bahsedilen 'önerilen formüllerin' açıklanması ve değerlendirilmesi.

Bütün bölümü bu cevaba sığamam; umarım bir kısmı onların bağlantıları yardım edecek. (NSP özellikle aptalca geliyor.) nltk bir kolokasyon modülü Ayrıca, Manning ve Schütze'nin kitabından çıktığı zamandan söz etmediği de söylenemez.

Şimdiye kadar yayınlanan diğer yanıtlar daha genel olarak istatistiksel dil işleme ve n-gramlarla ilgilenmektedir; Kolokasyonlar belirli bir alttopiktir.


8
2017-10-29 17:46





Kelimeler için bir matris yapın. Ardından iki ardışık kelime varsa, o zaman bu uygun hücreye ekleyin.

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

Bu iki ardışık kelime için değer verecektir. Bu kelimeyi üç kelimeyle de yapabilirsiniz. Dikkatli olun, O (n ^ 3) bellek gerektirir.

Verileri saklamak için bir yığın da kullanabilirsiniz:

heap['for example']++;
heap['example you']++;

0
2017-10-29 13:19





Bir yolu kendine bir otomatikman inşa etmek olurdu. Büyük olasılıkla bir belirsiz olmayan Sonlu Otomatikman (NFA). NFA

Başka bir basit yol, program başladığında bunları yok saymak, bulmak, karşılaştırmak, vb. Saklamak istediğiniz kelimeleri ve / veya kelime gruplarını içeren bir dosya oluşturmak ve daha sonra programladığınız dosyayı karşılaştırabilmektir. dosyada bulunan kelime / kelime grupları ile ayrıştırma.


0
2017-10-29 15:56