2015-05-21 2 views
9

Мне нужно извлечь текстовые смайлики из текста с помощью Python, и я искал некоторые решения, чтобы сделать это, но большинство из них, как this или this, покрывают только простые смайлики. Мне нужно разобрать all of them.Извлечь смайлики из текста

В настоящее время я использую список смайликов, которые я повторяю для каждого текста, который у меня есть, но это так неэффективно. Вы знаете лучшее решение? Может быть, библиотека Python, которая может справиться с этой проблемой?

+1

Построить регулярное выражение. –

+0

Я беспокоюсь, что потребуется много времени, чтобы соответствовать. –

+0

Это может занять много времени, но это не значит, что он медленный. –

ответ

4

Одним из наиболее эффективных решений является использование Aho–Corasick string matching algorithm и является нетривиальным алгоритмом, разработанным для такого рода проблем. (поиск нескольких предопределенных строк в неизвестном тексте)

Доступен пакет для этого.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/

Edit: Есть также более поздние пакеты доступны (пристанище пыталось любое из них) https://pypi.python.org/pypi/pyahocorasick/1.0.0

Дополнительно:
Я сделал некоторые испытания производительности с pyahocorasick и быстрее python re при поиске более 1 слова в dict (2 или более).

Здесь код:

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

Я читал об этом и кажется достаточно эффективным. Я попробую. Спасибо. –

+0

Что пиакокорасик не делает, это вернуть начальный индекс матча (только конец). Я реализовал это самостоятельно и отлично работает. Еще раз спасибо за ваш ответ. –