2017-05-21 6 views
2

テキスト分類の問題の一部として、私はテキストデータセットを消去しようとしています。これまでのところ私はテキスト以外のすべてを削除していました。句読点、数字、絵文字 - すべてが削除されました。今では絵文字をフィーチャーとして使用しようとしているため、絵文字だけでなく絵文字も保持したいと考えています。テキストから言葉や絵文字以外のものをすべて削除するには?

まず、テキスト内の絵文字を検索し、他の言葉/絵文字と区別しています。これは、それぞれの絵文字を個別に/個別に処理する必要があるためです。だから私は絵文字を検索し、その両端にスペースを入れます。

しかし、私は単語と絵文字のための既知の正規表現をどのように組み合わせるかを考えています。ここに私の現在のコードは次のとおりです。

import re 

def clean_text(raw_text): 

    padded_emoji_text = pad_emojis(raw_text) 
    print("Emoji padded text: " + padded_emoji_text) 

    reg = re.compile("[^a-zA-Z]") # line a 

    # old regex to remove everything except words 
    letters_only_text = reg.sub(' ', raw_text) 
    print("Cleaned text: " + letters_only_text) 

    # Code to remove everything except text and emojis 
    # How? 

def pad_emojis(raw_text): 

    print("Original Text: " + raw_text) 

    reg = re.compile(u'[' 
     u'\U0001F300-\U0001F64F' 
     u'\U0001F680-\U0001F6FF' 
     u'\u2600-\u26FF\u2700-\u27BF]', 
     re.UNICODE) 

    #padding the emoji with space at both ends 
    new_text = reg.sub(r' \g<0> ',raw_text) 

    return new_text 

text = "I am very #happy man! but my wife is not . 99/33" 
clean_text(text) 

現在のO/P:私は達成しようとしています何

Original Text: I am very #happy man! but my wife is not . 99/33 
Emoji padded text: I am very #happy man! but  my wife is not  . 99/33 
Cleaned text: I am very happy man but my wife is not 

I am very happy man but  my wife is not  

質問:

1)私はどのようにemoji regexをregexという単語とともにregexのコンパイルに追加しますか? (行a)

2)私はより良い方法で、すなわち、絵文字を分離し、スペースでそれらを埋め込むために別の関数を書く必要なく、私は何を求めているのでしょうか?私はどういうわけか、これを避けることができると感じています。

+0

[このPython 3デモ](http://rextester.com/YKDXU24273)を参照してください - 私はそれが1ステップでそれを行う方法を示していると思います。空白を「縮める」必要があるかどうかは分かりませんが、予想される結果は私が得るものとは少し異なります。 –

+0

ねえ、それは素晴らしいです!それは間違いなく機能します。私は多くのユースケースを試してきましたが、すべてのケースで問題なく動作していたようです。そして、はい、私は質問を含まないテキストクリーニングの最後のステップであった空白を縮小する必要があります。それを世話してくれてありがとう。今あなたはこれが答えであることを追加できますか?また、正規表現は私が理解するには複雑すぎる。あなたの答えにある程度説明できれば素晴らしいことでしょう。どうもありがとう! –

+0

さて、ちょっと待ってください。私はここでも縮んでいる複数の空白を追加します。 –

答えて

1

あなたはこのようre.sub内の単一の正規表現とラムダ式を使用して一つに2つのステップを結合することがあります。

  • import re 
    
    emoji_pat = '[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]' 
    shrink_whitespace_reg = re.compile(r'\s{2,}') 
    
    def clean_text(raw_text): 
        reg = re.compile(r'({})|[^a-zA-Z]'.format(emoji_pat)) # line a 
        result = reg.sub(lambda x: ' {} '.format(x.group(1)) if x.group(1) else ' ', raw_text) 
        return shrink_whitespace_reg.sub(' ', result) 
    
    text = 'I am very #happy man! but my wife is not . 99/33' 
    print('Cleaned text: ' + clean_text(text)) 
    # => Cleaned text: I am very happy man but my wife is not 
    

    Python demo

    説明を参照してください。最初の正規表現は([\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF])|[^A-Za-z]のようになり、と一致し、キャプチャしますをグループ1に変換するか、ASCII文字以外の任意の文字と一致するだけです。絵文字がキャプチャされている場合(ラムダ内のif x.group(1)を参照)、絵文字はスペースで囲まれて返されます。そうでない場合、スペースは非文字を置き換えるために使用されます。

  • \s{2,}パターンは2つ以上空白とshrink_whitespace_reg.sub(' ', result)は、これらすべてのチャンクを1つの空白で置き換えます。
+1

ありがとう、Wiktor。あなたは大きな助けになりました。 –

関連する問題