# DataProcess **Repository Path**: fdsina/Data_Process ## Basic Information - **Project Name**: DataProcess - **Description**: 包含文本数据预处理,图片下载,图片清洗,文章去重,图片标注等代码程序。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2018-08-15 - **Last Updated**: 2021-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![avatar](流程图.png) # 各文件夹介绍 ### script 数据处理流程中各种执行脚本 ### DataCleansing 数据提取模块,提取原始带图文章html数据至json,主程序DataCleansing-1.0-SNAPSHOT.jar ### Img_Downloader_Sina 图片下载器,主程序Img_Downloader_Sina-1.0-SNAPSHOT.jar ### clean_img 图片清洗模块,主程序ExtractFromFile.py,Calculate_Features.py,UpdateStatus.py ### deduplication 文章去重模块,主程序deduplication-1.0-SNAPSHOT-jar-with-dependencies.jar ### tagger 数据标注模块,主程序tagger-1.0-SNAPSHOT-jar-with-dependencies.jar ### AutoPhrase 自动短语挖掘模块,主程序auto_phrase.sh,用于挖掘新词词典 --- # 下载地址 ### 工作目录 workingDir 地址:https://storage.googleapis.com/littlebo/sinaTag20180904/workingDir.zip DataCleansing、tagger、deduplication、sinaTag等均需要工作目录workingDir才能正常运行,工作目录在各个项目均通用,里面包含:词库词典“dict”、停止词词典“stop”、LDA模型“LDAModel20180321”、专家图库“realExpertDic.json“、专家图库数据库备份“demo.specialImage_expert.json”。 ### 执行文件 bin 包括各个需要用到的jar包以及py文件,解压放在与workingDir同一目录下即可:DataCleansing-1.0-SNAPSHOT.jar、Img_Downloader_Sina-1.0-SNAPSHOT.jar、ExtractFromFile.py、Calculate_Features.py、UpdateStatus.py、deduplication-1.0-SNAPSHOT-jar-with-dependencies.jar、tagger-1.0-SNAPSHOT-jar-with-dependencies.jar https://storage.googleapis.com/littlebo/sinaTag20180904/bin.zip ### 辅助脚本 script 解压放在与workingDir同一目录下即可 https://storage.googleapis.com/littlebo/sinaTag20180904/script.zip ### 配图推荐 sinaTag 需要配合workingDir以及application.properties服用 配图服务API程序:https://storage.googleapis.com/littlebo/sinaTag20180904/SinaTag-1.0-SNAPSHOT.jar 新浪配图服务配置:https://storage.googleapis.com/littlebo/sinaTag20180904/application.properties *** # 原始数据处理流程 ##### 1⃣原始数据(新浪数据库导出,包含各种元信息,文章内容为html格式) ↓ Step1: 数据提取(从html解析文章内容和图片,并组织元信息到结构化格式) ##### 2⃣结构化原始数据,article_raw.json及validImage_raw.json(json格式,可直接导入MongoDB) ↓ Step2: 图片清洗(针对validImage_raw.json筛选掉低质量图片,不直接在json中删除,仅在原有条目上做标记处理,imgType为0代表好图片) ##### 3⃣清洗后数据,article_raw_clean.json及validImage_raw_clean.json(操作上article_raw.json与article_raw_clean.json是一样的) ↓ Step3: 文章去重(删除article_raw_clean.json中重复出现的文章,同时删除validImage_raw_clean.json中相应的图片,直接在json中删除) ##### 4⃣去重后数据,article_raw_clean_deduplicate.json及validImage_raw_clean_deduplicate.json ↓ Step4: 数据标注(对文章和图片添加关键词标签及LDA主题标签) ##### 5⃣最终数据,article_raw_clean_deduplicate_tagged.json及validImage_raw_clean_deduplicate_tagged.json ↓ Step5: 导入MongoDB(使用mongoimport工具) ↓ Step5.1: 对数据库中image的esFlag和imgType创建索引(可加快ES导入速度) ##### 6⃣MongoDB数据集,article及image ↓ Step5.9: 创建Elasticsearch索引fudanYYYYMMDD ↓ Step6: 导入Elasticsearch(使用loadToES接口,已导入的条目会在MongoDB中标记,esFlag为0代表未导入) ##### 7⃣ES索引fudanYYYYMMDD ### 各步骤详细介绍: #### step1 数据提取 输入:新浪文本数据raw.txt, 目录数据category.json(已提供) 输出:在raw.txt同目录下,生成文章数据article_raw.json以及图片数据validImage_raw.json 主程序:DataCleansing-1.0-SNAPSHOT.jar 示例: dataCleansing.sh ```bash #!/bin/bash #数据提取 java -Xmx20g -jar DataCleansing-1.0-SNAPSHOT.jar \ workingDir/data/raw.txt \ workingDir/category.json \ 20 #参数说明 #三个参数分别为: #输入文本数据路径 #cateogry文件路径,该文件在workingDir目录下 #线程数 #输出文章文件 workingDir/data/article_raw.json #输出图片文件 workingDir/data/validImage_raw.json #其他输出 report_xxx_$data.txt 统计文件,可删除 ``` #### step2 图片清洗 输入:文章数据article_raw.json及validImage_raw.json 输出:清洗后的文章数据article_raw_clean.json及清洗后的图片数据validImage_raw_clean.json 主程序:Img_Downloader_Sina-1.0-SNAPSHOT.jar, ExtractFromFile.py, Calculate_Features.py, UpdateStatus.py 要求:python3.x以及[pyzbar(https://pypi.org/project/pyzbar/),pytesseract(https://pypi.org/project/pytesseract/), numpy, PIL(Pillow)],图片存储根目录(手动创建)。由于下载图片和特征计算所需时间很长,因此将整个程序进行拆分。 清洗规则: ##### 1.OCR: tesseract pytesseract 超过50字符为垃圾 ##### 2.QR code scanner: pyzbar 检测到二维码则为垃圾 ##### 3.颜色处理: a.颜色区间压缩 img_data -= img_data % 14 b.颜色数量超过5000,则跳过 c.对像素占比超过15%的颜色进行占比的累加,超过阈值0.43算垃圾图片 ##### 4.宽高比超过2.5,长高比超过1.8算垃圾图 示例:clean.sh ```bash #!/bin/bash #图片清洗 cp workingDir/data/article_raw.json workingDir/data/article_raw_clean.json #①提取图片路径 python3 ExtractFromFile.py \ workingDir/data/imgs \ workingDir/data/validImage_raw.json #参数说明 #两个参数分别为: #图片根目录 #输入图片数据路径 #输出文件为: #图片下载器所需文件:workingDir/data/validImage_raw_urls, workingDir/data/validImage_raw_filePaths #特征计算所需文件: workingDir/data/validImage_raw_features.json #注意,2,3阶段所需要的时间都较长,因此将每一步分开进行。 # 特征文件格式为: # {'extreme': 0.0, # 'filePath': '/data0/fudan/ttx/img_20180412/f/b/imageID-347e0e40-b859-40ad-a9e3-b039713041bf.jpg', # 'hw': 1.3234375, # 'imgID': 'imageID-347e0e40-b859-40ad-a9e3-b039713041bf', # 'qr': ‘0’, # 'status': '0', # 'text': 'v e\n\\A BALANCED DI\nAR NAHIND.', # 'url': 'http://n.sinaimg.cn/sinacn/w640h847/20180123/086d-fyqwiqi7936061.jpg', # 'wh': 0.755608028335301} #②下载图片 java -jar Img_Downloader_Sina-1.0-SNAPSHOT.jar \ workingDir/data/imgs/ \ workingDir/data/validImage_raw_urls \ workingDir/data/validImage_raw_filePaths \ 20 #参数说明 #四个参数分别为: #图片根目录,需要加"/",并且与1中的路径相同。且需要在该步手动创建该目录。 #下载图片url 路径 #下载图片对应存储路径文件 路径 #线程数 #输出文件为: #存储在 imgs 目录下的图片 #③计算特征 python3 Calculate_Features.py \ workingDir/data/validImage_raw_features.json \ 20 #参数说明 #两个参数分别为: #图片特征文件 #线程数 #输出文件为workingDir/data/validImage_raw_features.json,直接在原特征文件上更新。 #④回写结果 python3 UpdateStatus.py \ workingDir/data/validImage_raw_features.json \ workingDir/data/validImage_raw.json #参数说明 #两个参数分别为: #图片特征文件路径 #输入图片数据路径 #输出文件为workingDir/data/validImage_raw_clean.json。 ``` #### Step3 文章去重 输入:清洗后的文章数据article_raw_clean.json及清洗后的图片数据validImage_raw_clean.json 输出:去重后数据,article_raw_clean_deduplicate.json及validImage_raw_clean_deduplicate.json 主程序:deduplication-1.0-SNAPSHOT-jar-with-dependencies.jar 要求:java8及工作目录workingDir,里面至少包含字典文件夹dict和停止词文件夹stop 示例:deduplication.sh ```bash #!/bin/bash #文章去重程序样例 #updated by BodeNg at 2018/9/3 java -Xmx20g -jar deduplication-1.0-SNAPSHOT-jar-with-dependencies.jar \ workingDir/data/article_raw_clean.json \ workingDir/data/validImage_raw_clean.json \ auto \ 10000 \ 20 \ 0.95 #参数说明 #六个参数分别为: #输入文章数据路径 #输入图片数据路径 #操作流程,可选“index”、“remove“、”check“、”rewrite“,四个流程依次执行,”auto“为依次执行上述所有四个流程 #监视参数,示例为每处理10000输出一次日志 #线程数 #重复率阈值,示例为筛选掉重复率大于95%的文章 #输出文章文件为 workingDir/data/article_raw_clean_deduplicate.json #输出图片文件为 workingDir/data/validImage_raw_clean_deduplicate.json #其他输出 workingDir/data/article_raw_clean_Term_Index(文章索引文件夹,可删除) #其他输出 workingDir/data/article_raw_clean_result.csv(去重结果统计表) #其他输出 workingDir/data/duplicateTmp(去重过程中间结果文件夹,可删除) ``` #### Step4 数据标注 输入:去重和清洗后的文章数据article_raw_clean_deduplicate.json及图片数据validImage_raw_clean_deduplicate.json 输出:标注后数据,article_raw_clean_deduplicate_tagged.json及validImage_raw_clean_deduplicate_tagged.json 主程序:tagger-1.0-SNAPSHOT-jar-with-dependencies.jar 要求:java8及工作目录workingDir,里面至少包含字典文件夹dict、停止词文件夹stop、LDA模型文件夹LDAModel20180321 示例:tagger.sh ```bash #!/bin/bash #图片自动标注程序样例 #updated by BodeNg at 2018/9/3 java -Xmx20g -jar tagger-1.0-SNAPSHOT-jar-with-dependencies.jar \ 20 \ workingDir/data/article_raw_clean_deduplicate.json \ workingDir/data/validImage_raw_clean_deduplicate.json \ index-tag \ 10000 #参数说明 #五个参数分别为: #线程数 #输入文章数据路径 #输入图片数据路径 #操作流程,可选“index”、“tag“,两个流程依次执行,”index-tag“为依次执行上述所有两个流程 #监视参数,示例为每处理10000输出一次日志 #输出文章文件为 workingDir/data/article_raw_clean_deduplicate_tagged.json #输出图片文件为 workingDir/data/validImage_raw_clean_deduplicate_tagged.json #其他输出 workingDir/data/validImage_raw_clean_deduplicate_Index(图片索引文件夹,可删除) #其他输出 workingDir/data/tagTmp(去重过程中间结果文件夹,可删除) ``` #### Step5 导入MongoDB 输入:标注后数据,article_raw_clean_deduplicate_tagged.json及validImage_raw_clean_deduplicate_tagged.json 目标:MongoDB中article库与validImage库 要求:mongoimport工具(可下载编译后的mongodb,其bin中含有mongoimport工具) 示例:importToMongo.sh ```bash #!/bin/bash #导入标注图库到Mongo #updated by BodeNg at 2018/9/3 #输入数据地址,根据需要调整 articleJson="workingDir/data/article_raw_clean_deduplicate_tagged.json" validImageJson="workingDir/data/validImage_raw_clean_deduplicate_tagged.json" #MongoDB信息 host=10.13.16.104 port=24030 db=article username=article password=aRsDCQsxQAiTiCle # host=10.141.211.93 # port=27017 # db=test #导入至目标文章数据集,根据需要调整collection名称 collection=article_20180531 cmd="mongoimport \ --host=$host --port=$port --db=$db --collection=$collection --username=$username --password=$password \ --file" echo $cmd $articleJson eval $cmd $articleJson echo "import articles done." #导入至目标图片数据集,根据需要调整collection名称 collection=validImage_20180531 cmd="mongoimport \ --host=$host --port=$port --db=$db --collection=$collection --username=$username --password=$password \ --file" echo $cmd $validImageJson eval $cmd $validImageJson echo "import images done." ``` #### Step5.1 创建MongoDB索引 对validImage_20180531(以Step5为例)中的esFlag、imgType创建索引,可加快后续ES导入速度,不创建也问题不大。 注意:没导入过esFlag的图片其esFlag为0,若想重新将validImage_20180531导入至一个新的es索引,需要把validImage_20180531中所有esFlag重置为0。 #### Step5.9 新建ES索引 示例:创建一个名为fudan20180531的es索引 ```bash bash createIndex.sh fudan20180531 ``` createIndex.sh具体内容: ```bash #!/bin/bash #createIndex.sh #索引名 index=$1 #根据需要调整ES服务器信息 curl -XPUT http://image:fudanes@10.39.3.78:9200/${index}/ -d ' { "mappings": { "image": { "properties": { "Tags": { "type": "nested", "properties": { "tag_id": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "tag_name": { "type": "keyword" }, "tag_score": { "type": "float" }, "tag_source": { "type": "text", "fielddata": true } } }, "imgLocalURL": { "type": "text" }, "imgOriginalURL": { "type": "text" }, "img_cate": { "type": "text", "fielddata": true }, "img_id": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "img_source": { "type": "text", "fielddata": true }, "top_topics": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "article_id": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } '; ``` #### Step6 导入Elasticsearch 启动核心图片推荐程序,调用loadToES接口将MongoDB数据导入Elasticsearch索引中,导入完成后即可进行图片推荐工作 主程序:SinaTag-1.0-SNAPSHOT.jar 要求:java8及工作目录workingDir,里面至少包含字典文件夹dict、停止词文件夹stop、LDA模型文件夹LDAModel20180321 流程: 1、修改application.properties为最新的数据库版本及索引版本,以上述为例,主要修改四个参数 ```bash com.dasLab.mongodb.collection.article = article_20180531 com.dasLab.mongodb.collection.image = validImage_20180531 com.dasLab.mongodb.collection.specialImage = specialImage_20180531 com.dasLab.es.index = fudan20180531 ``` 2、启动图片推荐程序 ```bash java -Xmx12g -jar SinaTag-1.0-SNAPSHOT.jar ``` 3、调用接口导入数据至es索引,以下为自动导入数据至索引的脚本loadToES.sh,可根据需要调整程序api的ip及端口 ```bash #!/bin/bash flag=0 count=1 echo 'flag: '${flag} while [ $flag -eq 0 ] do flag=$(curl 10.39.3.123:8848/v1/data/loadToES) echo $count' th query, flag:'$flag let count++ done flag=0 count=1 echo 'flag: '${flag} while [ $flag -eq 0 ] do flag=$(curl 10.39.3.123:8848/v1/data/loadSpecialImageToES) echo $count' th query, flag:'$flag let count++ done ``` *** # 专题图库处理流程 1⃣格式化专题图库数据(直接提供,json格式,直接导入数据库) ↓ Step1: 导入MongoDB(使用mongoimport工具) 2⃣MongoDB数据集,specialImage ↓ Step2: 导入Elasticsearch(使用loadSpecialImageToES接口,已导入的条目会在MongoDB中标记,esFlag为0代表未导入) 3⃣ES数据库fudanYYYYMMDD #### Step 1 导入MongoDB说明: 输入:提供的最新版的专题图库json文件specialImage.json 目标:MongoDB中specialImage库 要求:mongoimport工具(可下载编译后的mongodb,其bin中含有mongoimport工具) 示例:importSpecialToMongo.sh ```bash #!/bin/bash #输入数据地址,根据需要调整 specialImage="workingDir/data/specialImage_20180627.json" #MongoDB信息 host=10.13.16.104 port=24030 db=article username=article password=aRsDCQsxQAiTiCle #导入至目标专题图库数据集,根据需要调整collection名称 collection=specialImage_20180627 cmd="mongoimport \ --host=$host --port=$port --db=$db --collection=$collection --username=$username --password=$password \ --file" echo $cmd $specialImage eval $cmd $specialImage echo "import special images done." ``` #### Step 2 导入Elasticsearch说明: 当前最新版本专题图库为specialImage_20180627,已保存在MongoDB中,若想重新将其导入至一个新的es索引,需要把所有esFlag重置为0。 示例脚本已整合到原始数据处理流程中Step6的loadToES.sh中。 *** # 自动短语挖掘AutoPhrase 通过无监督学习模型自动挖掘语料库中的新词短语,以构建最新的专题词典。 输入:需要进行短语挖掘的文章数据artilce.txt,每篇文章单独一行,并在脚本中设置数据路径“RAW_TRAIN“和模型路径“MODEL”,如”models/Sina20180627“ 输出:挖掘得到的短语及其评分,包括单词与短语,模型与结果存放在模型路径下 主程序:auto_phrase.sh 要求:先执行compile.sh编译,得到“bin/segphrase_train”及“bin/segphrase_segment”