NLP中的预处理

最近在做nlp相关的项目,对新手而言真的是从零开始造轮子...
  刚开始mentor了个相关性分析的任务,我开始了激情澎湃词向量训练之路,几天之后...发现我还停留在数据预处理阶段...就很绝望
  nlp预处理虽然麻烦,但总有一套流程的,大致包括:本文提取文本过滤/清洗分词这几个流程,本文所用环境:MacOS(本机)、RedHat(服务器)。

1.文本提取

1.1 json

JSON指JavaScript对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,文件以.json为后缀。
注:JSON格式必须使用双引号,以键值对的形式存在

待处理文本:

json文本

less查看文件的时候,我当成html格式的文本去提取了...结果很尴尬,找到两种方法提取content正文文本,并过滤掉文本中的html标签信息。
① js代码

data.content = JSON.parse(JSON.stringify(data.content).replace(/<\/?.+?\/?>/g,""));

② python代码

>>> with open(datapath, 'r') as fp:
...   json_data = json.load(fp)
... 
>>> `ValueError: Extra data: line 2 column 1 - line 12244872 column 1 (char 840 - 54306796812)`
# 报错原因:json.load()、json.loads()无法解码多个json对象,采用jsonlines遍历读取。

# 完整代码:用于文件中包含多个json对象的处理
import jsonlines
import re
def deal_json():
  t_file = open('res.txt', 'w')
  with open('example_json', 'r') as fp:
    for item in jsonlines.Reader(fp):
      if 'content' in item:
        tmp = item['content']   # 提取所需要的正文文本,不一定是content
        tmp = re.sub(r'<[^>]+>', '', tmp)   # 去除html标签
        t_file.write(tmp+'\n')
  t_file.close()

1.2 html

其实这个还没实操过,贴几个参考文档:
任意网页正文内容主题词提取

# 测试代码
from bs4 import BeautifulSoup
file = open('exaplme.txt', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(bs.title)

1.3 提取某列

normally,公司爬到的文本或者生成query不一定是单列文本,可能包含多列比如日期、部门标记(20200502 \t department \t data)等等。

cat wiki.txt | awk -F '\\t' '{print$5}' > wiwi_col5

2.文本过滤(表情标签、火星文、繁简转换、空格空行、重复行、全半角)

2.1 表情标签

情感分析中的表情是一种比较重要的特征,但大多数任务,可以直接忽略。

  • 表情语义化
    pip install emoji -i https://mirror.baidu.com/pypi/simple 安装emoji包,语义化表情:
>>> import emoji
>>> example = "nlp好简单喔😁nlp好难哦😊我爱nlp😬"
>>> res = emoji.demojize(example)
>>> res
'nlp好简单喔:beaming_face_with_smiling_eyes:nlp好难哦:smiling_face_with_smiling_eyes:我爱nlp:grimacing_face:'
import re
def keep_zh(data):
    file = open(data, 'r')
    t_file = open('data_jtzh_a', 'w')
    line = file.readline()
    while line:
        line_sub = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])","",line)
        if line_sub:
            line_sub += '\n'
            t_file.writelines(line_sub)
        line = file.readline()
    t_file.close()
>>> example = "^^nlp好简单喔*0*😁nlp好难哦😊我爱nlp😬>,<치앙+▄┻┳═"
>>> re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])","",example)
'nlp好简单喔0nlp好难哦我爱nlp'

2.2 火星文

看了很多用户名,都有火星文,这都0202年了..
有人会处理的话..麻烦评论一下教教我..

2.3 繁简转换

不管是哪个平台(微博、豆瓣、快手、抖音等等)都会有繁体字的出现,由于计算机编码的存在,繁体视为和简体不同的字,虽然占比较小,但不容忽视。

Open Chinese Convert(OpenCC)是一个开源的中文简繁转换项目,致力于制作高质量的基于统计预料的简繁转换词库。还提供函数库(libopencc)、命令行简繁转换工具、人工校对工具、词典生成程序、在线转换服务及图形用户界面。

这里借助OpenCC工具可对文本进行繁简转换,安装方式:
① 解压安装
  下载地址:OpenCC下载,选择合适的版本,解压即可,进入安装目录执行命令。

opencc -i zhft.txt -o zhjt.txt -c t2s.json   # 繁转简
opencc -i zhjt.txt -o zhft.txt -c s2t.json   # 繁转简

② python安装opencc模块
  不过opencc-python坑比较多,需要解决依赖问题,可采用pip install opencc-python-reimplemented解决,u1s1处理有点慢,据说snownlp模块会快一点,下次有机会试试。

def opencc_deal(data):      # path:zhft.txt
    file = open(data, 'r')
    t_file = open('zhjt.txt', 'w')
    cc = opencc.OpenCC('t2s')
    line = file.readline()
    while line:
        t = cc.convert(line)
        t_file.writelines(u'%s' % t)
        line = file.readline()

③ 系统全局安装 brew install Opencc
命令同①

2.4 空格空行

shell直接处理,速度挺快: (sedawk是个好东西,建议了解~

  • 空格
sed 's/ //g' example.txt > example_noblank.txt   # g表示全局匹配,替换一行中所有空格
  • 空行
sed -i '/^$/d' example.txt   # 仅去空行
  • 去除一切由空格、空行、制表符组成的空行
sed '/^\s*$/d' example.txt

2.5 重复行

  • pandas
    对pandas比较熟悉,用了这种曲折的方法。
    我的文本没有逗号,而pd.read_csv(seq = ',') 默认以逗号为分隔符,得到的pdfile只有一列,比较简洁。
def delet_repeat(filepath):
    pdfile = pd.read_csv(filepath)
    pdfile.head()
    res = pdfile.drop_duplicates()
    res.to_csv('./res.txt', index = 0)
  • shell:uniq
    uniq只对相邻行做比较,一般结合sort排序,会打乱文本顺序
sort -n aa.txt | uniq > bb.txt

2.6 全半角

知识盲区,我还没处理过这个..
参考文档:
Python实现全角与半角相互转换

3.分词

关于分词技术、实现方式就不细说了,我也不懂...安心做调包侠,分词主要用的工具是jieba分词,不过速度有点慢...巨慢...公司有提供另一种分词方法,这里就不便透露啦~~~
分词需要考虑两点:细粒度停用词

  • 细粒度
  • 停用词

停用词,词典中解释为“电脑检索中的虚字、非检索用字”,SEO中,为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这些字或词即被称为Stop Words(停用词),停用词主要包括:
① 出现频率很高,但意义不大的词,主要包括了语气助词、副词、介词、连词等,“是”、“的”、“在”、“和”。
② 出现频率过高的词,比如:“我”、“你”等

NLKT不支持中文,国内整理了几套中文停用词表:下载地址,一般用cn_stopwords.txt,下载之后,创建停用词list:

def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    stopwords = set(stopwords)
    return stopwords

分词的同时去除stopwords:

def seg(data):
    file = open(data, 'rb')
    t_file = open(res.txt, 'w')
    line = file.readline()
    while line:
        tmp = jieba.cut(line)
        line_seg = " ".join(tmp)
        # t_file.writelines(line_seg)
        # 去除停用词部分
        out = ''
        for word in line_seg.split():
            word = word.strip()
            if len(word)>1 and word not in stopwords and word!='\t':
                out += word
                out += ' '
        out = out.strip()+'\n'
        t_file.writelines(out)
        line = file.readline()
    file.close()
    t_file.close()

停用词不一定要去掉,尤其是在具体生态特色的公司,实践出真知,多试试就知道啦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345