Python | 图片转文字

1 背景

现在需要分析大众点评网站的评论,进行情感分析,主题模型等等,所以第一步是进行爬虫,现在这部分工作已经完成(后面会总结利用Python进行爬虫)但是在爬虫的过程中发现了一个问题,就是点评网站上评论中会有部分是文字被替换成了图片,所以直接爬取评论下来就会出现信息不全的情况,这时候我们采用的方法是什么呢?

  • 第一步是使用截图的方式把评论给截下来!
  • 第二步是利用Python将图片转为文字!

今天我们主要探讨的就是第二部分!如何将图片转为文字呢?

2 数据概况

那我们现在的数据是怎么样的呢?一个文件夹代表一个商家
在这里插入图片描述

每个文件夹下面呢?分别是这个商家对应的所有评论的截图!
在这里插入图片描述

3 需求

现在的需求就是将每一个商家所有的评论图片全部转为文字,最后希望能形成一个DataFrame,有三列:

  • 一列是文件夹名称,也就是对应商户号
  • 一列是所有图片的全名
  • 一列是转为的文字的列

4 利用Python进行转换

4.1 导入相应的库

import time
import pandas as pd
import json
import random
from aip import AipOcr
import os

4.2 设置百度云的API相关参数

# 连接api
APP_ID = "15433908"
API_KEY = "tcHjIKc51txVe73RNA2Pt7pY"
SECRET_KEY = "08OvI17ZHWt6Q9PoL4o885LXxRFvdSLG"
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 返回值设置
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "False"
options["detect_language"] = "False"
options["probability"] = "False"

4.2.1 如何获取上述API的相关关键参数?

这就有一个问题了,如何设置百度云的相关API参数呢?

  • 首先注册登录百度云(网址:https://login.bce.baidu.com),

  • 然后找到下面这个东东:
    在这里插入图片描述

  • 然后创建一个项目
    在这里插入图片描述
    还可以看到今天我也使用了其中的一个项目 并且调用了接近3000次,也就是转换了这么多的图片!

  • 进入界面后填写相关信息,点击创建即可!
    在这里插入图片描述

  • 创建完毕之后,点击查看详情
    在这里插入图片描述

  • 然后就会看到下图了,重要的三个参数就可以获得!
    在这里插入图片描述
    然后把上述参数换成自己的就ok啦!注意一天免费使用50000次~

下面就愉快的调用API啦~

4.3 定义读取图片函数

# 读取图片函数
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

4.4 单独转换图片的内容

4.4.1 看共有多少文件夹

# 读取评论信息下面所有文件夹的名称
mer_folds = os.listdir('./评论信息/')
print('文件夹下面共有 %d 个商户的评论图片' % len(mer_folds))
mer_folds[:5]
文件夹下面共有 138 个商户的评论图片





['68045603', '76936090', '23060131', '66264063', '95358955']

4.4.2 看评论图片

os.listdir('./评论信息/76936090')
['39018468.jpg']

4.4.3 打印这个图片的内容

get_file_content('./评论信息/76936090/39018468.jpg')
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x00\x18\x02\xee\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x91\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4\xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf7)\xb5{+y\xee\xe2\x9a`\x86\xd2\x01q9 \xedD;\xb0I\xff\x00\x807\x1dx\xa7\xe9\xda\x85\xbe\xa9d\x97V\xc5\x8clJ\x95u*\xc8\xc0\xe0\xab)\xe4\x10A\x04\x1a\xe0\xe7\xd3\xe7\x83S\xd6&\x9e\xfe[\x99\x06\xa9h|\xa6\x00G#\xc8b\x08\x08\xeb\xb5\x018\x19\xc7s\x92+c\xec\xc6[\xbf\x14]%\xb3]\x15\x94\xdb\x1d<m\xf2\xae\xbfq\x13.\xf0x\xceX\x82x\xc8\xeb\x9c\nL\x0b\xf3\xf8\xcbG\xb6\xd2\xedu\t\xe5\x928.\xae\x9a\xd6<\xa6X\xb2\xb3+\x12\x07E\x1bI\'\xd2\xad\x0f\x12i\x0f\xa7G\xa8Gx\xb2\xdaH\xe5\x12X\x91\x9c\x16\x19\xc8\xf9A\xf45\xe3\xda7\x87\xf5\x18t\xdd*\xda\x1b\x08^\xe6y.\x1do\xb4\xc0\xb1\xdd\xc3\xe5K\x87\x0b\xbd\xd1\x06N\x06\xfc\x92T\xed\xdb\x81]\xa6\x95w\xa9\xd9\xfc7\xba\x8eH~\xc9%\x94\xff\x00fF\xb7\xff\x00\\\xdbe\n\xec\xca\x0b\x00\xe4\xee\xce\x19\xb2I=\xe9\xaf\xeb\xf0\x07\xa7\xf5\xeat\xd2x\xc3C\x89\x0b\xc9x\xe8\xa3\xab5\xbc\xa0\x7f\xe85xk\x16\x1b\xa1V\xb9T\xf3`k\x842\x02\xa3\xcbR\xa0\xb1$q\xcb\xaf\x07\x9ek\x8f\xbbk\x96\xd3u\x90[Sk ,\xfc\x93\xa8#+o\xf3\x8e\xfcn\x00\xe3\x1b+O^\xbd\xd3\xad|[f\x9a\x93\xa1\x86m2\xea#\tR\xe6]\xd2C\xf2\x84\x00\x96$\x03\xc0\x07\xa1\xa0\x0e\x8ak\xe8-\xef-md\'\xcd\xb9,#\x00u\xda2s\xe9\xc5d\xb7\x8c\xf48\xf5&\xb1\x9a\xe6XeVt\xdf-\xb4\x89\x19*H8\x90\xae\xd3\xc8#\xaf^:\xd6E\x85\xc5\xb4>,\xd34\xd5\x9e\xe2{m>\xdekx\xeef\xe4\x19\xdfk,%\xbb\xba\xc4\xa7\xaf<\xf3\xcd`_5\xdaj\xf35\x8c\xef\x1b\xc9x\x913\xcdh$\x85\x1b\xed\xec\x14|\xc3\x0cO\x98_\n\xc1\x81\x8cr(Wn\xc8}\x1b;\xad\x1b\xc5\xba&\xbfq$\x1au\xf4sJ\x8c\xe3`\xea\xc1H\x05\x87\xaa\xe4\xf5\xa2o\x16\xe9\x10G\xe6I%\xd7\x95\xbd\x93\xccK9\x9d\t\x0eS\xef*\x91\xf7\x86\x07<\xf1\xea+\xcf|\t\x06\xaa\x9a\xac\xdaQ\xd4\xe7\x8d\xe4\xb0\xb9e\x90\xc8X\x163\xa8\xf3\xbc\xb33\x80\xc7,A\xda\x9c\x93\xc3rj\x9d\xed\x93\xc9\xa6\xe8\xb1y>s\\i\xba|v\xeaV6fa3o\xc6\xf6\x07?:\xe7\x19\xff\x00k\x03\x9amh\x9fqug\xaa\x9f\x10\xe9\xc9b\xd7\x92=\xc40+\xec&kYc9\xc6~\xeb(8\xc7|b\x96\xcf_\xd3\xef\xda\xd8[\xbc\xc7\xed;\xbc\x93$\x0f\x18p\xa0\x12F\xe020\xc3\x07\xa1\xed\\\xa7\xd8n\xf4\xcf\x0c\xb5\xa4\xf0\xdfE=\xe5\xf3\xa5\xbc\x16\x92E\x19;\x90\xe07\xcd\xb4/\xcax\x06\x99\xe1\xc1$:\xb6\x8fe8\xbdK\x9b\x11-\xb4\xf1\xddJ\xae\x15\x84\x117\xc8T\x91\xb7\x0e)\x01\xda_j\xf6:d\x88\x97\x93\xf9%\xd1\xddK)\xc1\x082\xc0\x1cc8\xc9\xc7R\x01\xc0\xe0\xd5(\xfcW\xa4\xc9,q\x86\xbdC#\xa4j\xd2i\xf3\xa2\xeer\x02\x82\xcc\x80\x0c\x92\x00\xc9\xefX^/\xd4c\x8a\xdd.\x97T\xcd\x85\xe5\x95\xca\x88\xd8\xa7\x94H\x88\xed*q\xbb$\x9f_\xc2\xb9\xabr\x06\xbc\xdf\xbc\x1ed\xb7\x96\xe1\xd3\xb8\xf2\xaf!C\x91\xe6\x12\xb9/\xc6G8\xe3\x14\x01\xe8\xef\xe2=!d\xb8\x89o\x16Y\xad\xf3\xe6\xc5\x02\xb4\xb2.\x18)\xf9T\x12pH\x07\x03\x8a\x93N\xd6\xecuY\xe6\x82\xd5\xe6\xf3aUy\x12ky"!X\x90\xa7\x0e\xa3 \xedn\x9e\x86\xbc\xfa\xe2\xea\xda\xe2{\xed>;\xc8\x04\xe6=V\x19S%\xcca\xee\xe3\xe1\x95\x01a\x95\xce8\xae\x87\xc3\xda\x8d\xd5\xcf\x8a\xae^u\xb6e\xbd\xb5,\xad\x0f\x98\x0c~IA\xb4\x87U<\xf9\xc4\xe6\x80:\x1dO\\\xd34c\x00\xd4/a\xb7\xf3\xdc"y\x8e\x17\'\xd7\x9e\xdd9\xed\x91U\x1f\xc6>\x1c\x8e\xf9l\xdb\\\xd3\xc4\xa5X\xff\x00\xc7\xca`\x15 \x15\'<6ON\xbc\x1fJ\xc7\xf1\xeb\xde\x85\xd3\xe1\xb3\x95\xd0\xdd;[0KV\x94\xb0q\xf3c\x0e\xb8!C0\xe0\x9f\x97\x829\xae^\xf6\xefR\x8f\xc6P\xac\xb3O\xe6oh\xcd\xda]\xbcp\xc7\xbaH\x0e\xd2\x9c\xed\x18*\xa5rF]rx\xa0\x0fJ\x97_\xd2`\xbe6R\xea6\xc9t\xb9\xccM \x0c07t\xfasQ\xe9^$\xd25\xb9\x0cv\x17\xb1\xcb(\xde|\xb0~b\xaa\xdbKc\xfb\xb9\xc6\x0f\xa1\x1e\xb5\xcb\xf8\x9a\xe1\xbf\xe1*\x8e\xc2{\xe4\xfb\x1f\x95-\xd02p-\xe50I\x1a\xa360\x15\x81w\x19\xe7(\xde\xa2\x99\xe1\x8b\xc0\xba\xe5\x91\xdbo*H\x8dj\x86\xda\xecJ\xb11\x8c;\x921\xfcF\x10x\xc0\x1e\x99$\xd0\x07\xa0QP\xc1wmt\xd2\xad\xbd\xc42\xb4M\xb2A\x1b\x86(\xde\x87\x1d\rI,\xb1\xc3\x13\xcb+\xacq\xa0,\xce\xc7\x01@\xeaI\xed@\x0e\xa2\xa3\x82xnaI\xa0\x95%\x89\xc6U\xe3`\xca\xc3\xd8\x8e\xb4\xdb\x9b\xbbk5F\xba\xb8\x86\x05v\x08\xa6W\n\x19\x8f@3\xde\x80&\xa2\x8a\x84\xdd\xdb-\xda\xda\x1b\x88E\xcb.\xf1\tq\xbc\xaf\xae\xde\xb8\xa0\t\xa8\xa2\xa1\x82\xee\xda\xe9\xa5[{\x88eh\x9bd\x827\x0cQ\xbd\x0e:\x1a\x00\x9a\x8al\xb2\xc7\x0cO,\xae\xb1\xc6\x80\xb3;\x1c\x05\x03\xa9\'\xb56\t\xe1\xb9\x85&\x82T\x96\'\x19W\x8d\x83+\x0fb:\xd0\x04\x94QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00\x14QE\x00g\xb6\x89b\xfa\x89\xbex\x8bO\xe7,\xdc\xb9\xdb\xbdS`8\xe9\xc0?\xd6\xac[\xd9\xc3k-\xd4\xb1)\x0fs/\x9d)\'9m\xaa\x99\xf6\xe1\x16\x8a(\x03.O\x08\xe8\xb2\xc3k\x0b\xdbHR\xd5\xa5x\x80\x9eE\xc1\x91\xb7?!\x819>\xb5\x7fK\xd2\xac\xf4k?\xb2X\xc6\xd1\xc3\xe6<\x9bY\xd9\xce\xe6%\x89\xc9$\xf5&\x8a(\x07\xa8\xcdKF\xb6\xd5^#t\xf7\x068\xd87\x94\x932#\x90\xc1\x86\xe5\x07\xe6\xe4\x0e\xb5jkXn\x03\xefO\x99\xa31\x99\x14\xedp\xa7\xa8\x0c9\x1f\x81\xa2\x8a\x00\xac\x9a&\x9b\x1e\x9d\x0e\x9f\x1d\x9cik\x0b\xac\x91\xc6\x9cme`\xc1\xb29\xceFs\xdf\xbfZ\xafw\xe1}\x1a\xfe4\x8e\xf2\xc9n#G\x96EIX\xb2\x87\x90\xeef\x00\x9f\xbd\x92pz\xaeN1E\x14\x00i\xbe\x1a\xd3\xb4\x9b\xbf\xb4\xda\x9b\xdf3iLM}4\xab\x8f\xf7]\xc8\xfd*!\xe1\r\x14\xc7\x0cr\xdb<\xe9\x04k\x1c\x0b4\xce\xc2\x10\x00\x00\xa0\xce\x15\xb8\xfb\xc3\x07\xde\x8a(\x02I<3\xa7\xcfh\xb6\xb7\x06\xee\xe2\x14\x98L\x82k\xb9\x1c\xab\x00@\xc3\x16\xdd\x8eOz\x88xCG@|\xa8\xeeao8\xce\x1e+\xa9Q\xc3\x14T?0l\xe0\xaa\xa8\xc6q\xc5\x14P\x05\xa9\xbc=\xa4\xdci\xf6\xf62\xd9F\xf6\xf6\xf1\xf9P\xa9\xc9(\x98\x00\x80z\xf2\x06\x0f\xa8\xcez\x9a\x92\xf3G\xb3\xbe\x9e\xdeY\x91\xb3\x04\xa2P\x11\xca\x86`C)`>\xf6\x08\x04g\xb8\xa2\x8a\x00\xb3\x1d\xa5\xb4/\xbe+x\x91\xf2\xe7r\xa0\x07\xe6;\x9b\xf3<\x9fSU,tKK\x0b\xb9.\xe3k\x89n$]\x86K\x8b\x87\x94\x85\xcev\x8d\xc4\xe0g\xd2\x8a(\x02\xc4\x966\xf2\xdf\xc3{"\x16\x9e\x05e\x88\x968]\xddH\x1d3\x8e3\xd7\x19\x1d\xea\xb3h\x1ac\x80\xa6\xce?(C,\x06,|\x85$eg\xc8\xeeIPs\xf5\xa2\x8a\x00\xb1\x16\x9bg\x0bL\xc9n\x9b\xa6\x94L\xe5\x86\xe2\\\x00\x01\xe7\xd0(\xc7\xa68\xa6\x1d.\xdd\xb5A\xa8\xbbL\xf3\xa8"0\xd2\xb1H\xf20J\xaep\t\x1d\xf1\xeb\xeah\xa2\x80\x12\xc3I\xb5\xd3e\x9aKp\xfb\xa5\x01N\xf7-\xb5Ab\x14g\xa0\x05\xd8\xfe?J\xb1wk\x15\xf5\xa4\x96\xd3\x82c\x90`\xe0\x90~\xa0\x8e\x86\x8a(\x01\xb6VqXZ\x8bxw\x15\x0c\xceK\xb6K31f$\xfa\x92I\xfcj\x1dOI\xb5\xd5\xa3X\xee\x83\xe1C\x0f\x91\xca\xe5Xa\x94\xe3\xb1\x1c\x1a(\xa0\x0b\xd5E\xb4\x9bW\xd5\x13Q!\xfc\xe5;\x80\xdev\xee\nT6=v\xb3\x0f\xc7\xe9E\x14\x01z\xa8\xd8i6\xbal\xb3In\x1ft\xa0)\xde\xe5\xb6\xa8,B\x8c\xf4\x00\xbb\x1f\xc7\xe9E\x14\x01b\xee\xd6+\xebI-\xa7\x04\xc7 \xc1\xc1 \xfdA\x1d\r6\xca\xce+\x0bQo\x0e\xe2\xa1\x99\xc9v\xc9ff,\xc4\x9fRI?\x8d\x14P\x05\x8a(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80\n(\xa2\x80?\xff\xd9'

4.4.4 如何看到图片呢?

from PIL import Image
im = Image.open('评论信息/76936090/39018468.jpg')
im.show() # show完之后会新打开一个窗口 显示图片的内容

4.4.5 单独测试看图片的内容

4.4.5.1 单个文字
image = get_file_content('评论信息/76936090/39018468.jpg')
tag1 = client.basicGeneral(image, options)
tag1
{'log_id': 6412010709116467009,
 'words_result': [{'words': '价格可以随便乱调吗辣'}],
 'words_result_num': 1}
tag1['words_result'][0]['words']
'价格可以随便乱调吗辣'
4.4.5.2 多文字
image = get_file_content('评论信息/83588699/50366237.jpg')
tag2 = client.basicGeneral(image, options)
tag2 
{'log_id': 4713844365475263073,
 'words_result': [{'words': '招牌挺文艺小清新的不知道为什么没人拍过来'},
  {'words': '这家有瘦肉丸卤味啊盖浇饭这些'},
  {'words': '点了瘦肉丸挺好吃的肉没有添加剂的味道还不错的'},
  {'words': '打包了鸭骨架老板还贴心的给切成块味道也很好'},
  {'words': '尤其是酱油醋很好吃'},
  {'words': '就在新城那个叫什么源路的贝贝佳对面门面有点小但是仔细看不会错过的'},
  {'words': '收起评论入'}],
 'words_result_num': 7}
im2 = Image.open('评论信息/83588699/50366237.jpg')
im2.show() # show完发现评论是有多行的 所以根据这个API调用是一行一行的解析 并存储
for i in range(len(tag2['words_result'])):
    print(tag2['words_result'][i]['words'])
招牌挺文艺小清新的不知道为什么没人拍过来
这家有瘦肉丸卤味啊盖浇饭这些
点了瘦肉丸挺好吃的肉没有添加剂的味道还不错的
打包了鸭骨架老板还贴心的给切成块味道也很好
尤其是酱油醋很好吃
就在新城那个叫什么源路的贝贝佳对面门面有点小但是仔细看不会错过的
收起评论入

结论:

  • 可以看到返回的是一个字典,然后针对单个文字以及多文字的时候得采用不同的方式
  • 多文字的时候得进行一个循环遍历所有的评论 然后拼接起来 这是一个坑!之前就是不清楚的!所以会发现,诶,评论为啥是不全的!所以还是得深入的了解到数据结构!要知道返回的结果是啥!

4.5 批量的去转图片为文字,并且存在数据框里

思路:

  • 方法还是上面单个测试的一样,但得需要新增两部分,也就是读取图片 + 存储到数据框的部分
  • 读取图片:进行一个循环遍历即可!

步骤:

  1. 遍历每一个文件夹 然后对文件夹下面的图片做转换
  2. 由于原来是形成一个字典 最后再形成数据框 现在估计这样够呛了 每次一个文件夹内转完就形成一个数据框 最后合并起来
  3. 这样每次就都定义一个新的空的字典
  4. 同时多加一列:商户号 最后再添加,先增加每一行都不一样的内容,最后再增加所有的!都是这个思路
  5. 定义一个空列表 用来存放每一个商户的三列信息

合理避坑:

  • 就是注意mac会出现那个啥’.DS_Store’ 所以先把这个给排除掉
  • 注意区分continue和break
# 读取评论信息下面所有文件夹的名称
mer_folds = os.listdir('./评论信息/')

comment_dp = []
t0_all = time.time()

for i in range(0, len(mer_folds)):

    fold = mer_folds[i]

    print('正在转换第 %d 个商家' % (i+1))
    t0 = time.time()
    # 定义一个空的字典 用来存放图片名称+转换后文字的内容
    image_tag = {}
    # 定位到某一商户对应的所有评论信息图片的文件夹里面
    if fold == '.DS_Store':
        continue
    else:
        pics = os.listdir('./评论信息_补充/' + str(fold))
        for pic in pics:
            # 针对mac系统的隐藏文件
            if pic == '.DS_Store':
                continue
            else:
            # 遍历某一商户下所有图片
                print('正在转换商家 %s 评论图片: %s' % (fold, pic))
                try:
                    image = get_file_content('./评论信息_补充/' + str(fold) + '/' + str(pic))
                    tag = client.basicGeneral(image, options)
                    # 先定义一个空的字符 用于后面的拼接
                    comments = ''
                    # 进行判断 如果只识别出一个来 就直接赋值
                    if tag['words_result_num'] == 1:
                        image_tag[pic] = tag['words_result'][0]['words']
                    # 如果不止一个 进行循环 然后拼接评论
                    else:
                        for i in range(tag['words_result_num']):
                            comments = comments + tag['words_result'][i]['words'] + ' '
                        image_tag[pic] = comments

                    time.sleep(1)
                except Exception as e:
                    print('报错信息为: ', e)
      

    # 此时一个商家的图片全部转换ok
    t1 = time.time()
    print('点评商家 %s 所有评论图片转换完毕, 所需时间为 %.2f s' % (str(fold), (t1 - t0)))
    # 先把这部分数据给存起来 形成数据框
    a = []
    b = []
    for k,v in image_tag.items():
        a.append(k)
        b.append(v)
    y = pd.DataFrame({
        '点评评论截图名称':a,
        '百度识别评论结果':b
    })
    y['商户号'] = fold
    comment_dp.append(y)
    
    # else:
    #     break

# 输出所有的信息
comment_dp_pd = pd.concat(comment_dp, axis=0)
comment_dp_pd.to_csv('大众点评评论图片转文字结果.csv', encoding = 'utf-8', index = False, quoting = 1)

t1_all = time.time()
print('点评全部评论图片转换完毕,所需时间为 %.2f s' % (t1_all - t0_all))
正在转换商家 76936090 评论图片: 39018468.jpg
点评商家 76936090 所有评论图片转换完毕, 所需时间为 3.30 s
正在转换商家 23060131 评论图片: 428069809.jpg
正在转换商家 23060131 评论图片: 47855114.jpg
正在转换商家 23060131 评论图片: 812661193.jpg
正在转换商家 23060131 评论图片: 752038273.jpg
正在转换商家 23060131 评论图片: 54695934.jpg
正在转换商家 23060131 评论图片: 859952667.jpg
正在转换商家 23060131 评论图片: 113265168.jpg
正在转换商家 23060131 评论图片: 753526276.jpg
点评商家 23060131 所有评论图片转换完毕, 所需时间为 14.83 s
正在转换商家 66264063 评论图片: 19590086.jpg
正在转换商家 66264063 评论图片: 189696824.jpg
正在转换商家 66264063 评论图片: 776797215.jpg
正在转换商家 66264063 评论图片: 52339564.jpg
正在转换商家 66264063 评论图片: 980002346.jpg
正在转换商家 66264063 评论图片: 756204408.jpg
正在转换商家 66264063 评论图片: 812438020.jpg
正在转换商家 66264063 评论图片: 177743748.jpg
点评商家 66264063 所有评论图片转换完毕, 所需时间为 13.74 s
正在转换商家 95358955 评论图片: 25910563.jpg
点评商家 95358955 所有评论图片转换完毕, 所需时间为 1.54 s
点评全部评论图片转换完毕,所需时间为 33.41 s

5 封装成函数

def PicToText(dir):
    # dir参数为照片存放的文件夹
    
    # 读取评论信息下面所有文件夹的名称
    mer_folds = os.listdir(dir)

    comment_dp = []
    t0_all = time.time()

    for i in range(0, len(mer_folds)):

        fold = mer_folds[i]

        print('正在转换第 %d 个商家' % (i+1))
        t0 = time.time()
        # 定义一个空的字典 用来存放图片名称+转换后文字的内容
        image_tag = {}
        # 定位到某一商户对应的所有评论信息图片的文件夹里面
        if fold == '.DS_Store':
            continue
        else:
            pics = os.listdir(dir + str(fold))
            for pic in pics:
                # 针对mac系统的隐藏文件
                if pic == '.DS_Store':
                    continue
                else:
                # 遍历某一商户下所有图片
                    print('正在转换商家 %s 评论图片: %s' % (fold, pic))
                    try:
                        image = get_file_content(dir + str(fold) + '/' + str(pic))
                        tag = client.basicGeneral(image, options)
                        # 先定义一个空的字符 用于后面的拼接
                        comments = ''
                        # 进行判断 如果只识别出一个来 就直接赋值
                        if tag['words_result_num'] == 1:
                            image_tag[pic] = tag['words_result'][0]['words']
                        # 如果不止一个 进行循环 然后拼接评论
                        else:
                            for i in range(tag['words_result_num']):
                                comments = comments + tag['words_result'][i]['words'] + ' '
                            image_tag[pic] = comments

                        time.sleep(1)
                    except Exception as e:
                        print('报错信息为: ', e)


        # 此时一个商家的图片全部转换ok
        t1 = time.time()
        print('点评商家 %s 所有评论图片转换完毕, 所需时间为 %.2f s' % (str(fold), (t1 - t0)))
        # 先把这部分数据给存起来 形成数据框
        a = []
        b = []
        for k,v in image_tag.items():
            a.append(k)
            b.append(v)
        y = pd.DataFrame({
            '点评评论截图名称':a,
            '百度识别评论结果':b
        })
        y['商户号'] = fold
        comment_dp.append(y)

        # else:
        #     break

    # 输出所有的信息
    comment_dp_pd = pd.concat(comment_dp, axis=0)
    comment_dp_pd.to_csv('大众点评评论图片转文字结果.csv', encoding = 'utf-8', index = False, quoting = 1)

    t1_all = time.time()
    print('点评全部评论图片转换完毕,所需时间为 %.2f s' % (t1_all - t0_all))
    return comment_dp_pd
# 只要加一个参数-文件夹路径即可!
PicToText('评论信息')

6 总结

  • 上述代码可以实现批量的从图片转为文字(调用百度云API接口),并且形成一个数据框,以供进行后续的分析
  • 读入图片的函数 get_file_content
  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值