| Line | |
|---|
| 1 | import nearest |
|---|
| 2 | |
|---|
| 3 | class NearestByTag(object): |
|---|
| 4 | |
|---|
| 5 | def __init__(self, tags): |
|---|
| 6 | self.tags = tags |
|---|
| 7 | self.db = nearest.DataSet(attrnames=tags, exclude=(-1,),) |
|---|
| 8 | self.solver = nearest.NearestNeighborLearner() |
|---|
| 9 | self.solver.train(self.db) |
|---|
| 10 | |
|---|
| 11 | def add_user(self, name, tags): |
|---|
| 12 | values = [] |
|---|
| 13 | for tag in self.tags: |
|---|
| 14 | if tag in tags: |
|---|
| 15 | values.append('1') |
|---|
| 16 | else: |
|---|
| 17 | values.append('0') |
|---|
| 18 | values.append(name) |
|---|
| 19 | |
|---|
| 20 | self.db.add_example(values) |
|---|
| 21 | |
|---|
| 22 | def neighbours(self, name, k=10): |
|---|
| 23 | distances = [] |
|---|
| 24 | |
|---|
| 25 | # find back the user |
|---|
| 26 | current = None |
|---|
| 27 | for user in self.db.examples: |
|---|
| 28 | user_name = user[-1] |
|---|
| 29 | if user_name == name: |
|---|
| 30 | current = user |
|---|
| 31 | |
|---|
| 32 | if current is None: |
|---|
| 33 | raise Exception('user %s not found' % name) |
|---|
| 34 | |
|---|
| 35 | for user in self.db.examples: |
|---|
| 36 | user_name = user[-1] |
|---|
| 37 | if user_name == name: |
|---|
| 38 | continue |
|---|
| 39 | distances.append((self.solver.distance(user, current), user_name)) |
|---|
| 40 | |
|---|
| 41 | distances.sort() |
|---|
| 42 | return distances[:k] |
|---|
| 43 | |
|---|