Wie extrahiere ich ein Zeichen aus Sätzen? - Python
Folgendeword2ngrams
Funktion extrahiert Zeichen 3 Gramm aus einem Wort:
>>> x = 'foobar'
>>> n = 3
>>> [x[i:i+n] for i in range(len(x)-n+1)]
['foo', 'oob', 'oba', 'bar']
Dieser Beitrag zeigt die Zeichenextraktion für ein einzelnes Wort,Schnelle Implementierung von N-Gramm-Zeichen mit Python.
Aber was ist, wenn ich Sätze habe und das Zeichen ngrams extrahieren möchte,Gibt es eine schnellere Methode als die iterativ aufgerufeneword2ngram()
?
Was wird die Regex-Version sein, um dasselbe zu erreichen?word2ngram
undsent2ngram
Ausgabe? wäre es schneller
Ich habe es versucht:
import string, random, time
from itertools import chain
def word2ngrams(text, n=3):
""" Convert word into character ngrams. """
return [text[i:i+n] for i in range(len(text)-n+1)]
def sent2ngrams(text, n=3):
return list(chain(*[word2ngrams(i,n) for i in text.lower().split()]))
def sent2ngrams_simple(text, n=3):
text = text.lower()
return [text[i:i+n] for i in range(len(text)-n+1) if not " " in text[i:i+n]]
# Generate 10000 random strings of length 100.
sents = [" ".join([''.join(random.choice(string.ascii_uppercase) for j in range(10)) for i in range(100)]) for k in range(100)]
start = time.time()
x = [sent2ngrams(i) for i in sents]
print time.time() - start
start = time.time()
y = [sent2ngrams_simple(i) for i in sents]
print time.time() - start
print x==y
[aus]:
0.0205280780792
0.0271739959717
True
BEARBEITET
Die Regex-Methode sieht elegant aus, ist jedoch langsamer als das iterative Aufrufenword2ngram()
:
import string, random, time, re
from itertools import chain
def word2ngrams(text, n=3):
""" Convert word into character ngrams. """
return [text[i:i+n] for i in range(len(text)-n+1)]
def sent2ngrams(text, n=3):
return list(chain(*[word2ngrams(i,n) for i in text.lower().split()]))
def sent2ngrams_simple(text, n=3):
text = text.lower()
return [text[i:i+n] for i in range(len(text)-n+1) if not " " in text[i:i+n]]
def sent2ngrams_regex(text, n=3):
rgx = '(?=('+'\S'*n+'))'
return re.findall(rgx,text)
# Generate 10000 random strings of length 100.
sents = [" ".join([''.join(random.choice(string.ascii_uppercase) for j in range(10)) for i in range(100)]) for k in range(100)]
start = time.time()
x = [sent2ngrams(i) for i in sents]
print time.time() - start
start = time.time()
y = [sent2ngrams_simple(i) for i in sents]
print time.time() - start
start = time.time()
z = [sent2ngrams_regex(i) for i in sents]
print time.time() - start
print x==y==z
[aus]:
0.0211708545685
0.0284190177917
0.0303599834442
True