-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsample.py
More file actions
59 lines (46 loc) · 2.2 KB
/
Copy pathsample.py
File metadata and controls
59 lines (46 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import itertools
from random import sample
import numpy as np
def _uniform_negatives(num_items, shape):
return np.random.randint(1, num_items + 1, shape)
def _uniform_negatives_session_rejected(num_items, shape, in_session_items):
negatives = []
for _ in range(np.prod(shape)):
negative = np.random.randint(1, num_items + 1)
while negative in in_session_items:
negative = np.random.randint(1, num_items + 1)
negatives.append(negative)
return np.array(negatives).reshape(shape)
def _infer_shape(session_len, num_uniform_negatives, sampling_style):
if sampling_style == "eventwise":
return [session_len, num_uniform_negatives]
elif sampling_style == "sessionwise":
return [num_uniform_negatives]
else:
return []
def sample_uniform(num_items, shape, in_session_items, reject_session_items):
if reject_session_items:
return _uniform_negatives_session_rejected(num_items, shape, in_session_items)
else:
return _uniform_negatives(num_items, shape)
def sample_uniform_negatives_with_shape(clicks, num_items, session_len, num_uniform_negatives, sampling_style,
reject_session_items):
in_session_items = set(clicks)
shape = _infer_shape(session_len, num_uniform_negatives, sampling_style)
if shape:
negatives = sample_uniform(num_items, shape, in_session_items, reject_session_items)
else:
negatives = np.array([])
return negatives
def sample_in_batch_negatives(batch_positives, num_in_batch_negatives, batch_session_len, reject_session_items):
in_batch_negatives = []
positive_indices = itertools.accumulate(batch_session_len)
positive_indices = [0] + [p for p in positive_indices]
if reject_session_items:
for i in range(len(positive_indices[:-1])):
candidate_positives = batch_positives[:positive_indices[i]] + batch_positives[positive_indices[i + 1]:]
in_batch_negatives.append(sample(candidate_positives, num_in_batch_negatives))
else:
for i in range(len(batch_session_len)):
in_batch_negatives.append(sample(batch_positives, num_in_batch_negatives))
return in_batch_negatives