in gym_wikinav/envs/wikinav_env/web_graph.py [0:0]
def __init__(self, data_path, path_length, emb_paths=None):
try:
import cPickle as pickle
except: import pickle
with open(data_path, "rb") as data_f:
data = pickle.load(data_f)
self._data = data
if emb_paths is not None:
embeddings = [np.load(emb_path)["arr_0"] for emb_path in emb_paths]
self.embedding_dim = embeddings[0].shape[1]
for other_embeddings in embeddings:
assert other_embeddings.shape == embeddings[0].shape
self.embeddings = embeddings
else:
print("=====================================================\n"
"WARNING: Using randomly generated article embeddings.\n"
"=====================================================",
file=sys.stderr)
# Random embeddings.
self.embedding_dim = 128 # fixed for now
shape = (len(data["articles"]), self.embedding_dim)
# Match Wikispeedia embedding distribution
embeddings = np.random.normal(scale=0.15, size=shape)
self.embeddings = [embeddings]
articles = [EmbeddedArticle(
article["name"], self.embeddings[0][i],
set(token.lower() for token in article["lead_tokens"]))
for i, article in enumerate(data["articles"])]
assert articles[0].title == "_Stop"
assert articles[1].title == "_Dummy"
stop_sentinel = 0
datasets = {}
for dataset_name, dataset in data["paths"].items():
paths, original_lengths, n_skipped = [], [], 0
for path in dataset:
if len(path["articles"]) > path_length - 1:
n_skipped += 1
continue
# Pad with STOP sentinel (every path gets at least one)
pad_length = max(0, path_length + 1 - len(path["articles"]))
original_length = len(path["articles"]) + 1
path = path["articles"] + [stop_sentinel] * pad_length
paths.append(path)
original_lengths.append(original_length)
print("%s set: skipped %i of %i paths due to length limit"
% (dataset_name, n_skipped, len(dataset)))
datasets[dataset_name] = (paths, np.array(original_lengths))
super(EmbeddedWikispeediaGraph, self).__init__(articles, datasets,
path_length,
stop_sentinel=stop_sentinel)