Xem trên TensorFlow.org | Chạy trong Google Colab | Xem trên GitHub | Tải xuống sổ ghi chép | Xem các mẫu TF Hub |
Đây là một bản demo cho việc sử dụng phổ Bộ mã hóa đa ngôn ngữ Q & A mô hình để thu hồi câu hỏi-câu trả lời của văn bản, minh họa việc sử dụng question_encoder và response_encoder của mô hình. Chúng tôi sử dụng câu từ Squad đoạn như dataset demo, mỗi câu và ngữ cảnh của nó (văn bản xung quanh câu) được mã hóa thành embeddings chiều cao với response_encoder. Những embeddings được lưu trữ trong một chỉ số được xây dựng bằng cách sử dụng simpleneighbors thư viện để thu hồi câu hỏi-câu trả lời.
Vào hồi một câu hỏi ngẫu nhiên được chọn từ đội hình dữ liệu và mã hóa vào chiều cao nhúng với question_encoder và truy vấn các chỉ số simpleneighbors trả về một danh sách các nước láng giềng khu vực gần gần đúng trong không gian ngữ nghĩa.
Nhiều mô hình hơn
Bạn có thể tìm thấy tất cả các văn bản hiện tổ chức nhúng mô hình ở đây và tất cả các mô hình đã được tập huấn về Squad cũng ở đây .
Thành lập
Môi trường thiết lập
%%capture
# Install the latest Tensorflow version.
!pip install -q tensorflow_text
!pip install -q simpleneighbors[annoy]
!pip install -q nltk
!pip install -q tqdm
Thiết lập các chức năng và nhập khẩu chung
import json
import nltk
import os
import pprint
import random
import simpleneighbors
import urllib
from IPython.display import HTML, display
from tqdm.notebook import tqdm
import tensorflow.compat.v2 as tf
import tensorflow_hub as hub
from tensorflow_text import SentencepieceTokenizer
nltk.download('punkt')
def download_squad(url):
return json.load(urllib.request.urlopen(url))
def extract_sentences_from_squad_json(squad):
all_sentences = []
for data in squad['data']:
for paragraph in data['paragraphs']:
sentences = nltk.tokenize.sent_tokenize(paragraph['context'])
all_sentences.extend(zip(sentences, [paragraph['context']] * len(sentences)))
return list(set(all_sentences)) # remove duplicates
def extract_questions_from_squad_json(squad):
questions = []
for data in squad['data']:
for paragraph in data['paragraphs']:
for qas in paragraph['qas']:
if qas['answers']:
questions.append((qas['question'], qas['answers'][0]['text']))
return list(set(questions))
def output_with_highlight(text, highlight):
output = "<li> "
i = text.find(highlight)
while True:
if i == -1:
output += text
break
output += text[0:i]
output += '<b>'+text[i:i+len(highlight)]+'</b>'
text = text[i+len(highlight):]
i = text.find(highlight)
return output + "</li>\n"
def display_nearest_neighbors(query_text, answer_text=None):
query_embedding = model.signatures['question_encoder'](tf.constant([query_text]))['outputs'][0]
search_results = index.nearest(query_embedding, n=num_results)
if answer_text:
result_md = '''
<p>Random Question from SQuAD:</p>
<p> <b>%s</b></p>
<p>Answer:</p>
<p> <b>%s</b></p>
''' % (query_text , answer_text)
else:
result_md = '''
<p>Question:</p>
<p> <b>%s</b></p>
''' % query_text
result_md += '''
<p>Retrieved sentences :
<ol>
'''
if answer_text:
for s in search_results:
result_md += output_with_highlight(s, answer_text)
else:
for s in search_results:
result_md += '<li>' + s + '</li>\n'
result_md += "</ol>"
display(HTML(result_md))
[nltk_data] Downloading package punkt to /home/kbuilder/nltk_data... [nltk_data] Unzipping tokenizers/punkt.zip.
Chạy khối mã sau để tải xuống và giải nén tập dữ liệu SQuAD thành:
- câu là danh sách (văn bản, ngữ cảnh) tuples - mỗi đoạn từ Squad bộ dữ liệu được tách ra thành câu sử dụng thư viện NLTK và câu và đoạn hình thức văn bản (văn bản, ngữ cảnh) tuple.
- câu hỏi là danh sách (câu hỏi, câu trả lời) tuples.
Tải xuống và giải nén dữ liệu SQuAD
squad_url = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json'
squad_json = download_squad(squad_url)
sentences = extract_sentences_from_squad_json(squad_json)
questions = extract_questions_from_squad_json(squad_json)
print("%s sentences, %s questions extracted from SQuAD %s" % (len(sentences), len(questions), squad_url))
print("\nExample sentence and context:\n")
sentence = random.choice(sentences)
print("sentence:\n")
pprint.pprint(sentence[0])
print("\ncontext:\n")
pprint.pprint(sentence[1])
print()
10455 sentences, 10552 questions extracted from SQuAD https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json Example sentence and context: sentence: ('The Mongol Emperors had built large palaces and pavilions, but some still ' 'continued to live as nomads at times.') context: ("Since its invention in 1269, the 'Phags-pa script, a unified script for " 'spelling Mongolian, Tibetan, and Chinese languages, was preserved in the ' 'court until the end of the dynasty. Most of the Emperors could not master ' 'written Chinese, but they could generally converse well in the language. The ' 'Mongol custom of long standing quda/marriage alliance with Mongol clans, the ' 'Onggirat, and the Ikeres, kept the imperial blood purely Mongol until the ' 'reign of Tugh Temur, whose mother was a Tangut concubine. The Mongol ' 'Emperors had built large palaces and pavilions, but some still continued to ' 'live as nomads at times. Nevertheless, a few other Yuan emperors actively ' 'sponsored cultural activities; an example is Tugh Temur (Emperor Wenzong), ' 'who wrote poetry, painted, read Chinese classical texts, and ordered the ' 'compilation of books.')
Sau khi thiết lập khối mã tensorflow đồ thị g và phiên với Phổ mã hóa đa ngôn ngữ Q & A mô hình question_encoder 's và chữ ký response_encoder.
Tải mô hình từ trung tâm tensorflow
module_url = "https://tfhub.dev/google/universal-sentence-encoder-multilingual-qa/3"
model = hub.load(module_url)
Khối mã sau tính embeddings cho tất cả các văn bản, các bộ bối cảnh và lưu trữ chúng trong một simpleneighbors chỉ số sử dụng response_encoder.
Tính toán các lần nhúng và xây dựng chỉ mục simpleneighbors
batch_size = 100
encodings = model.signatures['response_encoder'](
input=tf.constant([sentences[0][0]]),
context=tf.constant([sentences[0][1]]))
index = simpleneighbors.SimpleNeighbors(
len(encodings['outputs'][0]), metric='angular')
print('Computing embeddings for %s sentences' % len(sentences))
slices = zip(*(iter(sentences),) * batch_size)
num_batches = int(len(sentences) / batch_size)
for s in tqdm(slices, total=num_batches):
response_batch = list([r for r, c in s])
context_batch = list([c for r, c in s])
encodings = model.signatures['response_encoder'](
input=tf.constant(response_batch),
context=tf.constant(context_batch)
)
for batch_index, batch in enumerate(response_batch):
index.add_one(batch, encodings['outputs'][batch_index])
index.build()
print('simpleneighbors index for %s sentences built.' % len(sentences))
Computing embeddings for 10455 sentences 0%| | 0/104 [00:00<?, ?it/s] simpleneighbors index for 10455 sentences built.
Về thu hồi, câu hỏi được mã hóa bằng cách sử dụng question_encoder và nhúng câu hỏi được sử dụng để truy vấn các chỉ số simpleneighbors.
Truy cập những người hàng xóm gần nhất cho một câu hỏi ngẫu nhiên từ SQuAD
num_results = 25
query = random.choice(questions)
display_nearest_neighbors(query[0], query[1])