Kelime metin analiz algoritması

5 Cevap java

Ben bir metin bloğundaki tüm olası ifadeler yaratacak bir algoritma istiyorum. Örneğin, metin içerisinde:

"My username is click upvote. I have 4k rep on stackoverflow"

Aşağıdaki kombinasyonlar yaratmak olacaktır:

"My username"
"My Username is"
"username is click"
"is click"
"is click upvote"
"click upvote"
"i have"
"i have 4k"
"have 4k"
..

Siz anladınız. Temelde nokta bir cümle dışında 'ibareleri' olası tüm kombinasyonları elde etmektir. En iyi bu nasıl uygulanacağı için herhangi bir düşünce?

5 Cevap

Temelde ilk cümle içine metin bloğunu ayırmak gerekir. Eğer dönemleri, soru işaretleri, ünlem işaretleri ve diğer herhangi bir cümle terminatörlerinin için dışarı bakmak gerekir beri hatta İngilizce, yeterince zor bulunuyor.

Sonra tüm noktalama çıkardıktan sonra bir anda bir cümle işlemek (virgül, yarı-kolonlar, iki nokta üst üste, ve benzeri).

Eğer kelimelerin bir dizi ile kalacaksın o zaman, daha basit hale gelir:

for i = 1 to num_words-1:
    for j = i+1 to num_words:
        phrase = words[i through j inclusive]
        store phrase

O (not düşündüğünüz kadar basit olabilir metin bloğu, ilk masaj sonra), oldukça basit bu.

Bu size her cümlede iki veya daha fazla kelime bütün ifadeler verecektir.

Böylece cümle içine ayrılık, kelimelerin içine ayrılık, noktalama çıkarılması ve zor biraz olacak ama ben size zaten takip bazı basit kurallar ilk gösterilen ettik. Geri kalan metnin bir bloğu algoritma keser her zaman eklenmelidir.

Update:

Talep olarak, burada ifadeler verir bazı Java kodu:

public class testme {
    public final static String text =
        "My username is click upvote." +
        " I have 4k rep on stackoverflow.";

 

    public static void procSentence (String sent) {
        System.out.println ("==========");
        System.out.println ("sentence [" + sent + "]");

        // Split sentence at whitspace into array.

        String [] sa = sent.split("\\s+");

        // Process each starting word.

        for (int i = 0; i < sa.length - 1; i++) {

            // Process each phrase.

            for (int j = i+1; j < sa.length; j++) {

                // Build the phrase.

                String phrase = sa[i];
                for (int k = i+1; k <= j; k++) {
                    phrase = phrase + " " + sa[k];
                }

                // This is where you have your phrase. I just
                // print it out but you can do whatever you
                // wish with it.
                System.out.println ("   " + phrase);
            }
        }
    }

 

    public static void main(String[] args) {
        // This is the block of text to process.

        String block = text;
        System.out.println ("block    [" + block + "]");

        // Keep going until no more sentences.

        while (!block.equals("")) {
            // Remove leading spaces.

            if (block.startsWith(" ")) {
                block = block.substring(1);
                continue;
            }

            // Find end of sentence.

            int pos = block.indexOf('.');

            // Extract sentence and remove it from text block.

            String sentence = block.substring(0,pos);
            block = block.substring(pos+1);

            // Process the sentence (this is the "meat").

            procSentence (sentence);

            System.out.println ("block    [" + block + "]");
        }
        System.out.println ("==========");
    }
}

hangi çıkışları:

block    [My username is click upvote. I have 4k rep on stackoverflow.]
==========
sentence [My username is click upvote]
   My username
   My username is
   My username is click
   My username is click upvote
   username is
   username is click
   username is click upvote
   is click
   is click upvote
   click upvote
block    [ I have 4k rep on stackoverflow.]
==========
sentence [I have 4k rep on stackoverflow]
   I have
   I have 4k
   I have 4k rep
   I have 4k rep on
   I have 4k rep on stackoverflow
   have 4k
   have 4k rep
   have 4k rep on
   have 4k rep on stackoverflow
   4k rep
   4k rep on
   4k rep on stackoverflow
   rep on
   rep on stackoverflow
   on stackoverflow
block    []
==========

Şimdi, :-) (bazıları C bir Java lehçesinde yazılmış diyebilirsiniz bu Java oldukça basit olduğunu unutmayın. Sadece nasıl istedi gibi bir cümle çıktı kelime gruplaşmalar için göstermek için anlatıyor.

Bu not Ben orijinal cevap belirtilen tüm süslü cümle algılama ve noktalama kaldırma yapmak yok.

Eh, ben PHP veya java bilmiyorum, ama temelde sizin metindeki tüm kelimelerin üzerinde bir çift döngü istiyorum. İşte bazı pseudo-kod:

words = split(text)
n = len(words)
for i in 1...n-1 {        // i = first word in phrase 
    for j in i+1...n {       // j = last word in phrase
        phrase = join(words[i:j])
        print phrase
    }
}

İkinci döngü i başlar unutmayın. Bu size i kelime i (yani tüm ifadeler, en az iki kelime var) daha büyüktür sayı j, kelime sayısından başlamak tüm ifadeler verir 1.

Ah, sadece muhtemelen cümleleri cümle sınırlarını geçmek istemiyorum anladım. Böylece ilk cümle içine metni böler, ama sonra her cümle bu çalışan bir dış döngü isteyeceksiniz.

Eğer herhangi bir programlama deneyimi var, bu çok açık görünüyor, ama sadece durumda: for ifadeleri split, [{(1)] [} gibi] döngüler bazı fonksiyonudur bir dize alır ve kelimelerin bir dizi böler ki - bu tamamen önemsiz değil, ancak bunu yapmak için bir kütüphane işlevi muhtemelen var, len dizinin uzunluğunu verir, {[(4)] } arasındaki birlikte geri boşluk onları koyar, ve sözdizimi [i:j] j dahil (Python, bu aslında olurdu için i gelen bütün elemanları anlamına gelir [i:j+1]). Oh, ve ben örtülü kabul ettik yerine diziler sıfırdan indeksi 1 başlar; Ben bir egzersiz olarak 0-tabanlı C diziler değişiyor bırakın ...

Son olarak, belirli sorulara cevap:

  • "Ikinci" loop aslında bir inner döngü olduğunu unutmayın; cümlenin sonuna i+1 den i (cümlenin ilk kelimesi) biz döngü deyimin son söz vermek her değeri için.

  • Şimdi ilk ve son sözleriyle, join fonksiyonu sayıda olduğunu - yazmak gerekecek - word[i], word[i+1], ... word[j] şeklinde arasındaki boşluk ile bireysel dizeleri birleştirir ifade. Bazı diller bu kolaylaştırmak için yollar olmasına rağmen, pratikte bu, fonksiyon join(words, i, j) gibi ilan ve dize döndürür olabilir anlamına gelebilir.

Sadece cümle tokenize ve CombinationGenerator kullanın. , S 284-286: algoritma Kenneth H. Rosen, Ayrık Matematik ve Uygulamaları, 2. baskı (McGraw-Hill, 1991 NY) tarafından açıklanmıştır.

Here's the code and example of use: http://www.merriampark.com/comb.htm

Str_word_count ile oynayabilir (); sizin gibi ve inşa.

Zaten böyle ifadeler için teknik terim Shingle olduğunu biliyor olabilir. Sen Lucene en ShingeMatrixFilter ile giriş metin için zona alabilirsiniz.