मेरे पास एक पांडा डेटाफ्रेम है, जिसमें 'ट्वीट' कॉलम है जिसमें इसके कुछ डेटा इस तरह हैं:

Tweet

 Ya bani taplak dkk \xf0\x9f\x98\x84\xf0\x9f\x98\x84\xf0\x9f\x98\x84
Setidaknya gw punya jari tengah buat lu, sebelom gw ukur nyali sama bacot lu \xf0\x9f\x98\x8f'
Ari sarua beki mah repeh monyet\xf0\x9f\x98\x86\xf0\x9f\x98\x86'
 Cerita silat lae \xf0\x9f\x98\x80 semacam Kho Ping Hoo yang dari Indonesia, tapi Liang Ie Shen penulis dari China

जैसा कि आप देख रहे हैं, ये कोड इमोजी बाइट्स कोड हैं। उदाहरण के लिए, पहली पंक्ति का मूल रूप " या बनी तपलक dkk " है, जहां 😄 को \xf0\x9f\x98\x84 द्वारा दर्शाया जाता है। मैंने एक इमोजी सूची बनाई है जिसमें इस साइट पर आधारित कोड है, और मैं ट्वीट डेटा से इन कोडों को हटाना चाहते हैं, इसलिए पहली पंक्ति के लिए मेरा वांछित परिणाम है " या बनी तपलक डीकेके "

मैंने यह डेटाफ़्रेम के लिए समस्या है, लेकिन यह काम नहीं कर रही है। मुझे पहले तो संदेह हुआ कि शायद इसलिए कि अधिकांश बाइट कोड बिना स्थान के जुड़े हुए हैं, जैसा कि आप पहली और तीसरी पंक्ति से देख सकते हैं। हालांकि, दूसरी और चौथी पंक्ति में भी कोई बदलाव नहीं किया गया। यहाँ मेरा कोड अब तक है:

df = pd.read_csv(tweet_data, sep='\t')
df2 = pd.read_csv(emoji_data, sep='\t')

emoji_list = df2['Code 2'].tolist()

df['Tweet'] = df['Tweet'].str.replace(r'\\n', '').str.replace(r'RT', '').str.replace(r'USER', '').str.replace(r'URL', '')

p = re.compile('|'.join(map(re.escape, emoji_list)))
df['Tweet'] = [p.sub('', text) for text in df['Tweet']] 

किसी भी मदद की सराहना की, धन्यवाद।

0
rayyar 4 मार्च 2020, 03:02
2
आपको यहां इमोजी पैटर्न मिल सकता है। शायद, emoji मॉड्यूल भी मददगार होगा।
 – 
Wiktor Stribiżew
4 मार्च 2020, 03:12
यहां कुछ गड़बड़ है, आपके इनपुट के साथ कुछ भी काम नहीं करता है। क्या आप कृपया एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान कर सकते हैं? अगर s = "\U0001F604 here", सब ठीक काम करता है।
 – 
Wiktor Stribiżew
4 मार्च 2020, 13:18
दुर्भाग्य से, उपलब्ध डेटा इमोजी का यह रूप प्रदान करता है
 – 
rayyar
4 मार्च 2020, 16:28
डेटा क्या है? समस्या को फिर से प्रस्तुत करने के लिए हमें एक नमूना प्रदान करें। या नीचे दिए गए समाधान जैसे समाधान के साथ जाएं
 – 
Wiktor Stribiżew
4 मार्च 2020, 16:32
डेटा ऊपर जैसा है, मेरे पास एक डेटाफ़्रेम है जिसमें ट्वीट कॉलम है, जिसमें ट्वीट डेटा है, उनमें से कुछ ऊपर चार डेटा की तरह हैं जिनमें इमोजी बाइट कोड है। जैसा कि आपने कहा था, इसे पाइथन द्वारा सफलतापूर्वक संसाधित करने के लिए यूनिकोड (इस तरह 'U0001F604') का उपयोग करना चाहिए। वर्तमान में मैंने वर्तमान इमोजी कोड को सही के साथ मैप करने का प्रयास किया
 – 
rayyar
4 मार्च 2020, 16:54

3 जवाब

यदि आप ट्वीट डेटा को संभाल रहे हैं, तो मेरे पास इसे साफ करने के लिए एक कार्य है।

import re
from nltk.tokenize import WordPunctTokenizer

def clean_tweets(tweet):
    user_removed = re.sub(r'@[A-Za-z0-9]+','',tweet)
    link_removed = re.sub('https?://[A-Za-z0-9./]+','',user_removed)
    only_alphanumeric = re.sub('[^a-zA-Z0-9]', ' ', user_removed)
    lower_case_tweet = only_alphanumeric .lower()
    tok = WordPunctTokenizer()
    words = tok.tokenize(lower_case_tweet)
    clean_tweet = (' '.join(words)).strip()
    return clean_tweet

फिर आपको केवल इस फ़ंक्शन को अपने कॉलम में लागू करने की आवश्यकता है जिसमें ट्वीट डेटा है।

df['Tweet'] = df['Tweet'].apply(clean_tweets)

यदि आप इमोजी को हटाने के लिए विशिष्ट कोड चाहते हैं, वह re.sub('[^a-zA-Z0-9]', ' ', tweet) है, तो यह स्ट्रिंग को फ़िल्टर कर देगा ताकि इसमें केवल अल्फ़ान्यूमेरिक वर्ण हो। आशा है कि इससे सहायता मिलेगी।

0
dzakyputra 4 मार्च 2020, 05:16
1
यह समाधान बहुत अधिक हटा देता है, उदा. रूसी (ф) या पोलिश अक्षर (जैसे ą)।
 – 
Wiktor Stribiżew
4 मार्च 2020, 13:20

तो, मुझे जवाब मिल गया है। इसमें इतना समय लगा क्योंकि मैंने डेटाफ्रेम के बिना समाधान का प्रयोग करने की कोशिश की। इस पर विचार करो:

text = 'Ya bani taplak dkk \xf0\x9f\x98\x84'
removed = re.sub(r"\\x[A-Za-z0-9./]+", "", text)

ये काम नहीं कर रहा है। हालांकि, यदि आप टेक्स्ट से पहले कच्चे स्ट्रिंग को इंगित करने के लिए r डालते हैं, तो इस तरह:

removed = re.sub(r"\\x[A-Za-z0-9./]+", "", r'Ya bani taplak dkk \xf0\x9f\x98\x84')

यह काम करता है, और "हां बनी तपलक डीकेके" प्रिंट करेगा। मूर्खता से, मैंने डेटाफ़्रेम के लिए इस दृष्टिकोण को लागू करने का एक तरीका खोजने के लिए काफी लंबा समय बिताया, और अंत में मैं इस कोड को यह देखने की कोशिश करता हूं कि यह उच्च अपेक्षा के बिना कैसे काम करता है:

df['Tweet'] = df['Tweet'].str.replace(r'\\x[A-Za-z0-9./]+', '')

और यह तुरंत काम करता है ... शायद पांडा डेटाफ्रेम पहले से ही टेक्स्ट डेटा को अनुकूलित करता है, इसलिए आपको इसे आर (कच्ची स्ट्रिंग) द्वारा पढ़ने की ज़रूरत नहीं है। लेकिन यह सिर्फ मेरी कमजोर धारणा है। अगर कोई इसके लिए ठोस स्पष्टीकरण दे सकता है तो मैं इसकी सराहना करता हूं। चीयर्स!

0
rayyar 6 मार्च 2020, 02:19
लेकिन इसका इमोजीस से कोई लेना-देना नहीं है। आप स्पष्ट रूप से इसके बाद 1 से 50 वर्णों के साथ एक \x सबस्ट्रिंग को हटा रहे हैं। यह बल्कि एक खतरनाक और नाजुक समाधान है, आप वास्तविक डेटा को हटा सकते हैं। क्या आप केवल 'x\d+ क्रमागत प्रतिमान हटाना चाहते हैं? df['Tweet'] = df['Tweet'].str.replace(r'(?:\\x\d+)+', '') का प्रयोग करें
 – 
Wiktor Stribiżew
5 मार्च 2020, 14:00
@WiktorStribiżew, हां, मैंने रेगेक्स को पहले से ही इसे और अधिक मजबूत बनाने के लिए बदल दिया है... भ्रमित करने वाले शब्दों के लिए खेद है, मेरे डेटा में सभी इमोजी को प्रारंभिक '\x' के साथ कोडित किया गया है।
 – 
rayyar
6 मार्च 2020, 02:22
मैंने एक सटीक समस्या का समाधान पोस्ट किया है जिसे आपने प्रश्न में बताया था। आपका वर्तमान रेगेक्स अधिक सक्रिय हो सकता है, यह रेगेक्स डेमो देखें।
 – 
Wiktor Stribiżew
6 मार्च 2020, 11:46

पायथन में दो हेक्स वर्णों के साथ शाब्दिक \x सबस्ट्रिंग के किसी एक या अधिक दोहराव को हटाने के लिए, आप इसका उपयोग कर सकते हैं

(?:\\x[A-Fa-f0-9]{2})+

रेगेक्स डेमो देखें।

यहां कुछ उदाहरण दिए गए हैं:

import re
rx = r"\s*(?:\\x[A-Fa-f0-9]{2})+"
text = r"Ya bani taplak dkk \xf0\x9f\x98\x84\xf0\x9f\x98\x84\xf0\x9f\x98\x84"
print( re.sub(rx, '', text) )
# => Ya bani taplak dkk

\s* 0+ रिक्त स्थान से मेल खाता है जो हटाए गए मैच को बाईं ओर ट्रिम करने के लिए उपयोग किया जाता है।

पंडों में, Series.str.replace का उपयोग करें:

df['Tweet'] = df['Tweet'].str.replace(r"\s*(?:\\x[A-Fa-f0-9]{2})+", "")
0
Wiktor Stribiżew 6 मार्च 2020, 11:43