python 怎么调用 谷歌的analyzeentities api

Python015

python 怎么调用 谷歌的analyzeentities api,第1张

介绍

我们每个人或多或少都会使用到名片。但是如果名片数量一大,管理它们就显得非常麻烦。因此我产生用这篇文章的案例来管理他们。

这里,我先用手机对每张名片拍照,并按以下流程进行处理:

把获得的名片图像交给我们的应用程序,抽取人名,公司名称,地址等信息。这里我使用了Google Vision API 和 自然语言(Natural Language )API,因为这两个API简单易用,并且性能也很不错。

我使用Python来编写我的这个应用程序,来调用 Google Vision API 和 Natural Language API。

创建步骤

第 0 步: 准备

第 1 步: 用Google Vision API识别文本

第 2 步: 用Natural Language API抽取人名,公司名称及地址信息

第 3 步: 整合第1和第2步

第0步 准备

在开始应用程序编写之前,我们要安装必要的类库,下载配置以及设置API的键值。从这个链接你能设置 Google API key 。

安装类库

执行一下命令行来安装类库。

$ pip install requests

$ pip install pyyaml

下载资源库

这里我已经事先准备好了资源库。也可以从下面的链接下载。

下载

设置API Key

把Google API key 写进配置文件 (plugins/config/google.yaml).

首先,打开 google.yaml 把你的API key替换掉 xxx。

token: xxx

第1步 用Google Vision API识别文本

Vision API 简介

依靠强大的机器学习模型,谷歌 Vision API 能让你编写自己的图像识别应用程序。Vision API 有以下的功能:

图像分类 (例如 “快艇” “狮子” “埃菲尔铁塔” 等等)

脸部识别

文本识别

标志识别

地标识别

安全搜索识别

Vision API 每月有1000个免费请求。

编写脚本

这里我们编写Python脚本来使用 Vision API。把以下代码保存为plugins/apis/vision.py。 这里我们要使用UTF-8编码。

# -*- coding: utf-8 -*-

import base64

import requests

def detect_text(image_file, access_token=None):

   with open(image_file, 'rb') as image:

       base64_image = base64.b64encode(image.read()).decode()

   url = 'hogleapis.com/v1/images:annotate?key={}'.format(access_token)

   header = {'Content-Type': 'application/json'}

   body = {

       'requests': [{

           'image': {

               'content': base64_image,

           },

           'features': [{

               'type': 'TEXT_DETECTION',

               'maxResults': 1,

           }]

       }]

   }

   response = requests.post(url, headers=header, json=body).json()

   text = response['responses'][0]['textAnnotations'][0]['description'] if len(response['responses'][0]) >0 else ''

   return text

输入图像文件路径和API key到detect_text 函数, 我们就能得到图像文件中的文本信息

运行脚本

首先,把脚本文件移入 plugins/tests 文件夹。其中已经有一个test_vision.py 文件。在test_vision.py中, 编写调用detect_text 函数的测试用例。如果运行正常,我们就能获取图像中的文本信息了。

用下面 example_en.png这张名片作为输入,运行脚本。

$ python test_vision.py data/example_en.png

输出结果

John Smith.

Capsule Corporation

217-767-8187

1332 Spring Street Elwin Illinois

第 2 步用Natural Language API抽取人名,公司名称及地址信息

Natural Language API简介

Natural Language API 提供了强大的机器学习模型,以REST API 的形式识别文本结构和其中的含义。Natural Language API 有一下功能:

实体识别 (如,个人姓名,机构名称,事件信息等)

语意分析 (产品评论中的情感,客户意见等)

语法分析

Vision API 每月有5000个免费请求。

运行脚本

同样我们编写Python脚本来调用Natural Language API. 保存脚本为plugins/apis/language.py。注意使用UTF-8编码。

# -*- coding: utf-8 -*-

import requests

def extract_entities(text, access_token=None):

   url = 'htoogleapis.com/v1beta1/documents:analyzeEntities?key={}'.format(access_token)

   header = {'Content-Type': 'application/json'}

   body = {

       "document": {

           "type": "PLAIN_TEXT",

           "language": "EN",

           "content": text

       },

       "encodingType": "UTF8"

   }

   response = requests.post(url, headers=header, json=body).json()

   return response

def extract_required_entities(text, access_token=None):

   entities = extract_entities(text, access_token)

   required_entities = {'ORGANIZATION': '', 'PERSON': '', 'LOCATION': ''}

   for entity in entities['entities']:

       t = entity['type']

       if t in required_entities:

           required_entities[t] += entity['name']

   return required_entities

把文本数据和API key 以参数形式传入 extract_entities 函数, 不同的实体信息就能被提取出来。而我们只需要 公司名称, 个人姓名, 地点信息 。extract_required_entities 函数就是用来筛选出这些需要的内容。

运行脚本

同样,把脚本文件移入plugins/tests 文件夹。我们会看到一个test_language.py 文件。在test_language.py中,编写调用 extract_required_entities 函数的测试用例。

这里我用准备好的 example_en.txt文本文件作为输入运行脚本。在example_en.txt 文本文件中包含了上一步的输出结果。

$ python test_language.py data/example.txt

输出结果

{'LOCATION': 'Spring Street Elwin Illinois', 'PERSON': 'John Smith', 'ORGANIZATION': 'Capsule Corporation'}

Step 3 整合第1和第2步I

最后,我们再编写另一个脚本整合 Vision API 和 Natural Language API。

编写脚本

编写脚本整合 Vision API 和 Natural Language API. 保存为 plugins/apis/integration.py。这里我们要使用UTF-8编码。

# -*- coding: utf-8 -*-

from .language import extract_required_entities

from .vision import detect_text

def extract_entities_from_img(img_path, access_token):

   text = detect_text(img_path, access_token)

   entities = extract_required_entities(text, access_token)

   return entities

通过把图像文件路径和API key 作为参数输入 extract_entities_from_img ,就能从名片图像中提取出以上提到的信息数据了。

运行脚本

首先,把脚本文件移入plugins/tests 文件夹。其中已经存在一个test_integration.py文件。在test_integration.py中编写调用extract_entities_from_img 的测试用力。

用图像文件 example_en.png作为输入数据运行脚本。

$ python test_integration.py data/example_en.png

输出结果

{'LOCATION': 'Spring Street Elwin Illinois', 'PERSON': 'John Smith', 'ORGANIZATION': 'Capsule Corporation'}

结论

以上我们用 Google Vision API 和 Natural Language API编写了一个简单的提取名片信息的应用程序。然而,这只是个简单的原型,之后我还会对它进行改进,让它更加完善。

结合本段时间学习的python知识,完成了一个个人名片管理系统,该系统包括菜单项:

1、新建名片

包括个人姓名、年龄、电话号码三个信息

2、显示名片

3、查询名片

0、退出系统

该系统会一直循环提示输入,直至关闭程序或者按照提示退出系统

菜单界面如下:

创建名片界面:

显示名片界面:

查询界面:

退出界面:

Python图片文本识别使用的工具是PIL和pytesser。因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxy

pytesser是OCR开源项目的一个模块,在Python中导入这个模块即可将图片中的文字转换成文本。pytesser调用了tesseract。当在Python中调用pytesser模块时,pytesser又用tesseract识别图片中的文字。pytesser的使用步骤如下:

首先,安装Python2.7版本,这个版本比较稳定,建议使用这个版本。

其次,安装pythoncv。

然后,安装PIL工具,pytesser的使用需要PIL库的支持。

接着下载pytesser

最后,将pytesser解压,这个是免安装的,可以将解压后的文件cut到Python安装目录的Lib\site-packages下直接使用,比如我的安装目录是:C:\Python27\Lib\site-packages,同时把这个目录添加到环境变量之中。

完成以上步骤之后,就可以编写图片文本识别的Python脚本了。参考脚本如下:

from pytesser import *

import ImageEnhance

image = Image.open('D:\\workspace\\python\\5.png')

#使用ImageEnhance可以增强图片的识别率

enhancer = ImageEnhance.Contrast(image)

image_enhancer = enhancer.enhance(4)

print image_to_string(image_enhancer)

tesseract是谷歌的一个对图片进行识别的开源框架,免费使用,现在已经支持中文,而且识别率非常高,这里简要来个helloworld级别的认识

下载之后进行安装,不再演示。

在tesseract目录下,有个tesseract.exe文件,主要调用这个执行文件,用cmd运行到这个目录下,在这个目录下同时放置一张需要识别的图片,这里是123.jpg

然后运行:tesseract 123.jpg result

会把123.jpg自动识别并转换为txt文件到result.txt

但是此时中文识别不好

然后找到tessdata目录,把eng.traineddata替换为chi_sim.traineddata,并且把chi_sim.traineddata重命名为eng.traineddata

ok,现在中文识别基本达到90%以上了