Извлечение смайликов из текста

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

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

1 ответов


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

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

изменить: Также доступны более поздние пакеты (не пробовал любой из них) 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)