2015-05-21 19 views
9

Tôi cần trích xuất các biểu tượng cảm xúc văn bản từ một văn bản bằng Python và tôi đã tìm kiếm một số giải pháp để thực hiện việc này nhưng hầu hết trong số chúng như this hoặc this chỉ bao gồm các biểu tượng cảm xúc đơn giản. Tôi cần phân tích cú pháp all of them.Trích xuất các biểu tượng cảm xúc từ một văn bản

Hiện tại tôi đang sử dụng danh sách biểu tượng cảm xúc mà tôi lặp lại cho mọi văn bản mà tôi đã xử lý nhưng điều này rất kém hiệu quả. Bạn có biết một giải pháp tốt hơn không? Có lẽ một thư viện Python có thể xử lý vấn đề này?

+1

Xây dựng một biểu thức chính quy. –

+0

Mối quan tâm của tôi là sẽ mất rất nhiều thời gian để phù hợp. –

+0

Có thể mất rất nhiều thời gian, nhưng điều đó không có nghĩa là nó chậm. –

Trả lời

4

Một trong những giải pháp hiệu quả nhất là sử dụng Aho–Corasick string matching algorithm và là thuật toán không phát triển được thiết kế cho loại sự cố này. (tìm kiếm nhiều chuỗi được xác định trước trong văn bản không xác định)

Có gói sẵn có cho việc này.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/

Edit: Ngoài ra còn có các gói gần đây có sẵn (nơi ẩn náu cố gắng nào của họ) https://pypi.python.org/pypi/pyahocorasick/1.0.0

Extra:
Tôi đã thực hiện một số thử nghiệm hiệu suất với pyahocorasick và nó là nhanh hơn python lại khi tìm kiếm hơn 1 từ trong dict (2 hoặc nhiều hơn).

Dưới đây là mã:

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

Tôi đã đọc về nó và có vẻ đủ hiệu quả. Tôi sẽ thử. Cảm ơn bạn. –

+0

Những gì pyahocorasick không làm là trả về chỉ số bắt đầu của trận đấu (chỉ là kết thúc). Tôi đã tự thực hiện nó và làm việc rất tốt. Cảm ơn một lần nữa cho câu trả lời của bạn. –

Các vấn đề liên quan