2015-05-21 24 views
9

Ho bisogno di estrarre emoticon di testo da un testo utilizzando Python e ho cercato alcune soluzioni per farlo ma la maggior parte di esse come this o this coprono solo emoticon semplici. Ho bisogno di analizzare all of them.Estratto di emoticon da un testo

Attualmente sto usando un elenco di emoticon che faccio scorrere per ogni testo che ho elaborato ma questo è così inefficiente. Conosci una soluzione migliore? Forse una libreria Python in grado di gestire questo problema?

+1

Costruire un'espressione regolare. –

+0

La mia preoccupazione è che ci vorrà un sacco di tempo per abbinare. –

+0

Potrebbe volerci molto tempo, ma ciò non significa che sia lento. –

risposta

4

Una delle soluzioni più efficienti è utilizzare Aho–Corasick string matching algorithm ed è un algoritmo non banale progettato per questo tipo di problema. (ricerca di più stringhe predefinite in testo sconosciuto)

Per questo è disponibile il pacchetto.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/

Edit: Ci sono anche pacchetti più recenti disponibili (rifugio provato uno di essi) https://pypi.python.org/pypi/pyahocorasick/1.0.0

extra:
ho fatto un po 'di test delle prestazioni con pyahocorasick ed è più veloce di python re quando si cerca più di 1 parola in dict (2 o più).

Qui è il codice:

import re, ahocorasick,random,time 

# search N words from dict 
N=3 

#file from http://norvig.com/big.txt 
with open("big.txt","r") as f: 
    text = f.read() 

words = set(re.findall('[a-z]+', text.lower())) 
search_words = random.sample([w for w in words],N) 

A = ahocorasick.Automaton() 
for i,w in enumerate(search_words): 
    A.add_word(w, (i, w)) 

A.make_automaton() 
#test time for ahocorasic 
start = time.time() 
print("ah matches",sum(1 for i in A.iter(text))) 
print("aho done in ", time.time() - start) 


exp = re.compile('|'.join(search_words)) 
#test time for re 
start = time.time() 
m = exp.findall(text) 
print("re matches",sum(1 for _ in m)) 
print("re done in ",time.time()-start) 
+0

Ne ho letto e mi sembra abbastanza efficiente. Ho intenzione di fare un tentativo. Grazie. –

+0

Ciò che pyahocorasick non fa è restituire l'indice iniziale della partita (solo la fine). L'ho implementato personalmente e sta funzionando molto bene. Grazie ancora per la tua risposta. –