python 微信bot_我做了一个Python Bot,可以解决任何给定图像中的多项选择问题。 码]...
python 微信bot
在這篇文章中,我將向您展示如何使用Python構建自己的答案查找系統。 基本上,這種自動化可以從圖片中找到多項選擇題的答案。
一件事很清楚,在考試期間不可能在互聯網上搜索問題,但是當考官轉過頭來時,我可以快速拍照。 那是算法的第一部分。 我不知何故需要從圖片中提取問題。
似乎有很多服務可以提供文本提取工具,但是我需要某種API來解決此問題。 最后,Google的Vision API是我正在尋找的確切工具。 很棒的是,每月前1000個API調用是免費的,這對我來說足以測試和使用該API。
視覺人工智能
首先,創建Google Cloud帳戶,然后在服務中搜索Vision AI 。 使用Vision AI,您可以執行諸如為圖像分配標簽以組織圖像,獲取推薦的裁切頂點,檢測著名的風景或地方,提取文本等操作。
查看文檔以啟用和設置API。 配置后,您必須創建JSON文件,其中包含您的計算機上的密鑰下載。
運行以下命令以安裝客戶端庫:
pip install google-cloud-vision然后通過設置環境變量GOOGLE_APPLICATION_CREDENTIALS為您的應用程序代碼提供身份驗證憑據。
import os, io from google.cloud import vision from google.cloud.vision import types# JSON file that contains your key os.environ[ 'GOOGLE_APPLICATION_CREDENTIALS' ] = 'your_private_key.json'# Instantiates a client client = vision.ImageAnnotatorClient()FILE_NAME = 'your_image_file.jpg'# Loads the image into memory with io.open(os.path.join(FILE_NAME), 'rb' ) as image_file:content = image_file.read()image = vision.types.Image(content=content)# Performs text detection on the image file response = client.text_detection(image=image) print(response)# Extract description texts = response.text_annotations[ 0 ] print(texts.description)運行代碼時,您將看到JSON格式的響應,其中包括檢測到的文本的規范。 但是我們只需要純描述,因此我從響應中提取了這部分。
在Google上搜索問題
下一步是在Google上搜索問題部分以獲取一些信息。 我使用正則表達式庫從描述中提取問題部分(響應)。 然后,我們必須對提取的問題部分進行批處理才能進行搜索。
import re import urllib# If ending with question mark if '?' in texts.description:question = re.search( '([^?]+)' , texts.description).group( 1 )# If ending with colon elif ':' in texts.description:question = re.search( '([^:]+)' , texts.description).group( 1 ) # If ending with newline elif '\n' in texts.description:question = re.search( '([^\n]+)' , texts.description).group( 1 )# Slugify the match slugify_keyword = urllib.parse.quote_plus(question) print(slugify_keyword)檢索信息
我們將使用BeautifulSoup抓取前3個結果以獲取有關該問題的一些信息,因為答案可能位于其中一個中。
此外,如果您要從Google的搜索列表中抓取特定數據,請不要使用inspect元素來查找元素的屬性,而應打印整個頁面以查看屬性,因為它與實際頁面有所不同。
我們需要對搜索結果中的前3個鏈接進行爬網,但是這些鏈接確實被弄亂了,因此獲取用于爬網的干凈鏈接很重要。
/url?q=https://en.wikipedia.org/wiki/IAU_definition_of_planet&sa=U&ved=2ahUKEwiSmtrEsaTnAhXtwsQBHduCCO4QFjAAegQIBBAB&usg=AOvVaw0HzMKrBxdHZj5u1Yq1t0en如您所見,實際鏈接位于q =和&sa之間。 通過使用Regex,我們可以獲得此特定字段或有效的URL。
result_urls = []def crawl_result_urls () :req = Request( 'https://google.com/search?q=' + slugify_keyword, headers={ 'User-Agent' : 'Mozilla/5.0' }) html = urlopen(req).read()bs = BeautifulSoup(html, 'html.parser' )results = bs.find_all( 'div' , class_= 'ZINbbc' )try :for result in results:link = result.find( 'a' )[ 'href' ]# Checking if it is url (in case)if 'url' in link:result_urls.append(re.search( 'q=(.*)&sa' , link).group( 1 ))except (AttributeError, IndexError) as e:pass在我們抓取這些URL的內容之前,讓我向您展示使用Python的問答系統。
問答系統
那是算法的主要部分。 從前3個結果中檢索信息后,程序應通過迭代文檔來檢測答案。 首先,我認為最好使用相似性算法來檢測與問題最相似的文檔,但是我不知道如何實現它。
經過數小時的研究,我在Medium中找到了一篇文章,解釋了Python的問答系統。 它易于使用的python軟件包可對您自己的私有數據實施質量檢查系統。 您可以從此處檢查更多說明
首先安裝該軟件包:
pip install cdqa我正在使用下面的示例代碼塊中包含的下載功能來手動下載經過預訓練的模型和數據:
import pandas as pd from ast import literal_evalfrom cdqa.utils.filters import filter_paragraphs from cdqa.utils.download import download_model, download_bnpp_data from cdqa.pipeline.cdqa_sklearn import QAPipeline# Download data and models download_bnpp_data(dir= './data/bnpp_newsroom_v1.1/' ) download_model(model= 'bert-squad_1.1' , dir= './models' )# Loading data and filtering / preprocessing the documents df = pd.read_csv( 'data/bnpp_newsroom_v1.1/bnpp_newsroom-v1.1.csv' , converters={ 'paragraphs' : literal_eval}) df = filter_paragraphs(df)# Loading QAPipeline with CPU version of BERT Reader pretrained on SQuAD 1.1 cdqa_pipeline = QAPipeline(reader= 'models/bert_qa.joblib' )# Fitting the retriever to the list of documents in the dataframe cdqa_pipeline.fit_retriever(df)# Sending a question to the pipeline and getting prediction query = 'Since when does the Excellence Program of BNP Paribas exist?' prediction = cdqa_pipeline.predict(query)print( 'query: {}\n' .format(query)) print( 'answer: {}\n' .format(prediction[ 0 ])) print( 'title: {}\n' .format(prediction[ 1 ])) print( 'paragraph: {}\n' .format(prediction[ 2 ]))他的輸出應如下所示:
它打印確切的答案和包含答案的段落。
基本上,當從圖片中提取問題并將其發送到系統時,檢索器將從抓取的數據中選擇最有可能包含答案的文檔列表。 如前所述,它計算問題與爬網數據中每個文檔之間的余弦相似度。
選擇最有可能的文檔后,系統將每個文檔分為幾段,并將其與問題一起發送給讀者,
這基本上是一種預先訓練的深度學習模型。 使用的模型是著名的NLP模型BERT的Pytorch版本。
然后,閱讀器輸出在每個段落中可以找到的最可能的答案。 在閱讀器之后,系統中的最后一層通過使用內部得分函數比較答案,并根據得分輸出最有可能的答案,這將成為我們的答案。
題。
這是系統機制的架構。
您必須以特定的結構設置數據幀(CSV),以便可以將其發送到cdQA管道。
但實際上我使用PDF轉換器從
PDF文件目錄。 因此,我將為每個結果將所有已爬網的數據保存在pdf文件中。 希望我們總共有3個pdf文件(也可以是1個或2個)。 此外,我們需要命名這些pdf文件,這就是為什么我抓取每個頁面的標題的原因。
好吧,如果我總結一下算法,它將提取圖片中的問題,在google上搜索,抓取前3個結果,從抓取的數據中創建3個pdf文件,最后使用問題回答系統找到答案。
如果您想查看它的工作方式,請檢查一下我制作的機器人,該機器人可以解決圖片中的考試問題
這是完整代碼:
import os, io import errno import urllib import urllib.request import hashlib import re import requests from time import sleep from google.cloud import vision from google.cloud.vision import types from urllib.request import urlopen, Request from bs4 import BeautifulSoup import pandas as pd from ast import literal_eval from cdqa.utils.filters import filter_paragraphs from cdqa.utils.download import download_model, download_bnpp_data from cdqa.pipeline.cdqa_sklearn import QAPipeline from cdqa.utils.converters import pdf_converterresult_urls = []os.environ[ 'GOOGLE_APPLICATION_CREDENTIALS' ] = 'your_private_key.json'client = vision.ImageAnnotatorClient()FILE_NAME = 'your_image_file.jpg'with io.open(os.path.join(FILE_NAME), 'rb' ) as image_file:content = image_file.read()image = vision.types.Image(content=content)response = client.text_detection(image=image)texts = response.text_annotations[ 0 ] # print(texts.description)if '?' in texts.description:question = re.search( '([^?]+)' , texts.description).group( 1 )elif ':' in texts.description:question = re.search( '([^:]+)' , texts.description).group( 1 )elif '\n' in texts.description:question = re.search( '([^\n]+)' , texts.description).group( 1 )slugify_keyword = urllib.parse.quote_plus(question) # print(slugify_keyword)def crawl_result_urls () :req = Request( 'https://google.com/search?q=' + slugify_keyword, headers={ 'User-Agent' : 'Mozilla/5.0' }) html = urlopen(req).read()bs = BeautifulSoup(html, 'html.parser' )results = bs.find_all( 'div' , class_= 'ZINbbc' )try :for result in results:link = result.find( 'a' )[ 'href' ]print(link)if 'url' in link:result_urls.append(re.search( 'q=(.*)&sa' , link).group( 1 ))except (AttributeError, IndexError) as e:passdef get_result_details (url) :try :req = Request(url, headers={ 'User-Agent' : 'Mozilla/5.0' })html = urlopen(req).read()bs = BeautifulSoup(html, 'html.parser' )try :title = bs.find(re.compile( '^h[1-6]$' )).get_text().strip().replace( '?' , '' ).lower()# Set your path to pdf directoryfilename = "/path/to/pdf_folder/" + title + ".pdf"if not os.path.exists(os.path.dirname(filename)):try :os.makedirs(os.path.dirname(filename))except OSError as exc:if exc.errno != errno.EEXIST:raisewith open(filename, 'w' ) as f:for line in bs.find_all( 'p' )[: 5 ]:f.write(line.text + '\n' )except AttributeError:passexcept urllib.error.HTTPError:passdef find_answer () :# Set your path to pdf directorydf = pdf_converter(directory_path= '/path/to/pdf_folder/' )cdqa_pipeline = QAPipeline(reader= 'models/bert_qa.joblib' )cdqa_pipeline.fit_retriever(df)query = question + '?'prediction = cdqa_pipeline.predict(query)# print('query: {}\n'.format(query))# print('answer: {}\n'.format(prediction[0]))# print('title: {}\n'.format(prediction[1]))# print('paragraph: {}\n'.format(prediction[2]))return prediction[ 0 ]crawl_result_urls()for url in result_urls[: 3 ]:get_result_details(url)sleep( 5 )answer = find_answer() print( 'Answer: ' + answer)有時可能會造成混淆,但我認為通常是可以的。 至少我可以通過60%的正確答案通過考試:D
好了,開發人員! 請在評論中告訴我您對此有何看法? 實際上,最好一次遍歷所有問題,所以我不需要為每個問題拍照。 但是很不幸,我沒有足夠的時間來做,所以最好下次再保存。
檢查反向Python 以獲得更酷的內容。
我的YouTube頻道
參考文獻:
如何使用python輕松創建自己的問答系統
保持聯系!
翻譯自: https://hackernoon.com/i-made-a-python-bot-that-can-solve-multiple-choice-question-from-any-given-image-incl-code-3lsy36nm
python 微信bot
總結
以上是生活随笔為你收集整理的python 微信bot_我做了一个Python Bot,可以解决任何给定图像中的多项选择问题。 码]...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Impinj阅读器与PC连接
- 下一篇: 英雄联盟LOL虚拟机 版本更新出现 游戏