2017-03-31 18 views
22

Xem xét danh sách sau đây:Làm thế nào để trích xuất tất cả các biểu tượng cảm xúc từ văn bản?

a_list = [' me así, bla es se ds '] 

Làm thế nào tôi có thể trích xuất trong một danh sách mới tất cả các biểu tượng cảm xúc bên trong a_list:

new_lis = ['  '] 

Tôi cố gắng để sử dụng regex, nhưng tôi không có tất cả các khả năng mã hóa biểu tượng cảm xúc.

+0

kết động trong http://stackoverflow.com/q/26568722/674039 và http://stackoverflow.com/q/35404144/674039 – wim

Trả lời

29

Bạn có thể sử dụng thư viện emoji. Bạn có thể kiểm tra xem một điểm mã đơn có là một điểm mã hóa biểu tượng cảm xúc hay không bằng cách kiểm tra xem nó có nằm trong emoji.UNICODE_EMOJI hay không.

import emoji 

def extract_emojis(str): 
    return ''.join(c for c in str if c in emoji.UNICODE_EMOJI) 
+0

Bạn có thể tải xuống danh sách biểu tượng cảm xúc theo định dạng chuỗi/int trong ** # EmojiCodeSheet ** [tại đây] (https://github.com/shanraisshan/EmojiCodeSheet), để so sánh tùy chỉnh. – shanraisshan

-2

Tất cả biểu tượng cảm xúc Unicode với các điểm mã tương ứng là here. Chúng là 1F600 đến 1F64F, vì vậy bạn chỉ có thể xây dựng tất cả chúng với một trình vòng lặp giống như dải ô.

+1

Đó là chỉ có một phạm vi cụ thể của biểu tượng cảm xúc. Có nhiều hơn nữa. – user2357112

3

Nếu bạn không muốn sử dụng một thư viện bên ngoài, như một cách pythonic bạn chỉ có thể sử dụng biểu thức thông thường và re.findall() với một regex thích hợp để tìm ra emojies:

In [74]: import re 
In [75]: re.findall(r'[^\w\s,]', a_list[0]) 
Out[75]: ['', '', '', '', '', ''] 

Các biểu thức chính quy r'[^\w\s,]' là một lớp ký tự phủ định khớp với bất kỳ ký tự nào không phải là một ký tự từ, khoảng trống hoặc dấu phẩy.

Như tôi đã đề cập trong nhận xét, văn bản thường chứa ký tự từ và dấu chấm câu sẽ dễ dàng xử lý theo cách này, đối với các trường hợp khác, bạn chỉ cần thêm chúng vào lớp ký tự theo cách thủ công. Lưu ý rằng vì bạn có thể chỉ định một loạt các ký tự trong lớp nhân vật, bạn thậm chí có thể làm cho nó ngắn hơn và linh hoạt hơn.

Giải pháp khác thay vì lớp nhân vật phủ định loại trừ các ký tự không phải biểu tượng cảm xúc sử dụng lớp nhân vật chấp nhận biểu tượng cảm xúc ([] không có ^). Vì có rất nhiều biểu tượng cảm xúc with different unicode values, bạn chỉ cần thêm các phạm vi vào lớp nhân vật. Nếu bạn muốn khớp nhiều biểu tượng cảm xúc hơn ở đây là một tham chiếu tốt chứa tất cả các biểu tượng cảm xúc chuẩn với phạm vi tương ứng cho các biểu tượng cảm xúc khác nhau http://apps.timwhitlock.info/emoji/tables/unicode:

+0

Điều đó phù hợp với đầu vào cụ thể này, nhưng có rất nhiều ký tự không phải biểu tượng cảm xúc khác không nằm trong các danh mục '\ w',' \ s' hoặc dấu phẩy. – user2357112

+0

@ user2357112 Một văn bản thường chứa các ký tự từ và dấu chấm câu sẽ dễ dàng xử lý bằng cách tiếp cận này, đối với các trường hợp khác bạn chỉ có thể thêm chúng vào lớp nhân vật theo cách thủ công .. Lưu ý rằng vì bạn có thể chỉ định một loạt các ký tự trong lớp ký tự bạn thậm chí có thể làm cho nó ngắn hơn và linh hoạt hơn. – Kasramvd

+1

Regex của bạn không thành công trên tất cả dấu chấm câu không phải dấu phẩy, trong số những thứ khác. – user2357112

1

Câu trả lời được đánh giá cao nhất không phải lúc nào cũng hoạt động. Ví dụ: biểu tượng cảm xúc cờ sẽ không được tìm thấy. Hãy xem xét các chuỗi:

s = u'Hello \U0001f1f7\U0001f1fa hello' 

Điều gì sẽ làm việc tốt hơn là

import emoji 
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
print(' '.join(r.findall(s))) 
0

Các giải pháp để có được chính xác những gì tumbleweed hỏi, là một sự pha trộn giữa đánh giá câu trả lời trên và câu trả lời user594836 của. Đây là mã làm việc cho tôi trong Python 3.6.

import emoji 
import re 

a_list=[' me así,bla es,se ds '] 

## Create the function to extract the emojis 
def extract_emojis(str): 
    emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
    r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
    aux=[' '.join(r.findall(s)) for s in a_list] 
    return(aux) 

## Execute the function 
extract_emojis(s) 

## the output 
['  '] 
Các vấn đề liên quan