2016-09-27 81 views
0

我用下面的正則表達式從python的日文twitter中提取表情文本。python:從日文twitter文本中用正則表達式提取表情文本

// this is for extracting number, character, Japanese 
text2 = r'[0-9A-Za-zぁ-んァ-ン一-龥]' 

non_text = r'[^0-9A-Za-zぁ-んァ-ン一-龥]' 
// this is for extracting text that are allowed in Japanese emoticons 
allow_text = r'[ovっつ゜ニノ三二]' 
hw_kana = r'[ヲ-゚]' 
open_branket = r'[\(∩ (]' 
close_branket = r'[\)∩ )]' 
arround_face = r'(?:' + non_text + '|' + allow_text + ')*' 
face = r'(?!(?:' + text2 + '|' + hw_kana + '){3,}).{3,}' 
face_string = arround_face + open_branket + face + close_branket +  
       arround_face 
p_face = re.compile(face_string) 

string1 = 'ふう。お腹いっぱい(´•౪•`), 試験頑張るぞ\\\\ ٩(‘ω’)و ////' 
string2 = '心の相談は メール [email protected] までご連絡ください' 
string3 = 'ドーピング系浪人生(n=1)' 
string4 = '橫浜は関內にある「 BAY らっきょ 」に初訪問してまいりました関東スープカレーブームの火付け役となったお店の「 人気NO.1 チキンカレー 」をいただきました(´∀`人)' 
string5 = '鳥取県倉吉市 倉吉農業高校 3年食品科 (音楽部・茶道部) AKB48大ファン高校生!まゆゆ、中野鬱海ちゃん神推し m0326w。♥。・゚♡゚・。♥。i0820n~現在♥大好きだよ♥  AKBファンの方はフォローお願いします^-^ \n\n來春から新社會人・・・の予定(´・ω・`) ' 
string6 = 'うわ。。(-_-;)授業。運動會はなくなると?' 
string7 = '毎月泊まっちゃえ♡親孝行*\(^o^)/*でも出來る時しとかないとだよ(o^^o)' 

emoj1 = p_face.findall(string1) 
emoj2 = p_face.findall(string2) 
emoj3 = p_face.findall(string3) 
emoj4 = p_face.findall(string4) 
emoj5 = p_face.findall(string5) 
emoj6 = p_face.findall(string6) 
emoj7 = p_face.findall(string6) 


print(emoj1) 
print(emoj2) 
print(emoj3) 
print(emoj4) 
print(emoj5) 
print(emoj6) 
print(emoj7) 

但結果如下:

1. ['(´•౪•`), 試験頑張るぞ\\\\ ٩(‘ω’)و'] 
2. ['\u3000メール\u3000'] 
3. ['(n=1)'] 
4. ['「\u3000BAY\u3000'] 
5. ['(´・ω・`) '] 
6. ['。。(-_-;)'] 

但也存在一些問題: 的字符串1,其實有兩種表情:

(´•౪•`) and \\\\ ٩(‘ω’)و //// 

但結果只顯示一個表情符號哪兩個表情符號與其他日文文字一起。我只是想下面的列表中包括兩名錶情:

[ '(´•౪•`)',' \\\\ ٩(‘ω’)و ////'] 

其次,STRING5實際上♥·゚♡゚·♥和^ - ^也是表情,但這些情感不能被提取。由回答正則表達式。

另外,字符串2,字符串3和字符串4中沒有表情文本(メール和(n = 1)['BAY']不是表情符號),但是正則表達式模式已經提取了這些文本。你可以給我你手怎麼解決這個問題,謝謝! 請日本的表情:http://kaomojiya.com/kao/?other/line

回答

1

下面的正則表達式應該匹配你想

expr = '[^0-9A-Za-zぁ-んァ-ン一-龥ovっつ゜ニノ三二]*'  + // [1] 
      '[\(∩ (]'         + // [2] 
       '[^0-9A-Za-zぁ-んァ-ン一-龥ヲ-゚\)∩ )]*' + // [3] 
      '[\)∩ )]'         + // [4] 
     '[^0-9A-Za-zぁ-んァ-ン一-龥ovっつ゜ニノ三二]*'   // [5] 

你不能嘗試here什麼。

它首先匹配潛在特殊字符(除數字,羅馬字,平假名,片假名和漢字任何東西,再加上特殊喀納斯[1]爲你做。然後,它與您所稱的open_branket[2]匹配,然後是任何非漢字,非數字等。和非close_branket[3]。最後,它匹配的表情符號的結束你[4]做同樣的方式和[5]


編輯

string4 = ... 
string5 = ... 

string4的問題是,字符BAYBAY不同。第一個是通常的ASCII字符0x42,0x410x59,而第一個是unicode characters,在0xff210xff3a之間。您可以將它們添加到拒絕字符列表([3])。您可能還需要添加他們lower case version0xff41),以0xff5a)以及相應的數字,從0xff100xff19 你可能有興趣閱讀this page about fullwidth and halfwidth

string5的問題在於那些表情符號不包含任何打開/關閉字符,因爲您已經定義了它們。對於第一個表情符號,如果這是可以接受的,則可以通過將添加到開頭字符列表來解決。但是,它不能解決^-^的問題。

我建議改變策略。 l ooks to work not too bad用於選擇一組常見字符(通常稱爲C)和C的子集,這些字符可能會出現在emojis(我們稱之爲S)和x。然後,你可以建立以下的正則表達式:

(?:C*)(?P<match>(?:[^C]|S){x,})(?:C*) 

這個表達式將匹配在非捕獲組,然後至少x「非正規」的字符或捕獲序列從子集S「常規」文本捕獲在名爲match的組中,後面是未捕獲的任何「常規」文本。

調查的Unicode編碼表,我定義爲C以下設置

\u4e00-\u9fff  => CJK Unified Ideographs 
\u3400-\u4dbf  => CJK Unified Ideographs Extension A 
\uf900-\ufaff  => CJK Compatibility Ideographs 
\u3040-\u309f  => Hiragana 
\u30a0-\u30ff  => Katakana 
\u3000-\u303f  => "CJK Symbol and punctuation" 
\uff21-\uff3a  => fullwidth A to Z 
\uff41-\uff5a  => fullwidth a to z 
\uff10-\uff19  => Fullwidth 0 to 9 
\uff00-\uff0e  => Fullwidth form of some punctuation characters 
A-Z    => ASCII A to Z 
a-z    => ASCII a to z 
0-9    => ASCII numbers 
@.,;!\?  ~♥\  => other punctuation characters 

而且S[人・;皿。゜°うぅ]x3但你需要檢查更多的日本集的表情符號來完善它。

有關詳細信息

這導致下面的正則表達式

(?:[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\ufaff\u3040-\u309f\u30a0-\u30ff\u3000-\u303f\uff21-\uff3a\uff41-\uff5a\uff10-\uff19\uff00-\[email protected],;!\?  ~♥\\]*)(?P<match>(?:[^\u4E00-\u9FFF\u3400-\u380f\uF900-\ufaff\u3040-\u309f\u30a0-\u30ff\u3000-\u303f\uff21-\uff3a\uff41-\uff5a\uff10-\uff19A-Za-z0-9\r\n]|[人・;皿。゜°うぅ]){3,})(?:[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\ufaff\u3040-\u309f\u30a0-\u30ff\u3000-\u303f\uff21-\uff3a\uff41-\uff5a\uff10-\[email protected],;  ~♥\\]*) 

作爲一個結論,我會說這不是真的有可能每一個日本人的表情符號與一個正則表達式匹配,因爲他們不遵循任何明確定義模式。此外,他們期望包含並且有時以普通文本結尾。例如(。´-д-)疲れた。。取自您的鏈接。像emojis數據庫的另一個解決方案可能是有趣的調查

+0

我真的感謝您的意見@托馬斯Wilmotte。我正在確認,我會報告結果。 – tktktk0711

+0

我確認後有一些問題。 – tktktk0711

+0

1.我已更新添加了新字符串的問題4,請閱讀它,並且我發現如果'。'或表情圖標(空格將是\ u3000)後面有兩個或三個空格。認爲這是表情符號是錯誤的。 – tktktk0711

相關問題