Python小案例(一)非结构化文本数据处理

日常业务需求中,仅凭SQL一招鲜是没法吃遍天的,这个时候就需要更为强大的Python进行支持了。这个系列主要分享一些Python小案例,都是根据笔者日常工作需求抽离总结的,如有雷同,纯属巧合~

这一期,主要是利用python处理非结构化文本数据。而且每个小案例可能隐藏着一些使用的Pandas技巧.

嵌套json展开

隐藏知识点:函数递归

# ⚠️注意:用`json.loads`处理json型字符串时,键值应用双引号,外围用单引号。否则会转换失败,这里只是简单处理,所以采用`eval`函数避免转换错误。
# 随机构造一个json型的字符串
s = "{'A':111,'B':{'2':'b','1':{'a':23,'b':34,'c':{'HH':'good','hhh':[3,2,'q']}},\'3':[1,2,3]},'C':['a',34,{'mm':567,'gg':678}]}"
# 开发半展开json函数
def json_half_flat(dic):'''半展开json,只对字典类型展开dic:字典return:展开后的字典'''init_dic = {}keys = list(dic.keys())for i in keys:init_dic_value = dic[i]if type(init_dic_value) == dict:init_dic_value = json_half_flat(init_dic_value)init_dic_keys = list(init_dic_value.keys())for j in init_dic_keys:name = str(i) + '_' + str(j)init_dic[name] = init_dic_value[j]else:init_dic[i] = init_dic_valuereturn init_dic# 开发全展开json函数
def json_flat(dic):'''全展开json,对字典、列表均进行展开dic:字典return:展开后的字典'''init_dic = {}keys = list(dic.keys())for i in keys:init_dic_value = dic[i]if type(init_dic_value) == dict:init_dic_value = json_flat(init_dic_value)init_dic_keys = list(init_dic_value.keys())for j in init_dic_keys:name = str(i) + '_' + str(j)init_dic[name] = init_dic_value[j]elif type(init_dic_value) == list:length = len(init_dic_value)for j in range(length):name = str(i) + '_' + str(j)init_dic[name] = init_dic_value[j]else:init_dic[i] = init_dic_valuereturn init_dic
s2j = eval(s)
json_half_flat(s2j) # 下方输出结果可以发现半展开json函数对列表或者列表内的json不做处理
{'A': 111,'B_2': 'b','B_1_a': 23,'B_1_b': 34,'B_1_c_HH': 'good','B_1_c_hhh': [3, 2, 'q'],'B_3': [1, 2, 3],'C': ['a', 34, {'mm': 567, 'gg': 678}]}
s2j = eval(s)
json_flat(s2j) # 下方输出结果可以发现全展开json会对所有的json和列表均进行展开
{'A': 111,'B_2': 'b','B_1_a': 23,'B_1_b': 34,'B_1_c_HH': 'good','B_1_c_hhh_0': 3,'B_1_c_hhh_1': 2,'B_1_c_hhh_2': 'q','B_3_0': 1,'B_3_1': 2,'B_3_2': 3,'C_0': 'a','C_1': 34,'C_2': {'mm': 567, 'gg': 678}}

提取地址

这里介绍可用于处理中文地址的cpca库,甚至还具有自动补全地址省市的功能。

隐藏知识点:列表列拆分为多列

pip install cpca
import pandas as pd
import numpy as np
import cpca
# 构造地址数据df
df_address = pd.DataFrame({'id':[1,2,3],'address':["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "北京朝阳区北苑华贸城"]})df_address
id address
0 1 徐汇区虹漕路461号58号楼5楼
1 2 泉州市洛江区万安塘西工业区
2 3 北京朝阳区北苑华贸城
def get_address(location_str):'''提取字符串的地址信息location_str:地址字符串return:省、市、区、地址、邮编'''location_str=[location_str]df = cpca.transform(location_str)try:p=df['省'].values[0]c=df['市'].values[0]d=df['区'].values[0]ad=df['地址'].values[0]adcode=df['adcode'].values[0]except:passreturn p,c,d,ad,adcode
df_address['local'] = df_address['address'].apply(get_address)
df_address[['province', 'city', 'district', 'address', 'adcode']] = df_address['local'].apply(pd.Series) # 列表拆分为多列
df_address
id address local province city district adcode
0 1 虹漕路461号58号楼5楼 [上海市, 市辖区, 徐汇区, 虹漕路461号58号楼5楼, 310104] 上海市 市辖区 徐汇区 310104
1 2 万安塘西工业区 [福建省, 泉州市, 洛江区, 万安塘西工业区, 350504] 福建省 泉州市 洛江区 350504
2 3 北苑华贸城 [北京市, 市辖区, 朝阳区, 北苑华贸城, 110105] 北京市 市辖区 朝阳区 110105

提取url

这里通过urlextract库进行url提取,并通过正则过滤非图片url

隐藏知识点:列转多行

# !pip install urlextract
import pandas as pd
import numpy as np
import re
# 构造地址数据df
df_pic = pd.DataFrame({'id':[1,2],'content':['src=\"https://sm-wick-question.oss-cn-zhangjiakou.aliyuncs.com/QuestionAnswerImage/64809-1276-question.jpg\"></div>", "answer": "<div> <img src=\"https://sm-wick-question.oss-cn-zhangjiakou.aliyuncs.com/QuestionAnswerImage/64809-1276-answer.jpg\"></div>"','"avatar_url": "https://image.uc.cn/s/wemedia/s/upload/2021/5850c345e69483fd27b2622e9216273f.png", "description": "优秀青年教师", "fans_count": 0, "columns_count": 71, "courses_count": 0, "page_url": "https://course.myquark.cn/page/teacher?entrance=paisou_kgcard&page_name=page_a2s0k_course_learning&md_frm=teacher_area&uc_biz_str=qk_enable_gesture%3Afalse%7COPT%3ABACK_BTN_STYLE%400%7COPT%3AKEEP_SCREEN_ON%401%7COPT%3AW_PAGE_REFRESH%400%7COPT%3AS_BAR_BG_COLOR%40FFFFFF%7Cnull#/!{%22teacher_id%22:%22c099794880e34395b5bb146a1a04da99%22}", "cover_url": "http://image.uc.cn/s/wemedia/s/upload/2021/13078b26626a526e577585f6fc93430a.png"']})df_pic
id content
0 1 src="https://sm-wick-question.oss-cn-zhangjiak...
1 2 "avatar_url": "https://image.uc.cn/s/wemedia/s...
# 提取url
def get_urls(s):'''提取字符串的urls:字符串return:url列表'''from urlextract import URLExtractextractor = URLExtract()urls = extractor.find_urls(s)return urls# 列转多行
def split_row(df, column):""" 拆分成多行df: 原始数据column: 拆分的列名return: df"""row_len = list(map(len, df[column].values))rows = []for i in df.columns:if i == column:row = np.concatenate(df[i].values)else:row = np.repeat(df[i].values, row_len)rows.append(row)return pd.DataFrame(np.dstack(tuple(rows))[0], columns=df.columns)
# 提取urls
df_pic['urls'] = df_pic['content'].map(lambda x: get_urls(x))# 列转多行
df_pic_result = split_row(df_pic, column='urls')# 提取图片url
df_pic_result['pic'] = df_pic_result['urls'].map(lambda x: re.search('jpg|png', x, re.IGNORECASE))
df_pic_result = df_pic_result.dropna(subset=['pic']) # 删除没正则匹配到图片的数据# 剔除尾部反斜杠、截取到jpg|png
df_pic_result['urls_new'] = df_pic_result['urls'].map(lambda x: re.search('http(.+?)(png|jpg)', x.rstrip('\\'), re.IGNORECASE).group(0))# 展示结果
df_pic_result[['id', 'urls_new']]
id urls_new
0 1 https://sm-wick-question.oss-cn-zhangjiakou.aliyuncs.com/QuestionAnswerImage/64809-1276-question.jpg
1 1 https://sm-wick-question.oss-cn-zhangjiakou.aliyuncs.com/QuestionAnswerImage/64809-1276-answer.jpg
2 2 https://image.uc.cn/s/wemedia/s/upload/2021/5850c345e69483fd27b2622e9216273f.png
4 2 http://image.uc.cn/s/wemedia/s/upload/2021/13078b26626a526e577585f6fc93430a.png

统计中文

利用正则过滤非中文,通过Python的Counter进行统计。

import re
from collections import Counter# 构造数据
s = ['asdk;*教师oq年教w%8青年教qw优秀asd;青年教师asd','教w%8青年教qw优秀a']# 统计所有汉字
cn = Counter()
for i in s:s_ch = re.sub('[^\u4e00-\u9fa5]+', '', i) # 剔除非中文for j in s_ch:if j=='':continuecn[j]=cn[j]+1# 输出结果
print('统计结果:',list(cn.items())) # 查看统计结果
print('统计结果Top2:',cn.most_common(2)) # 查看次数最高的2个汉字
统计结果: [('教', 6), ('师', 2), ('年', 4), ('青', 3), ('优', 2), ('秀', 2)]
统计结果Top2: [('教', 6), ('年', 4)]

Hive也能完成上述任务,主要我在当时没想到split(str,‘’)可以进行分隔

Python小案例(一)非结构化文本数据处理相关推荐

  1. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

  2. 使用爬虫爬取两种数据:结构化/非结构化文本

    一.非结构化文本的爬取 微博上有一篇关于"#学校里的男生有多温柔#"的话题,点进去一看感觉评论很真实,于是想把评论给爬下来看一看,并生成词云.刚开始思路是通过网页端微博爬取,通过开 ...

  3. 文本数据可视化_非结构化文本数据的分析和可视化

    文本数据可视化 Stuck behind the paywall? Read this article with my friend link here. 卡在收费墙后面? 在这里与我的朋友链接阅读本 ...

  4. Python爬虫(七)_非结构化数据与结构化数据

    页面解析与数据提取 实际上爬虫一共就四个主要步骤: 定(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站的内容全部爬下来) 取(分析数据,去掉对我们没用处的数据) 存(按照我们想要的方式存储和 ...

  5. 非结构化数据和结构化数据提取

    页面解析和数据提取 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数据: ...

  6. 知识抽取学习笔记:面向非结构化数据的抽取

    1概念 知识抽取,即从不同来源.不同结构的数据中进行知识提取,形成知识(结构化数据)存入到知识图谱.大体的任务分类与对应技术如下图所示: 2知识抽取的技术与难点 从结构化数据库中获取知识:D2R 难点 ...

  7. neo4j图数据库:结构化数据流水线、非结构化数据流水线

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 智能对话系统:Unit对话API 在线聊天的总体架构与工具介绍 ...

  8. 非结构化商业文本中隐私信息识别-第2名方案(含数据)

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx 随着社交网络.移动通讯等技术的迅速发展,网络中存在大量包含隐私数据的文本信息,如何在非结构化 ...

  9. Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据

    导读:常见的数据来源和获取方式,你或许已经了解很多.本文将拓展数据来源方式和格式的获取,主要集中在非结构化的网页.图像.视频和语音. 01 从网页中爬取运营数据 要从网页中爬虫数据,可使用Python ...

最新文章

  1. 明年,我要用 AI 给全村写对联
  2. MIT-THU未来城市创新网络即将和你见面!
  3. 2021年,自动驾驶将我们带到何处去?
  4. 导致SEO优化排名不理想的三大因素,你踩雷了没?
  5. 20150430 调试分析之 根据内核报错信息栈信息分析错误
  6. 学习《TCP/IP详解 卷一协议》第九章的一点心得
  7. 对计算机科学的认识论文,关于对计算机的认识论文
  8. js html title属性,HTML DOM title 属性
  9. Java 求阴历(C++ 求阴历方法的转换)
  10. 《Android破解之北斗手机定位系统》之继续破解
  11. 服务器的正向代理与反向代理
  12. 微信网页PC端登录扫二维码登录
  13. gis合并dem数据_arcgis如何制作DEM数据
  14. flask中的可拨插视图
  15. cesium 模型实体平移
  16. 微信小程序开发错误代码
  17. 自建局域网 OTA 服务器
  18. Vue element-ui之神坑
  19. 3招搞定APP注册作弊
  20. Warning: findDOMNode is deprecated in StrictMode

热门文章

  1. 奇妙的 Docker Inspect
  2. 如何查看windows系统的安全日志
  3. UWB定位技术原理及场景应用的简单介绍
  4. visual basic是不是计算机语言,微软开始抛弃 Visual Basic 编程语言
  5. 北京智能佳科技有限公司亮相第十五期“科学城·云推介”直播间
  6. oom kill行为解析
  7. [学习心得][Html]disabled属性的启用和禁止
  8. SEO公司,是时候停止割韭菜了!
  9. ajax请求后sccess里函数不调用
  10. php正则表达式参考规则