2016-09-27 3 views
0

J'ai pris l'expression rationnelle suivante pour extraire le texte de l'émoticône du twitter japonais avec python.python: extraire le texte de l'émoticône du texte twitter japonais avec regex

// 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) 

mais le résultat est le suivant:

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

Mais il y a quelques problèmes: Le chaine1, en fait il y a deux émoticônes:

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

mais le résultat montre seulement un émoticône dont deux émoticônes avec d'autres textes japonais. Je veux juste la liste suivante inclus deux émoticônes:

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

d'autre part, le fait string5 la ♥ · ゚ ♡ ゚ · ♥ et^-^sont aussi émoticône, mais ces émotions ne peuvent être extraites... par le regex répondu. En outre, il n'y a pas de texte d'émoticône (メ ー ル et (n = 1) ['「BAY'] ne sont pas des émoticônes) dans les chaînes string2, string3 et string 4. mais le motif regex a extrait ces textes. Pourriez-vous me donner la main pour résoudre ce problème, merci! s'il vous plaît vérifier l'émoticône japonaise: http://kaomojiya.com/kao/?other/line

Répondre

1

L'expression régulière suivante doit correspondre à ce que vous voulez

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

Tu ne peux pas l'essayer here.

Il commence par correspondance potentiels Caractères spéciaux (tout sauf les numéros, romaji, hiragana, katakana et kanji, plus Kanas spéciaux) [1] comme vous le faites. Ensuite, il correspond à ce que vous avez appelé open_branket[2], puis tout non kanji, non numéro, etc. et non close_branket[3]. Enfin, il correspondait à la fin de la emoji la même manière que vous le faites avec [4] et [5]


EDIT

string4 = ... 
string5 = ... 

Le problème avec string4 est que les caractères BAY diffèrent de BAY. Les secondes sont les caractères ASCII habituels 0x42, 0x41 et 0x59 tandis que les premiers sont unicode characters entre 0xff21 et 0xff3a. Vous pouvez simplement les ajouter à la liste des caractères rejetés ([3]). Vous pouvez également ajouter leur lower case version de (0xff41) à (0xff5a), ainsi que les chiffres correspondants, 0xff10-0xff19 Vous pourriez être intéressé par la lecture this page about fullwidth and halfwidth.

Le problème avec string5 est que ces emoji ne contiennent aucun caractère ouvert/fermé comme vous les avez définis. Pour le premier emoji, ceci peut être résolu en ajoutant à la liste des caractères d'ouverture si cela est acceptable.Cependant, cela ne résout pas le problème de ^-^.

Je suggère de changer la stratégie. Quelque chose que l ooks to work not too bad est de choisir un ensemble de caractères communs qui apparaît dans le texte habituel (appelons-le C) et un sous-ensemble de C qui pourrait apparaître dans emojis (appelons-le S) et un numéro . Ensuite, vous pouvez construire l'expression régulière suivante:

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

Cette expression correspond un texte « régulier » dans un groupe non de capture suivie d'une séquence capturée d'au moins x caractères ou des caractères « non réguliers » de votre sous-ensemble S capturé dans un groupe nommé match suivi de tout texte "normal" non capturé.

Enquête sur la table unicode, je définis comme C suivants illustrent

\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 

Et S comme [人・;皿。゜°うぅ] et x-3 mais vous devez inspecter plus l'ensemble des emoji japonais pour l'affiner.

Pour plus d'informations

Cette avance En conclusion, je dirais que ce n'est pas vraiment possible de l'expression régulière suivante

(?:[\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],;  ~♥\\]*) 

pour correspondre à tous les emoji japonais avec une expression régulière car ils ne suivent pas bien définis modèle. De plus, ils cherchent à inclure et parfois se terminent par du texte régulier. Par exemple (。´-д-)疲れた。。 pris de votre lien. Une autre solution comme une base de données d'emojis pourrait être intéressante à étudier

+0

Je vous remercie vraiment pour vos commentaires @ Thomas Wilmotte. Je le confirme, et je rapporterai le résultat. – tktktk0711

+0

il y a quelques problèmes après que je l'ai confirmé. – tktktk0711

+0

1. J'ai mis à jour la question qui a ajouté une nouvelle chaîne4, s'il vous plaît lisez-la, et j'ai trouvé s'il y a deux ou trois espaces après '.' Ou les émoticônes (l'espace sera \ u3000). et il sera faux de penser que c'est une émoticône. – tktktk0711