2015-05-21 21 views
9

Potrzebuję wyodrębnić emotikony tekstowe z tekstu za pomocą Pythona i szukałem rozwiązań, aby to zrobić, ale większość z nich jak this lub this dotyczy tylko prostych emotikonów. Muszę parsować all of them.Wyodrębnij emotikony z tekstu

Obecnie używam listy emotikonów, które sprawdzam dla każdego tekstu, który mam, ale jest to tak nieefektywne. Czy znasz lepsze rozwiązanie? Może biblioteka Pythona, która poradzi sobie z tym problemem?

+1

zbudować wyrażenie regularne. –

+0

Obawiam się, że dopasowanie zajmie dużo czasu. –

+0

To może zająć dużo czasu, ale to nie znaczy, że jest wolne. –

Odpowiedz

4

Jednym z najbardziej skutecznych rozwiązań jest użycie Aho–Corasick string matching algorithm i jest to nietrywialny algorytm zaprojektowany dla tego rodzaju problemów. (wyszukiwanie wielu predefiniowanych ciągów znaków w nieznanym tekście)

Dostępny jest pakiet.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/

Edit: Są też nowsze pakiety dostępne (przystań próbował żadnego z nich) https://pypi.python.org/pypi/pyahocorasick/1.0.0

Dodatkowe:
Podjąłem kilka testów wydajności z pyahocorasick i to szybciej niż python re podczas wyszukiwania więcej niż 1 słowa w dyktacie (2 lub więcej).

Tutaj jest kod:

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

Czytałem o tym i wydaje się wystarczająco skuteczne. Zamierzam spróbować. Dziękuję Ci. –

+0

To, czego nie zrobi pyahocorasick, to zwróć wskaźnik początkowy meczu (tylko koniec). Zaimplementowałem to samodzielnie i pracuję naprawdę dobrze. Jeszcze raz dziękuję za odpowiedź. –