Bir "Google arama" sistemi oluşturmak için Python nasıl kullanılır? | Ekli kod

Kaynak | hackernoon

Derleme | Wu Mingli, sorumlu editör | Carol

Üretildi | AI Teknolojisi Ana Kampı (ID: rgznai100)

Bu yazıda, size Python kullanarak kendinizinkini nasıl oluşturacağınızı göstereceğim Cevap araması sistemi . Temel olarak, bu tür bir otomasyon resimlerden çoktan seçmeli sorulara yanıtlar bulabilir.

Açık olmamız gereken bir şey, sınav sırasında internette soru aramanın imkansız olmasıdır, ancak sınav görevlisi geri döndüğünde, hızlı bir şekilde resim çekebilirim. Bu, algoritmanın ilk kısmıdır. Bu sorunu resimden çıkarmanın bir yolunu bulmalıyım.

Metin çıkarma araçları sağlayabilen birçok hizmet var gibi görünüyor, ancak bu sorunu çözmek için bir tür API'ye ihtiyacım var. Son olarak, Google'ın VisionAPI'si aradığım araçtır. Harika olan, ayda ilk 1000 API çağrısının ücretsiz olması ve bu benim API'yi test etmem ve kullanmam için yeterli.

Vision AI

Önce bir Google bulut hesabı oluşturun ve ardından hizmette Vision AI'yı arayın. VisionAI kullanarak, görüntüleri düzenlemek için görüntülere etiket atama, önerilen kırpma köşelerini elde etme, ünlü manzara veya yerleri algılama ve metin çıkarma gibi görevleri gerçekleştirebilirsiniz.

API'yi etkinleştirmek ve kurmak için belgelere bakın. Yapılandırmadan sonra, bilgisayarınıza indirdiğiniz anahtarı içeren bir JSON dosyası oluşturmalısınız.

İstemci kitaplığını kurmak için aşağıdaki komutu çalıştırın:

pip google-cloud-vision'ı yükle

Daha sonra, GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayarak, uygulama kodu için kimlik doğrulama bilgilerini sağlayın.

os içe aktar, iofrom google.cloud içe aktarma görüşten google.cloud.vision içe aktarma türleri Keyos.environ = 'your_private_key.json'unuzu içeren # JSON dosyası # Bir clientclient örneğini oluşturur = vision.ImageAnnotatorClient FILE_NAME = 'resminiz_dosya.jpg' # Görüntüyü belleğe image_file olarak io.open (os.path.join (FILE_NAME), 'rb') ile yükler: content = image_file.read image = vision.types.Image (içerik = içerik) # Görüntü fileresponse = client.text_detection (image = image) print (response) üzerinde metin algılama gerçekleştirir # Descriptiontexts = response.text_annotationsprint'i çıkart (texts.description)

Kodu çalıştırdığınızda, yanıtı algılanan metnin özelliklerini içeren JSON biçiminde göreceksiniz. Ancak sadece saf bir tanıma ihtiyacımız var, bu yüzden bu kısmı yanıttan çıkardım.

Google'da sorun arayın

Bir sonraki adım, bazı bilgileri almak için Google'daki soru bölümünü aramaktır. . Soru bölümünü açıklamadan (yanıt) çıkarmak için normal ifade (regex) kitaplığını kullanıyorum. Ardından, çıkarılan soru kısmını aranabilmesi için gizlemeliyiz.

urllib'i yeniden içe aktar # Texts.description içinde soru işareti '?' İle bitiyorsa: soru = re.search ('(+)', texts.description) .group (1) # Texts.description: question = re.search ('(+)', texts.description) .group (1) # texts.description içinde newlineelif '\ n' ile bitiyorsa: soru = re.search ('(+)', texts.description) .group (1) # Matchslugify_keyword = urllib.parse.quote_plus (soru) print (slugify_keyword) 'i slugify

Taranan bilgiler

Soruyla ilgili bilgi almak için ilk 3 sonucu almak için BeautifulSoup'u kullanacağız çünkü cevap bunlardan birinde olabilir.

Ek olarak, Google'ın arama listesinden belirli verileri almak istiyorsanız, öğenin özelliklerini bulmak için inspect öğesini kullanmayın, ancak gerçek özelliklerden farklı olduğu için özellikleri görüntülemek için tüm sayfayı yazdırın.

Arama sonuçlarındaki ilk 3 bağlantıyı taramamız gerekiyor, ancak bu bağlantılar gerçekten bozuk, bu nedenle tarama için temiz bağlantılar elde etmek önemlidir.

/url?q=https://en.wikipedia.org/wiki/IAU_definition_of_planetsa=Uved=2ahUKEwiSmtrEsaTnAhXtwsQBHduCCO4QFjAAegQIBBABusg=AOvVaw0HzMKrBxdHZj5u1Yq1t0en

Gördüğünüz gibi, gerçek bağlantı q = ve sa arasındadır. Normal ifade Regex kullanarak, bu belirli alanı veya geçerli URL'yi alabiliriz.

result_urls = def crawl_result_urls: req = İstek ('https://google.com/search?q=' + slugify_keyword, başlıklar = {'Kullanıcı-Aracı': 'Mozilla / 5.0'}) html = urlopen (req) .read bs = BeautifulSoup (html, 'html.parser') results = bs.find_all ('div', class _ = 'ZINbbc') deneyin: sonuçlarla sonuç için: link = sonuç.find ('a') # URL olup olmadığını kontrol ediyor ( durumda) if'url 'in link: result_urls.append (re.search (' q = (. *) sa ', link) .group (1)) hariç (AttributeError, IndexError) e: pass

Bu URL'lerin içeriğini taramadan önce, size Python kullanarak soru ve cevap sistemini göstermeme izin verin.

Soru cevaplama sistemi

Bu, algoritmanın ana parçasıdır. İlk 3 sonuçtan bilgi aldıktan sonra, program belgeyi yineleyerek cevapları kontrol etmelidir. Her şeyden önce, soruna en benzer belgeleri tespit etmek için benzerlik algoritması kullanmanın daha iyi olacağını düşünüyorum, ancak nasıl uygulayacağımı bilmiyorum.

Birkaç saatlik araştırmadan sonra, Python'daki Soru-Cevap sistemini açıklayan Medium hakkında bir makale buldum. Kendi özel verileriniz için bir QA sistemi uygulamak için kullanımı kolay bir python paketine sahiptir.

Önce bu paketi kuralım:

pip cdqa yüklemek

Önceden eğitilmiş modeli ve verileri manuel olarak indirmek için aşağıdaki örnek kod bloğunda bulunan indirme işlevini kullanıyorum:

pandaları pdf olarak içe aktarma literal_eval cdqa.utils.filters'dan cdqa.utils'den filter_paragraphs'ı içe aktarın. import download_model, download_bnpp_datafrom cdqa.pipeline.cdqa_sklearn içe aktar QAPipeline # Veri ve modelleri indirindownload_bnpp_data (dir = '. / Data / bnpp_newsroom_v1.1 /') download_model (model = 'bert-squad_1.1', dir = '. / Modeller') # Veri yükleme ve belgeleri filtreleme / ön işlemedf = pd.read_csv ('data / bnpp_newsroom_v1.1 / bnpp_newsroom-v1.1.csv', converters = {'paragraphs': literal_eval}) df = filter_paragraphs (df) # SQuAD 1.1 üzerinde önceden eğitilmiş BERT Reader'ın CPU sürümüyle QAPipeline'ı yükleme cdqa_pipeline = QAPipeline (reader = 'models / bert_qa.joblib') # Geri alıcının dataframecdqa_pipeline.fit_retriever (df) içindeki doküman listesine uydurulması # Ardışık düzene bir soru göndermek ve tahmin sorgusu almak = 'BNP Paribas'ın Mükemmellik Programı ne zamandan beri var?' Prediction = cdqa_pipeline.predict (query) print ('sorgu: {} \ n'.format (sorgu)) print (' cevap: {} \ n'.format (tahmin)) print ('başlık: {} \ n'.format (tahmin)) print ( 'paragraf: {} \ n'.format (tahmin))

Çıktısı şu şekilde görünmelidir:

Tam cevabı ve cevabı içeren paragrafı yazdırır.

Temel olarak, soru resimden çıkarılıp sisteme gönderildiğinde, tarayıcı, taranan verilerden cevabı içerme olasılığı en yüksek olan belgelerin listesini seçecektir. . Daha önce de belirtildiği gibi, soruyla taranan verilerdeki her belge arasındaki kosinüs benzerliğini hesaplar.

En olası belgeyi seçtikten sonra, sistem her belgeyi birkaç paragrafa böler ve soruları birlikte okuyucuya gönderir.Bu temelde önceden eğitilmiş bir derin öğrenme modelidir. Kullanılan model, ünlü NLP modeli BERT'in Pytorch versiyonudur.

Ardından, okuyucu her paragrafta bulunan en olası cevabı verir. Okuyucudan sonra, sistemdeki son katman, dahili bir puanlama işlevi kullanarak cevapları karşılaştırır ve puana göre en olası cevabı çıkarır, bu da sorumuzun cevabını alır.

Aşağıdaki sistem mekanizmasının modudur.

CdQA ardışık düzenine göndermek için belirli bir yapıda bir veri çerçevesi (CSV) kurmanız gerekir.

Ama aslında PDF dosya dizininden bir girdi veri çerçevesi oluşturmak için PDF dönüştürücüyü kullandım. Bu nedenle, her sonucun kazınan tüm verilerini bir pdf dosyasına kaydetmek istiyorum. Toplamda 3 pdf dosyası olmasını umuyoruz (1 veya 2 olabilir). Ek olarak, bu pdf dosyalarını adlandırmamız gerekiyor, bu yüzden her sayfanın başlığını alıyorum.

def get_result_details (url): try: req = Request (url, headers = ('User-Agent': 'Mozilla / 5.0')) html = urlopen (req) .read bs = BeautifulSoup (html, 'html.parser') deneyin: # Sonuçtaki herhangi bir başlığı pdf dosyası olarak adlandırın title = bs.find (re.compile ('^ h $')). get_text.strip.replace ('?', ''). lower # pdf dosyasını adlandırma dosyaadı = "/ home / coderasha / autoans / pdfs /" + title + ".pdf" os.path.exists değilse (os.path.dirname (dosya adı)): deneyin: os.makedirs (os.path.dirname ( filename)) hariç OSError as exc: # exc.errno ise yarış durumuna karşı koru! = errno.EEXIST: f: olarak open (dosya adı, 'w') ile yükseltin: bs.find_all ('p' deki satır için ilk 5 paragrafı tara) '): f.write (line.text +' \ n '), AttributeError hariç: urllib.error.HTTPError dışında geçiş: pass def find_answer: df = pdf_converter (directory_path = '/ home / coderasha / autoans / pdfs') cdqa_pipeline = QAPipeline (reader = 'modeller / bert_qa.joblib') cdqa_pipeline.fit_retriever (df) query = soru + '?' prediction = cdqa_pipeline .predict (sorgu) print ('sorgu: {} \ n'.format (sorgu)) print (' cevap: {} \ n'.format (tahmin)) print ('başlık: {} \ n'.format (tahmin)) print ( 'paragraf: {} \ n'.format (tahmin)) dönüş tahmini

Algoritmayı özetleyeyim: Resimden soruyu çıkaracak, Google'da arayacak, ilk 3 sonucu alacak, taranan verilerden 3 pdf dosyası oluşturacak ve son olarak soru cevap sistemini kullanarak cevabı bulacaktır. .

Nasıl çalıştığını görmek istiyorsanız, lütfen resimlerden sınav sorularını çözebilecek bir robotu kontrol edin.

Tam kod aşağıdadır:

import os, ioimport errnoimport urllibimport urllib.requestimport hashlibimport reimport istekleri google.cloud import vision google.cloud.vision'dan import türleri urllib.request import urlopen, bs4'ten requestf from ast import literal_eval gibi BeautifulSoupimport pandaları içe aktarım. cdqa.utils.download import download_model, download_bnpp_datafrom cdqa.pipeline.cdqa_sklearn import QAPipelinefrom cdqa.utils.converters import pdf_converter result_urls = os.environ = 'your_private_key.json' client = vision.ImageAnnotatorClient FILE_NAME = 'resminiz_dosya.jpg' io.open (os.path.join (FILE_NAME), 'rb') ile image_file: content = image_file.read image = vision.types.Image (içerik = içerik) response = client.text_detection (resim = resim) texts = response.text_annotations # print (texts.description) texts.description içinde '?' ise: soru = re.search ('(+)', texts.description) .group (1) texts.description içinde elif ':': soru = re.search ('(+)', texts.description) .group (1) texts.description içindeki elif '\ n': soru = re.search ('(+)', texts.description) .group (1) slugify_keyword = urllib.parse.quote_plus (soru) # print (slugify_keyword) def crawl_result_urls: req = İstek ('https://google.com/search?q=' + slugify_keyword, başlıklar = {'Kullanıcı-Aracı': 'Mozilla / 5.0'}) html = urlopen (req) .read bs = BeautifulSoup (html, 'html.parser') results = bs.find_all ('div', class _ = 'ZINbbc') deneyin: sonuçlarla sonuç için: link = sonuç.find ('a') print (link) if'url 'in link: result_urls.append (re.search (' q = (. *) sa ', link) .group (1)) hariç (AttributeError, IndexError) e: pass def get_result_details (url): try: req = Request (url, headers = ('User-Agent': 'Mozilla / 5.0')) html = urlopen (req) .read bs = BeautifulSoup (html, 'html.parser') deneyin: title = bs.find (re.compile ('^ h $')). get_text.strip.replace ('?', ''). lower # Pdf dizinine giden yolu ayarlayın dosyaadı = "/ yol / / / pdf_folder / "+ title +" .pdf "os.path.exists değilse (os.path.dirname (dosyaadı)): deneyin: os.makedirs (os.path.dirname (dosya adı)) hariç OSError as exc: if exc .errno! = hata no.EEXIST: f olarak open (dosya adı, 'w') ile yükseltin: bs.find_all'daki satır için ('p'): f.write (line.text + '\ n') AttributeError: pass hariç urllib.error.HTTPError dışında: pass def find_answer: # pdf dizinine giden yolu ayarlayın df = pdf_converter (directory_path = '/ path / to / pdf_folder /') cdqa_pipeline = QAPipeline (reader = 'models / bert_qa.joblib') cdqa_pipeline.fit_retriever (df) query = question + '?' tahmin = cdqa_pipeline.predict (sorgu) # print ('sorgu: {} \ n'.format (sorgu)) # print (' yanıt: {} \ n'.format (tahmin)) # print ('başlık: {} \ n'.format (tahmin) ) # print ('paragraf: {} \ n'.format (tahmin)) dönüş tahmini crawl_result_urls sonuç_url'lerinde url için: get_result_details (url) uyku (5) answer = find_answerprint ('Answer:' + answer)

Bazen kafa karıştırıcı olabilir, ancak genel olarak sorun olmadığını düşünüyorum. En azından sınavı doğru cevapların% 60'ı ile geçebilirim.

Geliştiriciler bana yorumlarda görüşlerinizi bildirebilirler! Aslında en iyisi tüm soruları aynı anda yanıtlamaktır, ancak bunu yapmak için yeterli zamanım yok, bu yüzden bir dahaki sefere yapmaya devam etmeliyim.

Güneş sisteminin düzlemi Samanyolu ile aynı seviyede mi?
önceki
ESO teleskopu, Betelgeuse yüzeyinin en son görüntüsünü yakaladı ve sonunda Betelgeuse'un neden karartığını anladı
Sonraki
"Salgın" yolundasınız ve "aşk yemekleri" köylüleri mutlu ediyor
Hubble Uzay Teleskobu: Gökbilimciler, uzayın en iyi 17 fotoğrafını paylaşıyor
O, Vulcan Dağ Hastanesi Yoğun Bakım Ünitesinin "gece bekçisi" ve bir keresinde "Çin Halk Kurtuluş Ordusu geri çekilmeyecek!" Diye bağırdı.
Bazı yıldızlararası kuyruklu yıldızlar, resmi olarak duyurulmadan önce gökbilimcilerin kameraları tarafından kaydedilmiş olabilir.
Şiddetli salgın altında, Alibaba'nın hücumu ve savunması
Keşfedildiği günden bu yana şiddetli tartışmalara neden olan küçük yaban mersini - gizemli Marslı yaban mersini
TikTok, Huge Engine ve Feishu ile birlikte, küçük ve orta ölçekli işletmelerin salgının üstesinden gelmesine yardımcı olmak için beş önlem başlattı
2020'de, AI için en uygun 5 programlama dili
Ayın oluşum tarihini keşfedin, ayın uzak tarafını ve ay evrelerinin oluşumunu gözlemleyin
öfke! Çok sayıda sahte maske araştırıldı ve ele alındı. Satın aldığınız maskelerin gerçek olup olmadığını nasıl anlarsınız?
20 yıldan sonra 10 milyondan fazla insan kullanılıyor ve ortadan kaldırılacaklarını mı söylüyorlar?
Dünya yörüngesini değiştirirse, insanlığa ne gibi sonuçlar getirecek?
To Top