Twitter yaptığı gibi Sıcak Konular bulmak için benim Algoritma geliştirmek için nasıl

10 Cevap php

Her 2saat çalışır ve yemlerdeki kelimeleri sayar, ve daha sonra sıcak konular olarak 10 en yüksek sayısı kelimeleri görüntüler benim web sitesi için bir cron işi oluşturduk.

Bazı şey twitter görüşülmektedir en popüler konuları göstermek için, orada ana ne.

Ne benim cron işi hemen yapar bu gibi i belirttiğim kelimeler, kelimeler hariç kelimeleri sayar:

array('of', 'a', 'an', 'also', 'besides', 'equally', 'further', 'furthermore', 'in', 'addition', 'moreover', 'too',
                        'after', 'before', 'when', 'while', 'as', 'by', 'the', 'that', 'since', 'until', 'soon', 'once', 'so', 'whenever', 'every', 'first', 'last',
                        'because', 'even', 'though', 'although', 'whereas', 'while', 'if', 'unless', 'only', 'whether', 'or', 'not', 'even',
                        'also', 'besides', 'equally', 'further', 'furthermore', 'addition', 'moreover', 'next', 'too',
                        'likewise', 'moreover', 'however', 'contrary', 'other', 'hand', 'contrast', 'nevertheless', 'brief', 'summary', 'short',
                        'for', 'example', 'for instance', 'fact', 'finally', 'in brief', 'in conclusion', 'in other words', 'in short', 'in summary', 'therefore',
                        'accordingly', 'as a result', 'consequently', 'for this reason', 'afterward', 'in the meantime', 'later', 'meanwhile', 'second', 'earlier', 'finally', 'soon', 'still', 'then', 'third');       //words that are negligible

Ama bu tamamıyla gerekli olmayan kelimeler ortadan kaldırılması sorunu çözdü değil. Ve yararlıdır sadece kelimeleri verir.

Birisi bana bu konuda rehberlik edin ve nasıl benim algoritmasını geliştirmek Bana söyleyebilirsin.

Regards Zeeshan

10 Cevap

Burada DjangoCon sırasında DjangoDose canlı yem için bu uygulamaya nasıl (not: bu bir hackjob, biz hiçbir test ile 1 öğleden sonra yazdım, ve en iyi olarak ben çatallanma şey ile ilgisi vardır söyleyebilirim, occsaionally çatallanma bağırıyor). Tüm bu söyleniyor, daha fazla ya da daha az (bira uygun takip edildi akşamları anlam) bizim için çalıştı.

IGNORED_WORDS = set(open(os.path.join(settings.ROOT_PATH, 'djangocon', 'ignores.txt')).read().split())

def trending_topics(request):
    logs = sorted(os.listdir(LOG_DIRECTORY), reverse=True)[:4]
    tweets = []
    for log in logs:
        f = open(os.path.join(LOG_DIRECTORY, log), 'r')
        for line in f:
            tweets.append(simplejson.loads(line)['text'])
    words = defaultdict(int)
    for text in tweets:
        prev = None
        for word in text.split():
            word = word.strip(string.punctuation).lower()
            if word.lower() not in IGNORED_WORDS and word:
                words[word] += 1
                if prev is not None:
                    words['%s %s' % (prev, word)] += 1
                    words[prev] -= 1
                    words[word] -= 1
                prev = word
            else:
                prev = None
    trending = sorted(words.items(), key=lambda o: o[1], reverse=True)[:15]
    if request.user.is_staff:
        trending = ['%s - %s' % (word, count) for word, count in trending]
    else:
        trending = [word for word, count in trending]
    return HttpResponse(simplejson.dumps(trending))

Eğer istatistiksel olarak anlamlı aykırı isterseniz genel metne göre yeni bir alt kümesi her sözcük için bir z-puan hesaplamak isteyebilirsiniz.

Öyleyse

t is number of occurrences of word in subset
o is number of occurrences of word overall
n_t is number of words in subset
n_o is number of words overall

sonra hesaplamak:

p_hat = t / n_t
p_0 = o / n_o

z = (p_hat - p_0) / sqrt((p_0 * (1 - p_0)) / n_t)

Z ne kadar yüksekse, alt-kelimenin istatistiksel olarak daha anlamlı söz genel metni görelidir. Bu, aynı zamanda, genel metne alt göreceli olarak nadirdir tuhaf kelimeler hesaplamak için kullanılabilir.

Dil işleme harika dünyasına hoş geldiniz. Temelde, trend konular ve arkadaşları gibi bir şey dil kullanımı anomaliler için bir arama vardır.

Teorik olarak, zamanla kelimelerin frekansını analiz ederek, (eğer yukarıda listelenen olanlar gibi ortak kelimeler,) gürültüleri filtre etmek gerekir. Bu bir olasılık kesinlikle uygulamak için önemsiz değildir, ama.

Başka appraoch ziyade trend konular geliştirmek hangi desen, belirli bir zaman döneminde kelimelerin ham miktarına konsantre olacaktır. Genellikle biraz üstel büyümek ve büyümenin bu tür uygun olmayan tüm "sıcak kelime" ayıran bir filtre uygulamak için çalışıyorum mevcut arama sonuçlarını revalidate mümkün olmalıdır.

:-) Sadece bazı düşünceler

edit:

ayrıca i sıklığına göre filtreleme ile ne demek istediğini anahat, belki kelimelerle ilgili frekans bilgilerini içeren sözlükler üzerinde kontrol etmelisiniz. Eğer olağanüstü iyi sonuçlar alırsınız (ben bir test için kullanılan, wikipedia indirmek için ücretsiz) Bu inşa etmek o kadar zor değil, ve sağlam bir metin külliyatı ile.

İşte bir fikir:

İngilizce dilinde her kelimenin ortalama kullanım sıklığı hesaplamak. Bir arama tablosunda bu koyun. Sen muhtemelen sadece en sık kullanılan kelimeleri tutmak isteyecektir. Mantıklı bir dizi kelime (örneğin, 5000), ya da minimum sıklığını Pick. Muhtemelen hala göstermek asla kelimelerin bir listesini yapmak isteyecektir. Frekansa kelime listenizi sıralamak varsa, onlara bakmak ve her zaman dışlamak için hangi kelimeleri seçmek için uzun sürmez.

Frekansını hesaplamak için, bir giriş örnek gerekir. Giriş numunenin seçiminiz sonucu etkileyecek. Örneğin, Twitter şimdiye kadarki giriş numune olarak ilan edilmiştir her twitter mesajı kullanabilirsiniz. Sürekli Twitter'da tartışılıyor konular (örneğin, "Twitter" kendisi) önemini kaybeder. Eğer onların önemini tutmak için Twitter özgü konular istiyorsanız, o zaman başka bir giriş örnek bulabilirsiniz.

Işlem frekansı için algoritma basittir:

  • For each word in the sample:
    • Sözlükte bu kelimeyi aramak
    • O kelimeyle ilgili bir sayacına bir ekle
  • , Veriyi normalleştirmek giriş örnek bir kelime sayısına göre her bir kelimenin sıklığı bölün.

Bugünün Twitter'da yazılarda aynı algoritmayı çalıştırırsanız Şimdi, beklenen kelime frekansları ile bugünün kelime frekansları karşılaştırabilirsiniz.

İşte bunu yapmak için bir neşeli ucuz-ve-yolu.

Her 2 saatte bir, kelime frekansları bir histogram oluşturmak. Örn;

Snow, 150
Britney, 100
The, 150000

Bu dosyaların hepsi tutun.

Sık sık, geçmişinizden 50 dosyaları kapmak ve frekansları ortalama. Bu zamanla gelişmiştir eğilimleri düzleşir. Bu üç dosyalardan Yani;

Snow, 10
Britney, 95
...

Snow, 8
Britney, 100
...

Snow, 12
Britney, 105
...

Bu temel set olsun;

Snow, 10
Britney, 100

, Bu temel kümesi arasındaki oranı ve en son bir işe

Snow 1500%
Britney 100%

Sizin eğilimleri yüksek oranlarına sahip olanlardır. Böl-sıfır burada için dikkatli.

Ne bu konuda güzel olduğunu uzun veya kısa bir süre veri seçerek ayarlamınıza sizin eğilimler. Örneğin bir yıl üzerinden ortalama olarak bu ayki trendleri görmek ve son 24 saat içinde ortalama bu öğleden eğilimleri olabilir.

Düzenle - Bu algoritma ile, hepsi hakkında% 100, nispeten istikrarlı oranlarına sahip olacak, çünkü stop sözcükleri hakkında endişelenmenize gerek yok, bu nedenle her zaman sıkıcı olacaktır (örn. off-eğilim)

Ne arıyorsun genellikle stop word liste denir. İşte blog post bunların bir listesini (hatta sizin için PHP dizi formatında) ve başka bir text file sürümü bulunuyor.

Biraz daha googling bazı başka örnekler bulmak gerekir.

Genel algoritmasını geliştirmek için daha birkaç potansiyel fikir:

  1. Güncelliğe göre sözcük kullanımını ağırlık. Zaten her 2 saatte yeniden hesaplayarak bunu, ama kelimesi de kullanılan bu yana da tam zamanında faktör olabilir. Yani, yerine bir sözcüğün her söz 1 "puan" değer yerine, onu içeren mesajı yayınlanmıştır beri noktası değeri dakika zaman belirlenecektir bulunuyor.

  2. Kelime ve sitenizde mesajlarda ortalama frekans bir veritabanı tablo oluşturun. Eğer son X saat içinde oluşturulan iletileri incelediğimizde, sizin veritabanında ortalama frekansa kelime sıklığını karşılaştırmak. Ortalamasından daha yüksek ölçüde frekansa sahip bu kelimeler "sıcak" olarak düşünülebilir. Eğer bir yarı-düzenli olarak kelime için ortalama frekans yeniden hesaplamak emin olun (belki günde bir kez?)

Eğer önemsiz sözcükleri filtrelemek için daha iyi bir yol veya geçerli kelimelerin bir dizi gerçek ilk on listesini oluşturmak için bir yol arıyorsanız ben gerçekten bilmiyorum.

Eğer basit tutmak istiyorsanız filtreleme için, ben bir kara listeye yaklaşım öneririz. Eğer daha gelişmiş bir şey istiyorsanız, o zaman kelime listeden süzülmüş oldukça sık kullanılan sözcükleri belirleyen bir istatistik kurmak olabilir.

Sayma, sıralama ve gerçek "trend topic" listesinde kesiliyor, ben en bu öneririz:

function buildTopTen($word = null)
{
    static $wordList = array();
    if (isset($word)) {
        if (!isset($wordList[$word])) {
            $wordList[$word] = 0;
        }
        $wordList[$word]++;
        return $wordList[$word];
    } else {
        arsort($wordList);
        return array_slice($wordList, 0, 10);
    }
}

Eğer bitirene kadar sadece bir kelime parametre ile işlevini çağırın. Bu, karşılığında size o bir kelimenin geçerli saymak verecektir size herhangi bir kullanım ise şu.

Parametreler olmadan bir kez aramak ve ona beslenen kelime size ilk on en sık kullanılan sözcükleri verecektir.

Bunu test ve performans kadar iyi görünüyor.

Tabii ki bu sadece bir öneri olduğunu ve çok fazla rafine edilebilir.

Sen Markov Zincirleri / Hidden Markov Modellerinin kullanımını araştırma isteyebilirsiniz.

Bu matematiksel modeller Doğal Dil İşleme oldukça başarılı olmuştur.

Sen konular çok daha yüksek olurdu gidişli doğruluk demektir. (Ve bunu öğrenmek sağlayabilirsiniz ...)

Sen NLTK (Doğal Dil Toolkit) kontrol etmek isteyebilirsiniz. Nasıl http://www.nltk.org/book azından mevcut kullanmayı öğretmek istiyorum ücretsiz bir kitap var. Sadece olumsuz, Python var ve ben bir PHP çözüm gerekir varsayıyorum. Kitap önceden herhangi bir python bilmek beklemiyor, çünkü çok korkma.

NLKT yüzden çok güçlü ve içine bakarak kesinlikle değer.

Oluşturma sırasında her besleme girişi taramak yerine büyük, kitlesel bir arama her 2 saat yapıyor kolay değildir?