09月30, 2020

UCG网络文本预处理

UCG是由用户在网络平台上产生的内容,文本含有大量表情符号和不可见的unicode字符,当使用它来训练NLP模型前,需要完成文本清洗.

本文介绍我在实践中摸索到的经验

哪些内容需要清理

  • 表情符号 emoji
  • unicode控制字符 \u2000-\u202f
  • 无效字符 \ufff0-\uffff
  • 重复文字

Unicode 的方向控制字符

U+202D 和 U+202C 这两个是个啥?

其实这两个都是关于方向的 Unicode 控制字符,U+202D 简称 LRO ,U+202C 简称 PDF 。那它们是做什么用,如何控制所谓方向的呢?

基础方向

定义的是一个区域的整体方向,例如一个页面、一个段落或一个句子。中英文环境一般是 (LTR) 从左至右,而阿拉伯文环境则为 (RTL) 右至左的书写顺序

字符方向

日常我们书写文字会知道,书写的方向是决定于所书写的文字,汉子、拉丁文字是从左至右,阿拉伯文、希伯来文则是从右至左。相应的,Unicode 字符在设计时就考虑了不同文字方向性的问题,因此定义了每个 Unicode 字符的方向属性。

处理脚本

import pandas as pd
import emoji
import regex as re
import os
import shutil
import glob
import random
from tqdm import tqdm
from bidi.algorithm import get_display
import os.path as osp

reg_emoji = re.compile(emoji.get_emoji_regexp().pattern)
reg_emojired = re.compile('\[.*?]')
reg_at = re.compile('@\S+')
reg_invalid = re.compile(r'[\ufff0-\uffff]')
# 0宽度控制字符
reg_zerowidth = re.compile(r'[\u2000-\u202f]')
reg_space = re.compile('(?<=[\u4e00-\u9fa5!!...:。?~])(\s+)')

def normalize_title(title):
    title=reg_emoji.sub('',title,concurrent=True)
    title=title.split('@',maxsplit=1)[0]
    return title.strip()

def normalize_content(content):
    content=content.replace('[商品]#','')
    content=reg_emoji.sub('',content,concurrent=True)
    content=reg_emojired.sub('',content,concurrent=True)
    content=reg_invalid.sub('',content,concurrent=True)
    content=reg_at.sub('',content,concurrent=True).strip()
    content=re.sub('\s{2,8}',' ',content,concurrent=True)
    content=reg_space.sub('\n',content,concurrent=True)

    try:
        content=get_display(content)
    except:
        print(content)
    content=reg_zerowidth.sub('',content,concurrent=True)
    return content.strip()

参考资源

https://www.jianshu.com/p/6aa9061ffa42

本文链接:http://57km.cc/post/preprocess ucg content.html

-- EOF --

Comments