2016-03-22 19 views
0

ı bu dizeBelirli bir pencere boyutu içindeki tüm bigramları nasıl alabilirim?

my_string = "This is an example string" 

var Ve belirli bir "pencere" içindeki tüm Bigramlar hesaplamak için hızlı yolu olup olmadığını merak ediyorum diyelim. Pencere iki kelime ise

Örneğin, tüm olası Bigramlar

["This is","is This","is an","an is","an example","example an","example string","string example"] 

olan Ama pencere üç kelime eğer biz ilk üç kelimelik penceresinin

["This is","is an","This an","an this",...] 
bu Bigramlar varsa

sklearn kullanarak bigram elde etmek kolaydır. Mesela biri

bigrams = CountVectorizer(analyzer = "word", 
        strip_accents = "ascii", 
        lowercase = True, 
        ngram_range = (2,2)) 

bigrams_counts = bigrams.fit_transform(my_string) 

yapabilir ve size tüm Bigramlar listesini (ve hatta sayımları) verecek, ancak yani (dize değil, diğer kombinasyonlar mevcut Bigramlar "Bu" sadece içerecektir ve "bu" orada olmayacak.

Belirli bir pencerede tüm bigramları almanın bir yolu var mı? Örneğin itibaren

+3

[Saklı Markov] (https tanımını kontrol edin: //en.wikipedia.org/wiki/Bigram). Bir pencerede kelime kombinasyonları için sorduğunuz çoğu zaman bana benziyor, –

cevap

3

:

["This is","is an","This an","an this",...] 

Bu Bigramlar benzemiyorlar, ama penceresinden kelimelerin permütasyon. 3 kelime için olurdu: Eğer sayar gerekiyorsa, sayımların (pencerenin büyüklüğüne örneğin örtüşme miktarına bağlıdır) bir Counter kullanmak, ama bu örtüşen vb üç katına, iki katına neden olacaktır dikkat

from itertools import permutations, chain 
from functools import partial 

my_string = "This is an example string".split() 
set(chain.from_iterable(map(partial(permutations, 
            r=2), 
          zip(my_string, 
           my_string[1:], 
           my_string[2:])))) 

belirli bir kelime çifti için.

from collections import Counter 

Counter(chain.from_iterable(map(partial(combinations, r=2), 
           zip(my_string, 
            my_string[1:], 
            my_string[2:])))) 

ve sonuç:

Counter({('is', 'an'): 2, ('an', 'example'): 2, ('This', 'is'): 1, ('This', 'an'): 1, ('example', 'string'): 1, ('an', 'string'): 1, ('is', 'example'): 1}) 

Ve ayrı sonuçlar gibi pencereleri gerekirse son olarak, zincirleme atlamak:

list(map(partial(permutations, r=2), 
     zip(my_string, my_string[1:], my_string[2:]))) 
+0

bigramları değil nlp alanında makine öğrenmesinde, bir metinde bir bigramın kaç kez gerçekleştiğini tahmin gücüne sahip olabilir; öyleyse neden? Ayrıca, bu permütasyonları 3 kelimeden değil, metin üzerinde hareketli bir pencereye nasıl uygularsınız? Örtüşen iki aynı kombinasyon farklı kombinasyonlar veya aynı şekilde sayılır mı? –

+0

Sonra 'Counter' kullanın. Ayrıca, bunlar bigram değildir, çünkü bu bitişik elemanlar anlamına gelir. –

+0

Ve "3 kelimeden değil, metin üzerinde hareket eden pencere" ile ne demek istiyorsunuz? Farklı bir pencereden olduklarından, çakışmadan aynı kombinasyonlar sayılır. –

İlgili konular