SpEL files required to run the streamlit app copied from https://github.com/shavarani/SpEL
Browse files- aida.py +220 -0
- app.py +75 -0
- base_model.cfg +1 -0
- candidate_manager.py +103 -0
- configuration.py +104 -0
- data_loader.py +390 -0
- decao_eval.py +1391 -0
- model.py +439 -0
- resources/data/aida_canonical_redirects.json +0 -0
- resources/vocab/aida.txt +5598 -0
- resources/vocab/enwiki_20230827.txt +0 -0
- resources/vocab/out_of_domain.txt +0 -0
- span_annotation.py +166 -0
- utils.py +545 -0
aida.py
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import zipfile
|
| 3 |
+
from configuration import get_aida_yago_tsv_file_path, get_resources_dir
|
| 4 |
+
|
| 5 |
+
TRAIN_START_LINE = "-DOCSTART- (1 EU)"
|
| 6 |
+
TESTA_START_LINE = "-DOCSTART- (947testa CRICKET)"
|
| 7 |
+
TESTB_START_LINE = "-DOCSTART- (1163testb SOCCER)"
|
| 8 |
+
|
| 9 |
+
CANONICAL_REDIRECTS = None
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class AnnotationRecord:
|
| 13 |
+
def __init__(self, line):
|
| 14 |
+
"""
|
| 15 |
+
Lines with tabs are tokens the are part of a mention:
|
| 16 |
+
- column 1 is the token
|
| 17 |
+
- column 2 is either B (beginning of a mention) or I (continuation of a mention)
|
| 18 |
+
- column 3 is the full mention used to find entity candidates
|
| 19 |
+
- column 4 is the corresponding YAGO2 entity (in YAGO encoding, i.e. unicode characters are backslash encoded and spaces are replaced by underscores, see also the tools on the YAGO2 website), OR --NME--, denoting that there is no matching entity in YAGO2 for this particular mention, or that we are missing the connection between the mention string and the YAGO2 entity.
|
| 20 |
+
- column 5 is the corresponding Wikipedia URL of the entity (added for convenience when evaluating against a Wikipedia based method)
|
| 21 |
+
- column 6 is the corresponding Wikipedia ID of the entity (added for convenience when evaluating against a Wikipedia based method - the ID refers to the dump used for annotation, 2010-08-17)
|
| 22 |
+
- column 7 is the corresponding Freebase mid, if there is one (thanks to Massimiliano Ciaramita from Google Zürich for creating the mapping and making it available to us)
|
| 23 |
+
"""
|
| 24 |
+
data_columns = line.split('\t')
|
| 25 |
+
self.token = None
|
| 26 |
+
self.begin_inside_tag = None
|
| 27 |
+
self.full_mention = None
|
| 28 |
+
self.yago_entity = None
|
| 29 |
+
self.wikipedia_url = None
|
| 30 |
+
self.wikipedia_id = None
|
| 31 |
+
self.freebase_mid = None
|
| 32 |
+
self.candidates = None
|
| 33 |
+
if data_columns:
|
| 34 |
+
self.token = data_columns[0]
|
| 35 |
+
if len(data_columns) > 1:
|
| 36 |
+
self.begin_inside_tag = data_columns[1]
|
| 37 |
+
if len(data_columns) > 2:
|
| 38 |
+
self.full_mention = data_columns[2]
|
| 39 |
+
if len(data_columns) > 3:
|
| 40 |
+
self.yago_entity = data_columns[3]
|
| 41 |
+
if len(data_columns) > 4:
|
| 42 |
+
self.wikipedia_url = data_columns[4]
|
| 43 |
+
if len(data_columns) > 5:
|
| 44 |
+
self.wikipedia_id = data_columns[5]
|
| 45 |
+
if len(data_columns) > 6:
|
| 46 |
+
self.freebase_mid = data_columns[6]
|
| 47 |
+
|
| 48 |
+
def set_candidates(self, candidate_record):
|
| 49 |
+
self.candidates = candidate_record
|
| 50 |
+
self.candidates.non_considered_word_count -= 1
|
| 51 |
+
|
| 52 |
+
def __str__(self):
|
| 53 |
+
res = ""
|
| 54 |
+
t = [self.token, self.begin_inside_tag, self.full_mention, self.yago_entity, self.wikipedia_url,
|
| 55 |
+
self.wikipedia_id, self.freebase_mid]
|
| 56 |
+
for ind, e in enumerate(t):
|
| 57 |
+
if not e:
|
| 58 |
+
continue
|
| 59 |
+
if ind < len(t) - 1:
|
| 60 |
+
res += e + "|"
|
| 61 |
+
else:
|
| 62 |
+
res += e
|
| 63 |
+
if res[-1] == "|":
|
| 64 |
+
res = res[:-1]
|
| 65 |
+
return res
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
class Document:
|
| 69 |
+
def __init__(self, document_id):
|
| 70 |
+
self.document_id = document_id
|
| 71 |
+
self.annotations = []
|
| 72 |
+
self.current_annotation = []
|
| 73 |
+
|
| 74 |
+
def add_annotation(self, line, candidates):
|
| 75 |
+
if not line:
|
| 76 |
+
self.flush_current_annotation()
|
| 77 |
+
else:
|
| 78 |
+
ar = AnnotationRecord(line)
|
| 79 |
+
for c in candidates:
|
| 80 |
+
if c.non_considered_word_count < 1:
|
| 81 |
+
continue
|
| 82 |
+
if c.orig_text == ar.full_mention:
|
| 83 |
+
ar.set_candidates(c)
|
| 84 |
+
break
|
| 85 |
+
self.current_annotation.append(ar)
|
| 86 |
+
|
| 87 |
+
def flush_current_annotation(self):
|
| 88 |
+
self.annotations.append(self.current_annotation)
|
| 89 |
+
self.current_annotation = []
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
class Candidate:
|
| 93 |
+
def __init__(self, candidate_line):
|
| 94 |
+
self.id = ""
|
| 95 |
+
self.in_count = 0
|
| 96 |
+
self.out_count = 0
|
| 97 |
+
self.links = 0
|
| 98 |
+
self.url = ""
|
| 99 |
+
self.name = ""
|
| 100 |
+
self.normal_name = ""
|
| 101 |
+
self.normal_wiki_title = ""
|
| 102 |
+
self.predicted_type = ""
|
| 103 |
+
for item in candidate_line.split('\t'):
|
| 104 |
+
if item == 'CANDIDATE' or not item.strip():
|
| 105 |
+
continue
|
| 106 |
+
elif item.startswith('id:'):
|
| 107 |
+
self.id = item[3:]
|
| 108 |
+
elif item.startswith('inCount:'):
|
| 109 |
+
self.in_count = int(item[8:])
|
| 110 |
+
elif item.startswith('outCount:'):
|
| 111 |
+
self.out_count = int(item[9:])
|
| 112 |
+
elif item.startswith('links:'):
|
| 113 |
+
self.links = item[6:]
|
| 114 |
+
elif item.startswith('url:'):
|
| 115 |
+
self.url = item[4:]
|
| 116 |
+
elif item.startswith('name:'):
|
| 117 |
+
self.name = item[5:]
|
| 118 |
+
elif item.startswith('normalName:'):
|
| 119 |
+
self.normal_name = item[11:]
|
| 120 |
+
elif item.startswith('normalWikiTitle:'):
|
| 121 |
+
self.normal_wiki_title = item[16:]
|
| 122 |
+
elif item.startswith('predictedType:'):
|
| 123 |
+
self.predicted_type = item[14:]
|
| 124 |
+
else:
|
| 125 |
+
raise ValueError(f"Undefined PPRforNED CANDIDATE column: {item}")
|
| 126 |
+
|
| 127 |
+
def __str__(self):
|
| 128 |
+
return f"id: {self.id}\twiki_page: {self.url.replace('http://en.wikipedia.org/wiki/', '')}"
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
class CandidateRecord:
|
| 132 |
+
def __init__(self, entity_header):
|
| 133 |
+
self.candidates = []
|
| 134 |
+
self.text = ""
|
| 135 |
+
self.normal_name = ""
|
| 136 |
+
self.predicted_type = ""
|
| 137 |
+
self.q = False
|
| 138 |
+
self.qid = ""
|
| 139 |
+
self.docid = -1
|
| 140 |
+
self.orig_text = ""
|
| 141 |
+
self.non_considered_word_count = 0
|
| 142 |
+
self.url = ""
|
| 143 |
+
for item in entity_header.split('\t'):
|
| 144 |
+
if item == 'ENTITY':
|
| 145 |
+
continue
|
| 146 |
+
elif item.startswith('text:'):
|
| 147 |
+
self.text = item[5:]
|
| 148 |
+
elif item.startswith('normalName:'):
|
| 149 |
+
self.normal_name = item[11:]
|
| 150 |
+
elif item.startswith('predictedType:'):
|
| 151 |
+
self.predicted_type = item[14:]
|
| 152 |
+
elif item.startswith('q:'):
|
| 153 |
+
self.q = bool(item[2:])
|
| 154 |
+
elif item.startswith('qid:'):
|
| 155 |
+
self.qid = item[4:]
|
| 156 |
+
elif item.startswith('docId:'):
|
| 157 |
+
self.docid = int(item[6:]) - 1
|
| 158 |
+
elif item.startswith('origText:'):
|
| 159 |
+
self.orig_text = item[9:]
|
| 160 |
+
self.non_considered_word_count = len(self.orig_text.split())
|
| 161 |
+
elif item.startswith('url:'):
|
| 162 |
+
self.url = item[4:]
|
| 163 |
+
else:
|
| 164 |
+
raise ValueError(f"Undefined PPRforNED column: {item}")
|
| 165 |
+
|
| 166 |
+
def add_candidate(self, candidate_line):
|
| 167 |
+
self.candidates.append(Candidate(candidate_line))
|
| 168 |
+
|
| 169 |
+
def __str__(self):
|
| 170 |
+
cnds = '\n\t'.join([str(x) for x in self.candidates])
|
| 171 |
+
return f"doc_id: {self.docid}\toriginal_text: {self.orig_text}\tcandidates:\n\t{cnds}"
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
def get_candidates(ppr_for_ned_candidates_zip, last_document_id):
|
| 175 |
+
candidates_string = ppr_for_ned_candidates_zip.read(str(last_document_id + 1)).decode("utf-8").split("\n")
|
| 176 |
+
candidates = []
|
| 177 |
+
for c_line in candidates_string:
|
| 178 |
+
if not c_line.strip():
|
| 179 |
+
continue
|
| 180 |
+
if c_line.startswith("ENTITY"):
|
| 181 |
+
candidates.append(CandidateRecord(c_line))
|
| 182 |
+
elif c_line.startswith("CANDIDATE"):
|
| 183 |
+
assert len(candidates)
|
| 184 |
+
candidates[-1].add_candidate(c_line)
|
| 185 |
+
else:
|
| 186 |
+
raise ValueError("This must be unreachable!")
|
| 187 |
+
return candidates
|
| 188 |
+
|
| 189 |
+
class AIDADataset:
|
| 190 |
+
def __init__(self):
|
| 191 |
+
super(AIDADataset, self).__init__()
|
| 192 |
+
self.dataset = None
|
| 193 |
+
self.data_path = str(get_aida_yago_tsv_file_path().absolute())
|
| 194 |
+
assert os.path.exists(self.data_path), f"The passed dataset address: {self.data_path} does not exist"
|
| 195 |
+
self.load_dataset()
|
| 196 |
+
|
| 197 |
+
def load_dataset(self):
|
| 198 |
+
ppr_for_ned_candidates_zip = zipfile.ZipFile(get_resources_dir() / "data" / "PPRforNED.zip", "r")
|
| 199 |
+
annotations = [[], [], []]
|
| 200 |
+
current_document = None
|
| 201 |
+
current_document_candidates = None
|
| 202 |
+
data_split_id = -1
|
| 203 |
+
last_document_id = 0
|
| 204 |
+
with open(self.data_path, "r", encoding="utf-8") as data_file:
|
| 205 |
+
for ind, line in enumerate(data_file):
|
| 206 |
+
line = line.strip()
|
| 207 |
+
if line.startswith("-DOCSTART-"):
|
| 208 |
+
if current_document:
|
| 209 |
+
annotations[data_split_id].append(current_document)
|
| 210 |
+
last_document_id += 1
|
| 211 |
+
if line == TRAIN_START_LINE or line == TESTA_START_LINE or line == TESTB_START_LINE:
|
| 212 |
+
data_split_id += 1
|
| 213 |
+
current_document = Document(last_document_id)
|
| 214 |
+
current_document_candidates = get_candidates(ppr_for_ned_candidates_zip, last_document_id)
|
| 215 |
+
else:
|
| 216 |
+
current_document.add_annotation(line, current_document_candidates)
|
| 217 |
+
if current_document:
|
| 218 |
+
annotations[data_split_id].append(current_document)
|
| 219 |
+
self.dataset = {"train": annotations[0], "testa": annotations[1], "testb": annotations[2]}
|
| 220 |
+
ppr_for_ned_candidates_zip.close()
|
app.py
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
The SpEL annotation visualization script. You can use this script as a playground to explore the capabilities and
|
| 3 |
+
limitations of the SpEL framework.
|
| 4 |
+
"""
|
| 5 |
+
import torch
|
| 6 |
+
from model import SpELAnnotator
|
| 7 |
+
from data_loader import dl_sa
|
| 8 |
+
from utils import chunk_annotate_and_merge_to_phrase
|
| 9 |
+
from candidate_manager import CandidateManager
|
| 10 |
+
import streamlit as st
|
| 11 |
+
from annotated_text import annotated_text
|
| 12 |
+
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
| 13 |
+
|
| 14 |
+
@st.cache_resource
|
| 15 |
+
def load_model():
|
| 16 |
+
load_aida_finetuned = True
|
| 17 |
+
load_full_vocabulary=True
|
| 18 |
+
candidate_setting = "n"
|
| 19 |
+
model = SpELAnnotator()
|
| 20 |
+
model.init_model_from_scratch(device=device)
|
| 21 |
+
candidates_manager_to_use = CandidateManager(dl_sa.mentions_vocab,
|
| 22 |
+
is_kb_yago=candidate_setting == "k",
|
| 23 |
+
is_ppr_for_ned=candidate_setting.startswith("p"),
|
| 24 |
+
is_context_agnostic=candidate_setting == "pg",
|
| 25 |
+
is_indexed_for_spans=True) if candidate_setting != "n" else None
|
| 26 |
+
if load_aida_finetuned and not load_full_vocabulary:
|
| 27 |
+
model.shrink_classification_head_to_aida(device=device)
|
| 28 |
+
model.load_checkpoint(None, device=device, load_from_torch_hub=True, finetuned_after_step=3)
|
| 29 |
+
elif load_aida_finetuned:
|
| 30 |
+
model.load_checkpoint(None, device=device, load_from_torch_hub=True, finetuned_after_step=4)
|
| 31 |
+
else:
|
| 32 |
+
model.load_checkpoint(None, device=device, load_from_torch_hub=True, finetuned_after_step=2)
|
| 33 |
+
return model, candidates_manager_to_use
|
| 34 |
+
|
| 35 |
+
annotator, candidates_manager = load_model()
|
| 36 |
+
st.title("SpEL Prediction Visualization")
|
| 37 |
+
mention = st.text_input("Enter the text:")
|
| 38 |
+
process_button = st.button("Annotate")
|
| 39 |
+
|
| 40 |
+
if process_button and mention:
|
| 41 |
+
phrase_annotations = chunk_annotate_and_merge_to_phrase(
|
| 42 |
+
annotator, mention, k_for_top_k_to_keep=5, normalize_for_chinese_characters=True)
|
| 43 |
+
last_step_annotations = [[p.words[0].token_offsets[0][1][0],
|
| 44 |
+
p.words[-1].token_offsets[-1][1][-1],
|
| 45 |
+
(dl_sa.mentions_itos[p.resolved_annotation], p.subword_annotations)]
|
| 46 |
+
for p in phrase_annotations if p.resolved_annotation != 0]
|
| 47 |
+
if candidates_manager:
|
| 48 |
+
for p in phrase_annotations:
|
| 49 |
+
candidates_manager.modify_phrase_annotation_using_candidates(p, mention)
|
| 50 |
+
if last_step_annotations:
|
| 51 |
+
anns = sorted([(l_ann[0], l_ann[1], l_ann[2][0]) for l_ann in last_step_annotations], key=lambda x: x[0])
|
| 52 |
+
begin = 0
|
| 53 |
+
last_char = len(mention)
|
| 54 |
+
anns_pointer = 0
|
| 55 |
+
processed_anns = []
|
| 56 |
+
anno_text = []
|
| 57 |
+
while begin < last_char:
|
| 58 |
+
if anns_pointer == len(anns):
|
| 59 |
+
processed_anns.append((begin, last_char, "O"))
|
| 60 |
+
anno_text.append(mention[begin: last_char])
|
| 61 |
+
begin = last_char
|
| 62 |
+
continue
|
| 63 |
+
first_unprocessed_annotation = anns[anns_pointer]
|
| 64 |
+
if first_unprocessed_annotation[0] > begin:
|
| 65 |
+
processed_anns.append((begin, first_unprocessed_annotation[0], "O"))
|
| 66 |
+
anno_text.append(mention[begin: first_unprocessed_annotation[0]])
|
| 67 |
+
begin = first_unprocessed_annotation[0]
|
| 68 |
+
else:
|
| 69 |
+
processed_anns.append(first_unprocessed_annotation)
|
| 70 |
+
anns_pointer += 1
|
| 71 |
+
begin = first_unprocessed_annotation[1]
|
| 72 |
+
anno_text.append((mention[first_unprocessed_annotation[0]: first_unprocessed_annotation[1]], first_unprocessed_annotation[2]))
|
| 73 |
+
annotated_text(anno_text)
|
| 74 |
+
else:
|
| 75 |
+
annotated_text(mention)
|
base_model.cfg
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
roberta-base
|
candidate_manager.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
This file contains the implementation of the candidate manager in charge of loading the candidate sets,
|
| 3 |
+
and modifying the phrase annotations using the loaded candidates.
|
| 4 |
+
"""
|
| 5 |
+
import json
|
| 6 |
+
from span_annotation import PhraseAnnotation
|
| 7 |
+
from configuration import get_resources_dir
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
class CandidateManager:
|
| 11 |
+
def __init__(self, mentions_vocab, is_kb_yago = False, is_ppr_for_ned = False, is_context_agnostic = False,
|
| 12 |
+
is_indexed_for_spans= False):
|
| 13 |
+
self.mentions_vocab = mentions_vocab
|
| 14 |
+
self.candidates = None
|
| 15 |
+
if is_kb_yago:
|
| 16 |
+
print(" * Loading the candidates stored for KB+YAGO ...")
|
| 17 |
+
is_context_agnostic = True
|
| 18 |
+
is_indexed_for_spans = False
|
| 19 |
+
self.load_kb_plus_yago()
|
| 20 |
+
elif is_ppr_for_ned:
|
| 21 |
+
print(" * Loading the {} PPRforNED candidate set ...".format(
|
| 22 |
+
'context agnostic' if is_context_agnostic else 'context aware'))
|
| 23 |
+
self.load_ppr_for_ned_candidates(is_context_agnostic, is_indexed_for_spans)
|
| 24 |
+
else:
|
| 25 |
+
raise ValueError("Either \'is_kb_yago\' or \'is_ppr_for_ned\' flags must be True!")
|
| 26 |
+
self.is_context_agnostic = is_context_agnostic
|
| 27 |
+
self.is_indexed_for_spans = is_indexed_for_spans
|
| 28 |
+
self.is_kb_yago = is_kb_yago
|
| 29 |
+
self.is_ppr_for_ned = is_ppr_for_ned
|
| 30 |
+
|
| 31 |
+
def load_ppr_for_ned_candidates(self, is_context_agnostic, is_indexed_for_spans):
|
| 32 |
+
if is_context_agnostic:
|
| 33 |
+
file_address = "context_agnostic_mentions.json"
|
| 34 |
+
elif is_indexed_for_spans:
|
| 35 |
+
file_address = "context_aware_spans.json"
|
| 36 |
+
else:
|
| 37 |
+
file_address = "context_aware_mentions.json"
|
| 38 |
+
candidates_a = json.load(open(
|
| 39 |
+
get_resources_dir() / "data" / "candidates" / "aida_testa_pprforned" / file_address, "r"))
|
| 40 |
+
candidates_b = json.load(open(
|
| 41 |
+
get_resources_dir() / "data" / "candidates" / "aida_testb_pprforned" / file_address, "r"))
|
| 42 |
+
if is_context_agnostic:
|
| 43 |
+
for key in candidates_b:
|
| 44 |
+
if key in candidates_a:
|
| 45 |
+
for elem in candidates_b[key]:
|
| 46 |
+
if elem not in candidates_a[key]:
|
| 47 |
+
candidates_a[key].append(elem)
|
| 48 |
+
else:
|
| 49 |
+
candidates_a[key] = candidates_b[key]
|
| 50 |
+
else:
|
| 51 |
+
candidates_a.update(candidates_b)
|
| 52 |
+
self.candidates = candidates_a
|
| 53 |
+
|
| 54 |
+
def load_kb_plus_yago(self):
|
| 55 |
+
self.candidates = json.load(open(
|
| 56 |
+
get_resources_dir() / "data" / "candidates" / "kb_plus_yago_candidates.json", "r"))
|
| 57 |
+
|
| 58 |
+
def _fetch_candidates(self, phrase_annotation, sentence = None):
|
| 59 |
+
candidates = []
|
| 60 |
+
if self.is_kb_yago:
|
| 61 |
+
phrase_to_check = phrase_annotation.word_string.lower()
|
| 62 |
+
if phrase_to_check in self.candidates:
|
| 63 |
+
candidates = self.candidates[phrase_to_check]
|
| 64 |
+
elif self.is_ppr_for_ned:
|
| 65 |
+
# TODO lower-cased check mention surface forms
|
| 66 |
+
span_key = f"({phrase_annotation.begin_character}, {phrase_annotation.end_character})"
|
| 67 |
+
if self.is_context_agnostic and phrase_annotation.word_string in self.candidates:
|
| 68 |
+
candidates = self.candidates[phrase_annotation.word_string]
|
| 69 |
+
elif not self.is_context_agnostic and sentence in self.candidates:
|
| 70 |
+
if self.is_indexed_for_spans and span_key in self.candidates[sentence]:
|
| 71 |
+
candidates = self.candidates[sentence][span_key]
|
| 72 |
+
elif not self.is_indexed_for_spans and phrase_annotation.word_string in self.candidates[sentence]:
|
| 73 |
+
candidates = self.candidates[sentence][phrase_annotation.word_string]
|
| 74 |
+
return candidates
|
| 75 |
+
|
| 76 |
+
def modify_phrase_annotation_using_candidates(self, phrase_annotation: PhraseAnnotation, sentence: str = None):
|
| 77 |
+
"""
|
| 78 |
+
The method post processes the :param phrase_annotation: found in a :param sentence: to make sure it is bound to
|
| 79 |
+
the predefined {self.candidates} set.
|
| 80 |
+
It is not possible to perform candidate look up for spans in context agnostic scenario
|
| 81 |
+
so {self.is_indexed_for_spans} will only be considered where {self.is_context_agnostic} is False.
|
| 82 |
+
"""
|
| 83 |
+
if self.candidates is None or phrase_annotation.resolved_annotation == 0:
|
| 84 |
+
return
|
| 85 |
+
candidates = self._fetch_candidates(phrase_annotation, sentence)
|
| 86 |
+
if not candidates:
|
| 87 |
+
phrase_annotation.set_alternative_as_resolved_annotation(0)
|
| 88 |
+
return
|
| 89 |
+
if self.is_kb_yago:
|
| 90 |
+
candidates_ = [self.mentions_vocab[x[0]] for x in candidates if x[0] in self.mentions_vocab]
|
| 91 |
+
prior_probabilities_ = [x[1] for x in candidates if x[0] in self.mentions_vocab]
|
| 92 |
+
else:
|
| 93 |
+
candidates_ = [self.mentions_vocab[x] for x in candidates if x in self.mentions_vocab]
|
| 94 |
+
prior_probabilities_ = [1.0 for x in candidates if x in self.mentions_vocab]
|
| 95 |
+
# TODO use the prior_probabilities_ to adjust the probabilities
|
| 96 |
+
if candidates_:
|
| 97 |
+
all_p_anns = phrase_annotation.all_possible_annotations()
|
| 98 |
+
filtered_p_predictions = sorted(
|
| 99 |
+
[x for x in all_p_anns if x[0] in candidates_], key=lambda y: y[1], reverse=True)
|
| 100 |
+
if filtered_p_predictions:
|
| 101 |
+
phrase_annotation.set_alternative_as_resolved_annotation(filtered_p_predictions[0][0])
|
| 102 |
+
else:
|
| 103 |
+
phrase_annotation.set_alternative_as_resolved_annotation(0)
|
configuration.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import torch
|
| 3 |
+
import pathlib
|
| 4 |
+
import json
|
| 5 |
+
from datetime import date
|
| 6 |
+
|
| 7 |
+
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
| 8 |
+
|
| 9 |
+
AIDA_CANONICAL_REDIRECTS = None
|
| 10 |
+
OOD_CANONICAL_REDIRECTS = None
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def get_base_model_name():
|
| 14 |
+
return open("base_model.cfg", "r").read().strip()
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def get_project_top_dir():
|
| 18 |
+
return pathlib.Path(os.path.abspath(__file__)).parent
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def get_resources_dir():
|
| 22 |
+
return get_project_top_dir() / 'resources'
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def get_checkpoints_dir():
|
| 26 |
+
path_ = get_project_top_dir() / '.checkpoints'
|
| 27 |
+
if not os.path.exists(path_):
|
| 28 |
+
os.mkdir(path_)
|
| 29 |
+
return path_
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def get_logdir_dir():
|
| 33 |
+
path_ = get_project_top_dir() / '.logdir'
|
| 34 |
+
if not os.path.exists(path_):
|
| 35 |
+
os.mkdir(path_)
|
| 36 |
+
return path_
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def get_aida_train_canonical_redirects():
|
| 40 |
+
global AIDA_CANONICAL_REDIRECTS
|
| 41 |
+
if not AIDA_CANONICAL_REDIRECTS:
|
| 42 |
+
r_file = get_resources_dir() / "data" / "aida_canonical_redirects.json"
|
| 43 |
+
with r_file.open() as f:
|
| 44 |
+
AIDA_CANONICAL_REDIRECTS = json.load(f)
|
| 45 |
+
return AIDA_CANONICAL_REDIRECTS
|
| 46 |
+
|
| 47 |
+
def get_ood_canonical_redirects():
|
| 48 |
+
global OOD_CANONICAL_REDIRECTS
|
| 49 |
+
if not OOD_CANONICAL_REDIRECTS:
|
| 50 |
+
r_file = get_resources_dir() / "data" / "ood_canonical_redirects.json"
|
| 51 |
+
with r_file.open() as f:
|
| 52 |
+
OOD_CANONICAL_REDIRECTS = json.load(f)
|
| 53 |
+
return OOD_CANONICAL_REDIRECTS
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
def get_aida_yago_tsv_file_path():
|
| 57 |
+
return get_resources_dir() / "data" / "AIDA-YAGO2-dataset.tsv"
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def get_exec_run_file():
|
| 61 |
+
return get_logdir_dir() / f"annotator_log-{date.today().strftime('%Y-%b-%d')}.log"
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
def get_aida_vocab():
|
| 65 |
+
mentions_vocab = dict({'|||O|||': 0, '<pad>': 1})
|
| 66 |
+
dictionary_file = get_resources_dir() / "vocab" / "aida.txt"
|
| 67 |
+
dfile = dictionary_file.open("r")
|
| 68 |
+
for _ad_element in dfile.read().split("\n"):
|
| 69 |
+
mentions_vocab[_ad_element] = len(mentions_vocab)
|
| 70 |
+
return mentions_vocab
|
| 71 |
+
|
| 72 |
+
def get_ood_vocab():
|
| 73 |
+
# This function might be used if one is interested in testing out the "masking all the candidates not in our
|
| 74 |
+
# expected entity set" which is mentioned in the footnote of section 4.1 of the paper.
|
| 75 |
+
mentions_vocab = dict({'|||O|||': 0, '<pad>': 1})
|
| 76 |
+
dictionary_file = get_resources_dir() / "vocab" / "out_of_domain.txt"
|
| 77 |
+
dfile = dictionary_file.open("r")
|
| 78 |
+
for _ad_element in dfile.read().split("\n"):
|
| 79 |
+
mentions_vocab[_ad_element] = len(mentions_vocab)
|
| 80 |
+
return mentions_vocab
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
def get_aida_plus_wikipedia_vocab():
|
| 84 |
+
mentions_vocab = get_aida_vocab()
|
| 85 |
+
dictionary_file = get_resources_dir() / "vocab" / f"enwiki_20230827.txt"
|
| 86 |
+
dfile = dictionary_file.open("r")
|
| 87 |
+
for _ad_element in dfile.read().split("\n"):
|
| 88 |
+
if _ad_element not in mentions_vocab:
|
| 89 |
+
mentions_vocab[_ad_element] = len(mentions_vocab)
|
| 90 |
+
return mentions_vocab
|
| 91 |
+
|
| 92 |
+
def get_aida_plus_wikipedia_plus_out_of_domain_vocab():
|
| 93 |
+
mentions_vocab = get_aida_plus_wikipedia_vocab()
|
| 94 |
+
dictionary_file = get_resources_dir() / "vocab" / f"out_of_domain.txt"
|
| 95 |
+
dfile = dictionary_file.open("r")
|
| 96 |
+
for _ad_element in dfile.read().split("\n"):
|
| 97 |
+
if _ad_element not in mentions_vocab:
|
| 98 |
+
mentions_vocab[_ad_element] = len(mentions_vocab)
|
| 99 |
+
return mentions_vocab
|
| 100 |
+
|
| 101 |
+
def get_n3_entity_to_kb_mappings():
|
| 102 |
+
kb_file = get_resources_dir() / "data" / "n3_kb_mappings.json"
|
| 103 |
+
knowledge_base = json.load(kb_file.open("r"))
|
| 104 |
+
return knowledge_base
|
data_loader.py
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
The enwiki/conll Dataset reader/provider using torchtext.
|
| 3 |
+
The datasets were crated using the scripts from:
|
| 4 |
+
https://github.com/samuelbroscheit/entity_knowledge_in_bert/tree/master/bert_entity/preprocessing
|
| 5 |
+
The get_dataset.collate_batch function is influenced by:
|
| 6 |
+
https://raw.githubusercontent.com/samuelbroscheit/entity_knowledge_in_bert/master/bert_entity/data_loader_wiki.py
|
| 7 |
+
|
| 8 |
+
Please note that the pre-processed fine-tuning data will be automatically downloaded upon instantiation of the data
|
| 9 |
+
readers and the result will be saved under /home/<user_name>/.cache/torch/text/datasets/ (in linux systems)
|
| 10 |
+
|
| 11 |
+
The expected sizes of the auto-downloaded datasets:
|
| 12 |
+
- Step 1 (general knowledge fine-tuning):
|
| 13 |
+
enwiki-2023-spel-roberta-tokenized-aug-27-2023.tar.gz: 19.1 GBs
|
| 14 |
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
| 15 |
+
* You can delete the file above once fine-tuning step 1 is done, and you are moving on to step 2. *
|
| 16 |
+
* in the cleaning up process, make sure you remove the cached validation set files under .checkpoints *
|
| 17 |
+
* directory as well *
|
| 18 |
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
| 19 |
+
- Step 2 (general knowledge fine-tuning):
|
| 20 |
+
enwiki-2023-spel-roberta-tokenized-aug-27-2023-retokenized.tar.gz: 17.5 GBs
|
| 21 |
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
| 22 |
+
* You can delete the file above once fine-tuning step 2 is done, and you are moving on to step 3. *
|
| 23 |
+
* in the cleaning up process, make sure you remove the cached validation set files under .checkpoints *
|
| 24 |
+
* directory as well *
|
| 25 |
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
| 26 |
+
- Step 3 (domain specific fine-tuning):
|
| 27 |
+
aida-conll-spel-roberta-tokenized-aug-23-2023.tar.gz: 5.1 MBs
|
| 28 |
+
|
| 29 |
+
No extra preprocessing step will be required, as soon as you start the fine-tuning script for each step,
|
| 30 |
+
the proper fine-tuning dataset will be downloaded and will be served **without** the need for unzipping.
|
| 31 |
+
"""
|
| 32 |
+
import os
|
| 33 |
+
import json
|
| 34 |
+
import numpy
|
| 35 |
+
from functools import partial
|
| 36 |
+
from collections import OrderedDict
|
| 37 |
+
from tqdm import tqdm
|
| 38 |
+
from typing import Union, Tuple
|
| 39 |
+
|
| 40 |
+
import torch
|
| 41 |
+
from torch.utils.data import DataLoader, Dataset
|
| 42 |
+
from torch.utils.data.distributed import DistributedSampler
|
| 43 |
+
from torchdata.datapipes.iter import FileOpener, IterableWrapper, HttpReader, FileLister
|
| 44 |
+
from torchtext.data.datasets_utils import _wrap_split_argument, _create_dataset_directory
|
| 45 |
+
from torchtext.utils import download_from_url
|
| 46 |
+
|
| 47 |
+
from transformers import AutoTokenizer, BatchEncoding
|
| 48 |
+
|
| 49 |
+
from configuration import (get_aida_plus_wikipedia_plus_out_of_domain_vocab, get_aida_train_canonical_redirects,
|
| 50 |
+
get_aida_vocab, get_ood_vocab, get_checkpoints_dir, get_base_model_name, device)
|
| 51 |
+
|
| 52 |
+
BERT_MODEL_NAME = get_base_model_name()
|
| 53 |
+
MAX_SPAN_ANNOTATION_SIZE = 4
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
class StaticAccess:
|
| 57 |
+
def __init__(self):
|
| 58 |
+
self.mentions_vocab, self.mentions_itos = None, None
|
| 59 |
+
self.set_vocab_and_itos_to_all()
|
| 60 |
+
self.aida_canonical_redirects = get_aida_train_canonical_redirects()
|
| 61 |
+
self._all_vocab_mask_for_aida = None
|
| 62 |
+
self._all_vocab_mask_for_ood = None
|
| 63 |
+
|
| 64 |
+
def set_vocab_and_itos_to_all(self):
|
| 65 |
+
self.mentions_vocab = get_aida_plus_wikipedia_plus_out_of_domain_vocab()
|
| 66 |
+
self.mentions_itos = [w[0] for w in sorted(self.mentions_vocab.items(), key=lambda x: x[1])]
|
| 67 |
+
|
| 68 |
+
@staticmethod
|
| 69 |
+
def get_aida_vocab_and_itos():
|
| 70 |
+
aida_mentions_vocab = get_aida_vocab()
|
| 71 |
+
aida_mentions_itos = [w[0] for w in sorted(aida_mentions_vocab.items(), key=lambda x: x[1])]
|
| 72 |
+
return aida_mentions_vocab, aida_mentions_itos
|
| 73 |
+
|
| 74 |
+
def shrink_vocab_to_aida(self):
|
| 75 |
+
self.mentions_vocab, self.mentions_itos = self.get_aida_vocab_and_itos()
|
| 76 |
+
|
| 77 |
+
def get_all_vocab_mask_for_aida(self):
|
| 78 |
+
if self._all_vocab_mask_for_aida is None:
|
| 79 |
+
mentions_vocab = get_aida_plus_wikipedia_plus_out_of_domain_vocab()
|
| 80 |
+
mask = torch.ones(len(mentions_vocab)).to(device)
|
| 81 |
+
mask = mask * -10000
|
| 82 |
+
mask[torch.Tensor([mentions_vocab[x] for x in get_aida_vocab()]).long()] = 0
|
| 83 |
+
self._all_vocab_mask_for_aida = mask
|
| 84 |
+
return self._all_vocab_mask_for_aida
|
| 85 |
+
|
| 86 |
+
def get_all_vocab_mask_for_ood(self):
|
| 87 |
+
if self._all_vocab_mask_for_ood is None:
|
| 88 |
+
mentions_vocab = get_aida_plus_wikipedia_plus_out_of_domain_vocab()
|
| 89 |
+
mask = torch.ones(len(mentions_vocab)).to(device)
|
| 90 |
+
mask = mask * -10000
|
| 91 |
+
mask[torch.Tensor([mentions_vocab[x] for x in get_ood_vocab()]).long()] = 0
|
| 92 |
+
self._all_vocab_mask_for_ood = mask
|
| 93 |
+
return self._all_vocab_mask_for_ood
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
dl_sa = StaticAccess()
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
class ENWIKI20230827Config:
|
| 100 |
+
URL = "https://1sfu-my.sharepoint.com/:u:/g/personal/sshavara_sfu_ca/Ea3IVbOpkTJKpASNyL9aFGMBQpH0ABU2hQa-wYyakkZ9TQ?e=DJFF3v&download=1"
|
| 101 |
+
MD5 = "eb9a54a8f1f858cdcbf6c750942a896f"
|
| 102 |
+
PATH = "enwiki-2023-spel-roberta-tokenized-aug-27-2023.tar.gz"
|
| 103 |
+
DATASET_NAME = "WIKIPEDIA20230827"
|
| 104 |
+
NUM_LINES = {'train': 3055221, 'valid': 1000, 'test': 1000}
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
class ENWIKI20230827V2Config:
|
| 108 |
+
URL = 'https://1sfu-my.sharepoint.com/:u:/g/personal/sshavara_sfu_ca/EeS_Tgl_CFJNiTh6YH5IDrsBocEZUsZV3lxPB6pleTxyxw?e=caH1cf&download=1'
|
| 109 |
+
MD5 = "83a37f528800a463cd1a376e80ffc744"
|
| 110 |
+
PATH = "enwiki-2023-spel-roberta-tokenized-aug-27-2023-retokenized.tar.gz"
|
| 111 |
+
DATASET_NAME = "WIKIPEDIA20230827V2"
|
| 112 |
+
NUM_LINES = {'train': 3038581, 'valid': 996}
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
class AIDA20230827Config:
|
| 116 |
+
URL = "https://1sfu-my.sharepoint.com/:u:/g/personal/sshavara_sfu_ca/EajEGYyf8LBOoxqDaiPBvbgBwFuEC08nssvZwGJWsG_HXg?e=wAwV6H&download=1"
|
| 117 |
+
MD5 = "8078529d5df96d0d1ecf6a505fdb767a"
|
| 118 |
+
PATH = "aida-conll-spel-roberta-tokenized-aug-23-2023.tar.gz"
|
| 119 |
+
DATASET_NAME = "AIDA20230827"
|
| 120 |
+
NUM_LINES = {'train': 1585, 'valid': 391, 'test': 372}
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
tokenizer = AutoTokenizer.from_pretrained(BERT_MODEL_NAME, cache_dir=get_checkpoints_dir() / "hf")
|
| 124 |
+
|
| 125 |
+
WIKI_EXTRACTED_FILES = {"train": "train.json", "valid": "valid.json", "test": " test.json"}
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
def wiki_filter_fn(split, fname_and_stream):
|
| 129 |
+
return WIKI_EXTRACTED_FILES[split] in fname_and_stream[0]
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
def wiki_data_record_convert(line):
|
| 133 |
+
element = json.loads(line)
|
| 134 |
+
r = {'tokens': element['tokens'], 'mentions': [], 'mention_entity_probs': [], 'mention_probs': []}
|
| 135 |
+
for token, mentions, mention_entity_probs, mention_probs in zip(element['tokens'], element['mentions'],
|
| 136 |
+
element['mention_entity_probs'],
|
| 137 |
+
element['mention_probs']):
|
| 138 |
+
if len(mention_probs) < len(mentions):
|
| 139 |
+
mention_probs.extend([1.0 for _ in range(len(mentions) - len(mention_probs))])
|
| 140 |
+
sorted_mentions = sorted(list(zip(mentions, mention_entity_probs, mention_probs)),
|
| 141 |
+
key=lambda x: x[1], reverse=True)
|
| 142 |
+
mentions_ = [dl_sa.aida_canonical_redirects[x[0]] if x[0] in dl_sa.aida_canonical_redirects else x[0]
|
| 143 |
+
for x in sorted_mentions if x[0]] # ignore mentions that are None
|
| 144 |
+
mention_entity_probs_ = [x[1] for x in sorted_mentions if x[0]] # ignore prob. for None mentions
|
| 145 |
+
mention_probs_ = [x[2] for x in sorted_mentions if x[0]] # ignore m_probs for None mentions
|
| 146 |
+
r['mentions'].append(mentions_[:MAX_SPAN_ANNOTATION_SIZE])
|
| 147 |
+
r['mention_probs'].append(mention_probs_[:MAX_SPAN_ANNOTATION_SIZE])
|
| 148 |
+
r['mention_entity_probs'].append(mention_entity_probs_[:MAX_SPAN_ANNOTATION_SIZE])
|
| 149 |
+
if len(mentions_) > MAX_SPAN_ANNOTATION_SIZE:
|
| 150 |
+
r['mention_entity_probs'][-1] = [x / sum(r['mention_entity_probs'][-1])
|
| 151 |
+
for x in r['mention_entity_probs'][-1]]
|
| 152 |
+
return r
|
| 153 |
+
|
| 154 |
+
@_create_dataset_directory(dataset_name=ENWIKI20230827Config.DATASET_NAME)
|
| 155 |
+
@_wrap_split_argument(("train", "valid", "test"))
|
| 156 |
+
def ENWIKI20230827(root: str, split: Union[Tuple[str], str]):
|
| 157 |
+
root = root if root else ".data"
|
| 158 |
+
path = root + "/" + ENWIKI20230827Config.PATH
|
| 159 |
+
if not os.path.exists(path):
|
| 160 |
+
download_from_url(ENWIKI20230827Config.URL, root=root, path=path, hash_value=ENWIKI20230827Config.MD5,
|
| 161 |
+
hash_type='md5')
|
| 162 |
+
online_reader_dp = FileLister(root, ENWIKI20230827Config.PATH)
|
| 163 |
+
tar_file_dp = FileOpener(online_reader_dp, mode="b").load_from_tar().filter(
|
| 164 |
+
partial(wiki_filter_fn, split)).readlines(return_path=False).map(wiki_data_record_convert)
|
| 165 |
+
return tar_file_dp
|
| 166 |
+
|
| 167 |
+
@_create_dataset_directory(dataset_name=ENWIKI20230827V2Config.DATASET_NAME)
|
| 168 |
+
@_wrap_split_argument(("train", "valid"))
|
| 169 |
+
def ENWIKI20230827V2(root: str, split: Union[Tuple[str], str]):
|
| 170 |
+
root = root if root else ".data"
|
| 171 |
+
path = root + "/" + ENWIKI20230827V2Config.PATH
|
| 172 |
+
if not os.path.exists(path):
|
| 173 |
+
download_from_url(ENWIKI20230827V2Config.URL, root=root, path=path, hash_value=ENWIKI20230827V2Config.MD5,
|
| 174 |
+
hash_type='md5')
|
| 175 |
+
online_reader_dp = FileLister(root, ENWIKI20230827V2Config.PATH)
|
| 176 |
+
tar_file_dp = FileOpener(online_reader_dp, mode="b").load_from_tar().filter(
|
| 177 |
+
partial(wiki_filter_fn, split)).readlines(return_path=False).map(wiki_data_record_convert)
|
| 178 |
+
return tar_file_dp
|
| 179 |
+
|
| 180 |
+
def aida_path_fn(r, _=None):
|
| 181 |
+
return os.path.join(r, AIDA20230827Config.PATH)
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
def aida_select_split(s, file_name_data):
|
| 185 |
+
return file_name_data[1][s]
|
| 186 |
+
|
| 187 |
+
|
| 188 |
+
def aida_data_record_convert(r):
|
| 189 |
+
for x in r: # making sure each token comes with exactly one annotation
|
| 190 |
+
assert len(x) == 7 or len(x) == 8 # whether it contains the candidates or not
|
| 191 |
+
return {"tokens": [x[0] for x in r], "mentions": [[x[4] if x[4] else "|||O|||"] for x in r],
|
| 192 |
+
"mention_entity_probs": [[1.0] for _ in r], "mention_probs": [[1.0] for _ in r],
|
| 193 |
+
"candidates": [x[7] if x[7] else [] for x in r] if len(x) == 8 else [[] for x in r]}
|
| 194 |
+
|
| 195 |
+
|
| 196 |
+
@_create_dataset_directory(dataset_name=AIDA20230827Config.DATASET_NAME)
|
| 197 |
+
@_wrap_split_argument(('train', 'valid', 'test'))
|
| 198 |
+
def AIDA20230827(root, split):
|
| 199 |
+
online_reader_dp = HttpReader(IterableWrapper([AIDA20230827Config.URL])).on_disk_cache(
|
| 200 |
+
filepath_fn=partial(aida_path_fn, root), hash_dict={aida_path_fn(root): AIDA20230827Config.MD5},
|
| 201 |
+
hash_type="md5").end_caching(mode="wb", same_filepath_fn=True)
|
| 202 |
+
return FileOpener(online_reader_dp, mode="b").load_from_tar().parse_json_files().flatmap(
|
| 203 |
+
partial(aida_select_split, split)).map(aida_data_record_convert)
|
| 204 |
+
|
| 205 |
+
|
| 206 |
+
class DistributableDataset(Dataset):
|
| 207 |
+
"""
|
| 208 |
+
Based on the documentations in torch.utils.data.DataLoader, `IterableDataset` does not support custom `sampler`
|
| 209 |
+
Therefore we cannot use the DistributedSampler with the DataLoader to split the data samples.
|
| 210 |
+
This class is a workaround to make the IterableDataset work with the DistributedSampler.
|
| 211 |
+
"""
|
| 212 |
+
def __init__(self, dataset, size, world_size, rank):
|
| 213 |
+
self.size = size
|
| 214 |
+
self.data = iter(dataset)
|
| 215 |
+
self.world_size = world_size
|
| 216 |
+
self.rank = rank
|
| 217 |
+
self.initial_fetch = True
|
| 218 |
+
|
| 219 |
+
def __len__(self):
|
| 220 |
+
return self.size
|
| 221 |
+
|
| 222 |
+
def __getitem__(self, index):
|
| 223 |
+
# Since we don't have a means of accessing the data by indices, we try skipping the indices that we believe
|
| 224 |
+
# belong to other processes
|
| 225 |
+
skip_size = self.rank if self.initial_fetch else self.world_size - 1
|
| 226 |
+
self.initial_fetch = False
|
| 227 |
+
for _ in range(skip_size):
|
| 228 |
+
next(self.data)
|
| 229 |
+
return next(self.data)
|
| 230 |
+
|
| 231 |
+
|
| 232 |
+
def convert_is_in_mention_to_bioes(is_in_mention):
|
| 233 |
+
# B = 0, I = 1, O = 2, E = 3, S = 4
|
| 234 |
+
bioes = []
|
| 235 |
+
for iim, current in enumerate(is_in_mention):
|
| 236 |
+
before = is_in_mention[iim - 1] if iim > 0 else 0
|
| 237 |
+
after = is_in_mention[iim + 1] if iim < len(is_in_mention) - 1 else 0
|
| 238 |
+
bioes.append(
|
| 239 |
+
2 if not current else (4 if not before and not after else (0 if not before else (3 if not after else 1))))
|
| 240 |
+
return bioes
|
| 241 |
+
|
| 242 |
+
|
| 243 |
+
def get_dataset(dataset_name: str, split: str, batch_size: int, get_labels_with_high_model_score=None,
|
| 244 |
+
label_size: int = 0, load_distributed: bool = False, world_size: int = 1, rank: int = 0,
|
| 245 |
+
use_retokenized_wikipedia_data: bool = False):
|
| 246 |
+
"""
|
| 247 |
+
:param dataset_name: The dataset name can either be "enwiki" or "aida"
|
| 248 |
+
:param split: the requested dataset split which can be 'train', 'valid' or 'test'
|
| 249 |
+
:param batch_size: the size of the resulting batch from the data loader
|
| 250 |
+
:param get_labels_with_high_model_score: The function that finds high scoring negative samples for the model
|
| 251 |
+
:param label_size: The maximum output distribution size. You can pass the output vocabulary size for this parameter.
|
| 252 |
+
:param load_distributed: The flag hinting whether the data loader will be loaded in a multi-gpu setting.
|
| 253 |
+
:param world_size: the number of machines that the dataloader is expected to serve.
|
| 254 |
+
:param rank: the rank of the gpu on which the data is expected to be served.
|
| 255 |
+
:param use_retokenized_wikipedia_data: a flag indicating whether to use ENWIKI20230827 dataset or ENWIKI20230827V2
|
| 256 |
+
"""
|
| 257 |
+
|
| 258 |
+
assert dataset_name in ["enwiki", "aida"]
|
| 259 |
+
if not load_distributed or rank == 0:
|
| 260 |
+
print(f"Initializing the {dataset_name.upper()}/{split} dataset ...")
|
| 261 |
+
|
| 262 |
+
def collate_batch(batch):
|
| 263 |
+
data = {}
|
| 264 |
+
for key in ["tokens", "mentions", "mention_entity_probs", "eval_mask", "candidates", "is_in_mention", "bioes"]:
|
| 265 |
+
data[key] = []
|
| 266 |
+
for annotated_line_in_file in batch:
|
| 267 |
+
data["tokens"].append(tokenizer.convert_tokens_to_ids(annotated_line_in_file["tokens"]))
|
| 268 |
+
data["mentions"].append([
|
| 269 |
+
[(dl_sa.mentions_vocab[x] if x not in dl_sa.aida_canonical_redirects else
|
| 270 |
+
dl_sa.mentions_vocab[dl_sa.aida_canonical_redirects[x]])
|
| 271 |
+
if x is not None and x not in ['Gmina_Żabno'] else dl_sa.mentions_vocab["|||O|||"] for x in el]
|
| 272 |
+
for el in annotated_line_in_file["mentions"]
|
| 273 |
+
])
|
| 274 |
+
data["mention_entity_probs"].append(annotated_line_in_file["mention_entity_probs"])
|
| 275 |
+
data["eval_mask"].append(list(map(
|
| 276 |
+
lambda item: 1 if len(item) == 1 else 0, annotated_line_in_file["mention_probs"])))
|
| 277 |
+
is_in_mention = [1 if x != '|||O|||' else 0 for el, elp in zip(
|
| 278 |
+
annotated_line_in_file["mentions"], annotated_line_in_file["mention_entity_probs"])
|
| 279 |
+
for x, y in zip(el, elp) if y == max(elp)]
|
| 280 |
+
data["is_in_mention"].append(is_in_mention)
|
| 281 |
+
data["bioes"].append(convert_is_in_mention_to_bioes(is_in_mention))
|
| 282 |
+
|
| 283 |
+
maxlen = max([len(x) for x in data["tokens"]])
|
| 284 |
+
token_ids = torch.LongTensor([sample + [0] * (maxlen - len(sample)) for sample in data["tokens"]])
|
| 285 |
+
eval_mask = torch.LongTensor([sample + [0] * (maxlen - len(sample)) for sample in data["eval_mask"]])
|
| 286 |
+
is_in_mention = torch.LongTensor([sample + [0] * (maxlen - len(sample)) for sample in data["is_in_mention"]])
|
| 287 |
+
bioes = torch.LongTensor([sample + [2] * (maxlen - len(sample)) for sample in data["bioes"]])
|
| 288 |
+
if get_labels_with_high_model_score:
|
| 289 |
+
labels_with_high_model_score = get_labels_with_high_model_score(token_ids)
|
| 290 |
+
else:
|
| 291 |
+
labels_with_high_model_score = None
|
| 292 |
+
subword_mentions = create_output_with_negative_examples(
|
| 293 |
+
data["mentions"], data["mention_entity_probs"], token_ids.size(0), token_ids.size(1),
|
| 294 |
+
len(dl_sa.mentions_vocab), label_size, labels_with_high_model_score)
|
| 295 |
+
inputs = BatchEncoding({
|
| 296 |
+
'token_ids': token_ids,
|
| 297 |
+
'eval_mask': eval_mask,
|
| 298 |
+
'raw_mentions': data["mentions"],
|
| 299 |
+
'is_in_mention': is_in_mention,
|
| 300 |
+
"bioes": bioes
|
| 301 |
+
})
|
| 302 |
+
return inputs, subword_mentions
|
| 303 |
+
if not load_distributed or rank == 0:
|
| 304 |
+
print(f"Done initializing the {dataset_name.upper()}/{split} dataset ...")
|
| 305 |
+
wikipedia_dataset = ENWIKI20230827
|
| 306 |
+
wikipedia_dataset_config = ENWIKI20230827Config
|
| 307 |
+
retokenized_wikipedia_dataset = ENWIKI20230827V2
|
| 308 |
+
retokenized_wikipedia_dataset_config = ENWIKI20230827V2Config
|
| 309 |
+
aida_dataset = AIDA20230827
|
| 310 |
+
aida_dataset_config = AIDA20230827Config
|
| 311 |
+
dset_class = (retokenized_wikipedia_dataset if use_retokenized_wikipedia_data else wikipedia_dataset) \
|
| 312 |
+
if dataset_name == "enwiki" else aida_dataset
|
| 313 |
+
d_size = (retokenized_wikipedia_dataset_config.NUM_LINES[split] if use_retokenized_wikipedia_data else
|
| 314 |
+
wikipedia_dataset_config.NUM_LINES[split]) \
|
| 315 |
+
if dataset_name == "enwiki" else aida_dataset_config.NUM_LINES[split]
|
| 316 |
+
dataset_ = DistributableDataset(dset_class(split=split, root=get_checkpoints_dir()), d_size, world_size, rank) \
|
| 317 |
+
if load_distributed else dset_class(split=split, root=get_checkpoints_dir())
|
| 318 |
+
return DataLoader(dataset_, batch_size=batch_size, collate_fn=collate_batch,
|
| 319 |
+
sampler=DistributedSampler(dataset_, num_replicas=world_size, rank=rank)) \
|
| 320 |
+
if load_distributed and split == "train" else DataLoader(dset_class(split=split, root=get_checkpoints_dir()),
|
| 321 |
+
batch_size=batch_size,
|
| 322 |
+
collate_fn=collate_batch)
|
| 323 |
+
|
| 324 |
+
|
| 325 |
+
def create_output_with_negative_examples(batch_entity_ids, batch_entity_probs, batch_size, maxlen, label_vocab_size,
|
| 326 |
+
label_size, labels_with_high_model_score=None):
|
| 327 |
+
all_entity_ids = OrderedDict()
|
| 328 |
+
for batch_offset, (batch_item_token_item_entity_ids, batch_item_token_entity_probs) in enumerate(
|
| 329 |
+
zip(batch_entity_ids, batch_entity_probs)
|
| 330 |
+
):
|
| 331 |
+
for tok_id, (token_entity_ids, token_entity_probs) in enumerate(
|
| 332 |
+
zip(batch_item_token_item_entity_ids, batch_item_token_entity_probs)
|
| 333 |
+
):
|
| 334 |
+
for eid in token_entity_ids:
|
| 335 |
+
if eid not in all_entity_ids:
|
| 336 |
+
all_entity_ids[eid] = len(all_entity_ids)
|
| 337 |
+
# #####################################################
|
| 338 |
+
shared_label_ids = list(all_entity_ids.keys())
|
| 339 |
+
|
| 340 |
+
if len(shared_label_ids) < label_size and labels_with_high_model_score is not None:
|
| 341 |
+
negative_examples = set(labels_with_high_model_score)
|
| 342 |
+
negative_examples.difference_update(shared_label_ids)
|
| 343 |
+
shared_label_ids += list(negative_examples)
|
| 344 |
+
|
| 345 |
+
if len(shared_label_ids) < label_size:
|
| 346 |
+
negative_samples = set(numpy.random.choice(label_vocab_size, label_size, replace=False))
|
| 347 |
+
negative_samples.difference_update(shared_label_ids)
|
| 348 |
+
shared_label_ids += list(negative_samples)
|
| 349 |
+
|
| 350 |
+
shared_label_ids = shared_label_ids[: label_size]
|
| 351 |
+
|
| 352 |
+
all_batch_entity_ids, batch_shared_label_ids = all_entity_ids, shared_label_ids
|
| 353 |
+
if label_size > 0:
|
| 354 |
+
label_probs = torch.zeros(batch_size, maxlen, len(batch_shared_label_ids))
|
| 355 |
+
else:
|
| 356 |
+
label_probs = torch.zeros(batch_size, maxlen, label_vocab_size)
|
| 357 |
+
# loop through the batch x tokens x (label_ids, label_probs)
|
| 358 |
+
for batch_offset, (batch_item_token_item_entity_ids, batch_item_token_entity_probs) in enumerate(
|
| 359 |
+
zip(batch_entity_ids, batch_entity_probs)
|
| 360 |
+
):
|
| 361 |
+
# loop through tokens x (label_ids, label_probs)
|
| 362 |
+
for tok_id, (token_entity_ids, token_entity_probs) in enumerate(
|
| 363 |
+
zip(batch_item_token_item_entity_ids, batch_item_token_entity_probs)):
|
| 364 |
+
if label_size is None:
|
| 365 |
+
label_probs[batch_offset][tok_id][torch.LongTensor(token_entity_ids)] = torch.Tensor(
|
| 366 |
+
batch_item_token_item_entity_ids)
|
| 367 |
+
else:
|
| 368 |
+
label_probs[batch_offset][tok_id][
|
| 369 |
+
torch.LongTensor(list(map(all_batch_entity_ids.__getitem__, token_entity_ids)))
|
| 370 |
+
] = torch.Tensor(token_entity_probs)
|
| 371 |
+
|
| 372 |
+
label_ids = torch.LongTensor(batch_shared_label_ids)
|
| 373 |
+
return BatchEncoding({
|
| 374 |
+
"ids": label_ids, # of size label_size
|
| 375 |
+
"probs": label_probs, # of size input_batch_size x input_max_len x label_size
|
| 376 |
+
"dictionary": {v: k for k, v in all_batch_entity_ids.items()} # contains all original ids for mentions in batch
|
| 377 |
+
})
|
| 378 |
+
|
| 379 |
+
|
| 380 |
+
def _make_vocab_file():
|
| 381 |
+
wiki_vocab = set()
|
| 382 |
+
vocab_file = open("enwiki_20230827.txt", "w")
|
| 383 |
+
for spl in ['train', 'valid', 'test']:
|
| 384 |
+
for el in tqdm(ENWIKI20230827(split=spl, root=get_checkpoints_dir())):
|
| 385 |
+
for x in el['mentions']:
|
| 386 |
+
for y in x:
|
| 387 |
+
if y not in wiki_vocab:
|
| 388 |
+
vocab_file.write(f"{y}\n")
|
| 389 |
+
wiki_vocab.add(y)
|
| 390 |
+
vocab_file.close()
|
decao_eval.py
ADDED
|
@@ -0,0 +1,1391 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
This file serves as a standalone evaluation provider for evaluating the predictions of a entity linking system.
|
| 3 |
+
The content of this module are taken from https://github.com/nicola-decao/efficient-autoregressive-EL and the necessary
|
| 4 |
+
boilerplate code is copied along with the metric classes to help the code act as standalone.
|
| 5 |
+
|
| 6 |
+
To perform evaluation, import the following classes (or any subset of the evaluation metrics that you need):
|
| 7 |
+
MicroF1, MicroPrecision, MicroRecall, MacroRecall, MacroPrecision, MacroF1
|
| 8 |
+
Collect the el_model predictions in the format of {(start_index, end_index, annotation string)} for document d.
|
| 9 |
+
Collect the gold dataset annotations in the format of {(start_index, end_index, annotation string)} for document d.
|
| 10 |
+
Call the metric instances for the two mentioned sets p and g:
|
| 11 |
+
micro_f1(p, g)
|
| 12 |
+
micro_prec(p, g)
|
| 13 |
+
micro_rec(p, g)
|
| 14 |
+
macro_f1(p, g)
|
| 15 |
+
macro_prec(p, g)
|
| 16 |
+
macro_rec(p, g)
|
| 17 |
+
|
| 18 |
+
Once you are done with all the documents and all predictions are added, you may access the evaluation results using:
|
| 19 |
+
{'macro_f1': macro_f1.compute(),
|
| 20 |
+
'macro_prec': macro_prec.compute(),
|
| 21 |
+
'macro_rec': macro_rec.compute(),
|
| 22 |
+
'micro_f1': micro_f1.compute(),
|
| 23 |
+
'micro_prec': micro_prec.compute(),
|
| 24 |
+
'micro_rec': micro_rec.compute()}
|
| 25 |
+
"""
|
| 26 |
+
from abc import ABC, abstractmethod
|
| 27 |
+
from typing import Any, Dict, Hashable, Iterable, Generator, Sequence, Tuple, Union, List, Mapping, Callable, Optional
|
| 28 |
+
import operator as op
|
| 29 |
+
import functools
|
| 30 |
+
import torch
|
| 31 |
+
import torch.nn as nn
|
| 32 |
+
from torch import Tensor
|
| 33 |
+
import torch.nn.functional as F
|
| 34 |
+
from contextlib import contextmanager
|
| 35 |
+
import inspect
|
| 36 |
+
from collections import OrderedDict
|
| 37 |
+
from copy import deepcopy
|
| 38 |
+
from importlib import import_module
|
| 39 |
+
from importlib.util import find_spec
|
| 40 |
+
|
| 41 |
+
from packaging.version import Version
|
| 42 |
+
from pkg_resources import DistributionNotFound, get_distribution
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def dim_zero_sum(x: Tensor) -> Tensor:
|
| 46 |
+
"""summation along the zero dimension."""
|
| 47 |
+
return torch.sum(x, dim=0)
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def dim_zero_mean(x: Tensor) -> Tensor:
|
| 51 |
+
"""average along the zero dimension."""
|
| 52 |
+
return torch.mean(x, dim=0)
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def dim_zero_max(x: Tensor) -> Tensor:
|
| 56 |
+
"""max along the zero dimension."""
|
| 57 |
+
return torch.max(x, dim=0).values
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def dim_zero_min(x: Tensor) -> Tensor:
|
| 61 |
+
"""min along the zero dimension."""
|
| 62 |
+
return torch.min(x, dim=0).values
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def dim_zero_cat(x: Union[Tensor, List[Tensor]]) -> Tensor:
|
| 66 |
+
"""concatenation along the zero dimension."""
|
| 67 |
+
x = x if isinstance(x, (list, tuple)) else [x]
|
| 68 |
+
x = [y.unsqueeze(0) if y.numel() == 1 and y.ndim == 0 else y for y in x]
|
| 69 |
+
if not x: # empty list
|
| 70 |
+
raise ValueError("No samples to concatenate")
|
| 71 |
+
return torch.cat(x, dim=0)
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
def _module_available(module_path: str) -> bool:
|
| 75 |
+
try:
|
| 76 |
+
return find_spec(module_path) is not None
|
| 77 |
+
except AttributeError:
|
| 78 |
+
# Python 3.6
|
| 79 |
+
return False
|
| 80 |
+
except ModuleNotFoundError:
|
| 81 |
+
# Python 3.7+
|
| 82 |
+
return False
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def _compare_version(package: str, op: Callable, version: str) -> Optional[bool]:
|
| 86 |
+
if not _module_available(package):
|
| 87 |
+
return None
|
| 88 |
+
try:
|
| 89 |
+
pkg = import_module(package)
|
| 90 |
+
pkg_version = pkg.__version__ # type: ignore
|
| 91 |
+
except (ModuleNotFoundError, DistributionNotFound):
|
| 92 |
+
return None
|
| 93 |
+
except ImportError:
|
| 94 |
+
# catches cyclic imports - the case with integrated libs
|
| 95 |
+
# see: https://stackoverflow.com/a/32965521
|
| 96 |
+
pkg_version = get_distribution(package).version
|
| 97 |
+
try:
|
| 98 |
+
pkg_version = Version(pkg_version)
|
| 99 |
+
except TypeError:
|
| 100 |
+
# this is mock by sphinx, so it shall return True ro generate all summaries
|
| 101 |
+
return True
|
| 102 |
+
return op(pkg_version, Version(version))
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
class TorchMetricsUserError(Exception):
|
| 106 |
+
"""Error used to inform users of a wrong combinison of Metric API calls."""
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
def _simple_gather_all_tensors(result: Tensor, group: Any, world_size: int) -> List[Tensor]:
|
| 110 |
+
gathered_result = [torch.zeros_like(result) for _ in range(world_size)]
|
| 111 |
+
torch.distributed.all_gather(gathered_result, result, group)
|
| 112 |
+
return gathered_result
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
def gather_all_tensors(result: Tensor, group: Optional[Any] = None) -> List[Tensor]:
|
| 116 |
+
"""Function to gather all tensors from several ddp processes onto a list that is broadcasted to all processes.
|
| 117 |
+
Works on tensors that have the same number of dimensions, but where each dimension may differ. In this case
|
| 118 |
+
tensors are padded, gathered and then trimmed to secure equal workload for all processes.
|
| 119 |
+
|
| 120 |
+
Args:
|
| 121 |
+
result: the value to sync
|
| 122 |
+
group: the process group to gather results from. Defaults to all processes (world)
|
| 123 |
+
|
| 124 |
+
Return:
|
| 125 |
+
gathered_result: list with size equal to the process group where
|
| 126 |
+
gathered_result[i] corresponds to result tensor from process i
|
| 127 |
+
"""
|
| 128 |
+
if group is None:
|
| 129 |
+
group = torch.distributed.group.WORLD
|
| 130 |
+
|
| 131 |
+
# convert tensors to contiguous format
|
| 132 |
+
result = result.contiguous()
|
| 133 |
+
|
| 134 |
+
world_size = torch.distributed.get_world_size(group)
|
| 135 |
+
torch.distributed.barrier(group=group)
|
| 136 |
+
|
| 137 |
+
# if the tensor is scalar, things are easy
|
| 138 |
+
if result.ndim == 0:
|
| 139 |
+
return _simple_gather_all_tensors(result, group, world_size)
|
| 140 |
+
|
| 141 |
+
# 1. Gather sizes of all tensors
|
| 142 |
+
local_size = torch.tensor(result.shape, device=result.device)
|
| 143 |
+
local_sizes = [torch.zeros_like(local_size) for _ in range(world_size)]
|
| 144 |
+
torch.distributed.all_gather(local_sizes, local_size, group=group)
|
| 145 |
+
max_size = torch.stack(local_sizes).max(dim=0).values
|
| 146 |
+
all_sizes_equal = all(all(ls == max_size) for ls in local_sizes)
|
| 147 |
+
|
| 148 |
+
# 2. If shapes are all the same, then do a simple gather:
|
| 149 |
+
if all_sizes_equal:
|
| 150 |
+
return _simple_gather_all_tensors(result, group, world_size)
|
| 151 |
+
|
| 152 |
+
# 3. If not, we need to pad each local tensor to maximum size, gather and then truncate
|
| 153 |
+
pad_dims = []
|
| 154 |
+
pad_by = (max_size - local_size).detach().cpu()
|
| 155 |
+
for val in reversed(pad_by):
|
| 156 |
+
pad_dims.append(0)
|
| 157 |
+
pad_dims.append(val.item())
|
| 158 |
+
result_padded = F.pad(result, pad_dims)
|
| 159 |
+
gathered_result = [torch.zeros_like(result_padded) for _ in range(world_size)]
|
| 160 |
+
torch.distributed.all_gather(gathered_result, result_padded, group)
|
| 161 |
+
for idx, item_size in enumerate(local_sizes):
|
| 162 |
+
slice_param = [slice(dim_size) for dim_size in item_size]
|
| 163 |
+
gathered_result[idx] = gathered_result[idx][slice_param]
|
| 164 |
+
return gathered_result
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
def apply_to_collection(
|
| 168 |
+
data: Any,
|
| 169 |
+
dtype: Union[type, tuple],
|
| 170 |
+
function: Callable,
|
| 171 |
+
*args: Any,
|
| 172 |
+
wrong_dtype: Optional[Union[type, tuple]] = None,
|
| 173 |
+
**kwargs: Any,
|
| 174 |
+
) -> Any:
|
| 175 |
+
"""Recursively applies a function to all elements of a certain dtype.
|
| 176 |
+
|
| 177 |
+
Args:
|
| 178 |
+
data: the collection to apply the function to
|
| 179 |
+
dtype: the given function will be applied to all elements of this dtype
|
| 180 |
+
function: the function to apply
|
| 181 |
+
*args: positional arguments (will be forwarded to calls of ``function``)
|
| 182 |
+
wrong_dtype: the given function won't be applied if this type is specified and the given collections is of
|
| 183 |
+
the :attr:`wrong_type` even if it is of type :attr`dtype`
|
| 184 |
+
**kwargs: keyword arguments (will be forwarded to calls of ``function``)
|
| 185 |
+
|
| 186 |
+
Returns:
|
| 187 |
+
the resulting collection
|
| 188 |
+
|
| 189 |
+
Example:
|
| 190 |
+
>>> apply_to_collection(torch.tensor([8, 0, 2, 6, 7]), dtype=Tensor, function=lambda x: x ** 2)
|
| 191 |
+
tensor([64, 0, 4, 36, 49])
|
| 192 |
+
>>> apply_to_collection([8, 0, 2, 6, 7], dtype=int, function=lambda x: x ** 2)
|
| 193 |
+
[64, 0, 4, 36, 49]
|
| 194 |
+
>>> apply_to_collection(dict(abc=123), dtype=int, function=lambda x: x ** 2)
|
| 195 |
+
{'abc': 15129}
|
| 196 |
+
"""
|
| 197 |
+
elem_type = type(data)
|
| 198 |
+
|
| 199 |
+
# Breaking condition
|
| 200 |
+
if isinstance(data, dtype) and (wrong_dtype is None or not isinstance(data, wrong_dtype)):
|
| 201 |
+
return function(data, *args, **kwargs)
|
| 202 |
+
|
| 203 |
+
# Recursively apply to collection items
|
| 204 |
+
if isinstance(data, Mapping):
|
| 205 |
+
return elem_type({k: apply_to_collection(v, dtype, function, *args, **kwargs) for k, v in data.items()})
|
| 206 |
+
|
| 207 |
+
if isinstance(data, tuple) and hasattr(data, "_fields"): # named tuple
|
| 208 |
+
return elem_type(*(apply_to_collection(d, dtype, function, *args, **kwargs) for d in data))
|
| 209 |
+
|
| 210 |
+
if isinstance(data, Sequence) and not isinstance(data, str):
|
| 211 |
+
return elem_type([apply_to_collection(d, dtype, function, *args, **kwargs) for d in data])
|
| 212 |
+
|
| 213 |
+
# data is neither of dtype, nor a collection
|
| 214 |
+
return data
|
| 215 |
+
|
| 216 |
+
|
| 217 |
+
def _flatten(x: Sequence) -> list:
|
| 218 |
+
return [item for sublist in x for item in sublist]
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
def jit_distributed_available() -> bool:
|
| 222 |
+
return torch.distributed.is_available() and torch.distributed.is_initialized()
|
| 223 |
+
|
| 224 |
+
|
| 225 |
+
class _Metric(nn.Module, ABC):
|
| 226 |
+
__jit_ignored_attributes__ = ["device"]
|
| 227 |
+
__jit_unused_properties__ = ["is_differentiable"]
|
| 228 |
+
is_differentiable: Optional[bool] = None
|
| 229 |
+
higher_is_better: Optional[bool] = None
|
| 230 |
+
|
| 231 |
+
def __init__(
|
| 232 |
+
self,
|
| 233 |
+
compute_on_step: bool = True,
|
| 234 |
+
dist_sync_on_step: bool = False,
|
| 235 |
+
process_group: Optional[Any] = None,
|
| 236 |
+
dist_sync_fn: Callable = None,
|
| 237 |
+
) -> None:
|
| 238 |
+
super().__init__()
|
| 239 |
+
|
| 240 |
+
# see (https://github.com/pytorch/pytorch/blob/3e6bb5233f9ca2c5aa55d9cda22a7ee85439aa6e/
|
| 241 |
+
# torch/nn/modules/module.py#L227)
|
| 242 |
+
torch._C._log_api_usage_once(f"torchmetrics.metric.{self.__class__.__name__}")
|
| 243 |
+
|
| 244 |
+
self._LIGHTNING_GREATER_EQUAL_1_3 = _compare_version("pytorch_lightning", op.ge, "1.3.0")
|
| 245 |
+
self._device = torch.device("cpu")
|
| 246 |
+
|
| 247 |
+
self.dist_sync_on_step = dist_sync_on_step
|
| 248 |
+
self.compute_on_step = compute_on_step
|
| 249 |
+
self.process_group = process_group
|
| 250 |
+
self.dist_sync_fn = dist_sync_fn
|
| 251 |
+
self._to_sync = True
|
| 252 |
+
self._should_unsync = True
|
| 253 |
+
|
| 254 |
+
self._update_signature = inspect.signature(self.update)
|
| 255 |
+
self.update: Callable = self._wrap_update(self.update) # type: ignore
|
| 256 |
+
self.compute: Callable = self._wrap_compute(self.compute) # type: ignore
|
| 257 |
+
self._computed = None
|
| 258 |
+
self._forward_cache = None
|
| 259 |
+
self._update_called = False
|
| 260 |
+
|
| 261 |
+
# initialize state
|
| 262 |
+
self._defaults: Dict[str, Union[List, Tensor]] = {}
|
| 263 |
+
self._persistent: Dict[str, bool] = {}
|
| 264 |
+
self._reductions: Dict[str, Union[str, Callable[[Union[List[Tensor], Tensor]], Tensor], None]] = {}
|
| 265 |
+
|
| 266 |
+
# state management
|
| 267 |
+
self._is_synced = False
|
| 268 |
+
self._cache: Optional[Dict[str, Union[List[Tensor], Tensor]]] = None
|
| 269 |
+
|
| 270 |
+
def add_state(
|
| 271 |
+
self,
|
| 272 |
+
name: str,
|
| 273 |
+
default: Union[list, Tensor],
|
| 274 |
+
dist_reduce_fx: Optional[Union[str, Callable]] = None,
|
| 275 |
+
persistent: bool = False,
|
| 276 |
+
) -> None:
|
| 277 |
+
if not isinstance(default, (Tensor, list)) or (isinstance(default, list) and default):
|
| 278 |
+
raise ValueError("state variable must be a tensor or any empty list (where you can append tensors)")
|
| 279 |
+
|
| 280 |
+
if dist_reduce_fx == "sum":
|
| 281 |
+
dist_reduce_fx = dim_zero_sum
|
| 282 |
+
elif dist_reduce_fx == "mean":
|
| 283 |
+
dist_reduce_fx = dim_zero_mean
|
| 284 |
+
elif dist_reduce_fx == "max":
|
| 285 |
+
dist_reduce_fx = dim_zero_max
|
| 286 |
+
elif dist_reduce_fx == "min":
|
| 287 |
+
dist_reduce_fx = dim_zero_min
|
| 288 |
+
elif dist_reduce_fx == "cat":
|
| 289 |
+
dist_reduce_fx = dim_zero_cat
|
| 290 |
+
elif dist_reduce_fx is not None and not callable(dist_reduce_fx):
|
| 291 |
+
raise ValueError("`dist_reduce_fx` must be callable or one of ['mean', 'sum', 'cat', None]")
|
| 292 |
+
|
| 293 |
+
if isinstance(default, Tensor):
|
| 294 |
+
default = default.contiguous()
|
| 295 |
+
|
| 296 |
+
setattr(self, name, default)
|
| 297 |
+
|
| 298 |
+
self._defaults[name] = deepcopy(default)
|
| 299 |
+
self._persistent[name] = persistent
|
| 300 |
+
self._reductions[name] = dist_reduce_fx
|
| 301 |
+
|
| 302 |
+
@torch.jit.unused
|
| 303 |
+
def forward(self, *args: Any, **kwargs: Any) -> Any:
|
| 304 |
+
"""Automatically calls ``update()``.
|
| 305 |
+
|
| 306 |
+
Returns the metric value over inputs if ``compute_on_step`` is True.
|
| 307 |
+
"""
|
| 308 |
+
# add current step
|
| 309 |
+
if self._is_synced:
|
| 310 |
+
raise TorchMetricsUserError(
|
| 311 |
+
"The Metric shouldn't be synced when performing ``update``. "
|
| 312 |
+
"HINT: Did you forget to call ``unsync`` ?."
|
| 313 |
+
)
|
| 314 |
+
|
| 315 |
+
with torch.no_grad():
|
| 316 |
+
self.update(*args, **kwargs)
|
| 317 |
+
|
| 318 |
+
if self.compute_on_step:
|
| 319 |
+
self._to_sync = self.dist_sync_on_step
|
| 320 |
+
# skip restore cache operation from compute as cache is stored below.
|
| 321 |
+
self._should_unsync = False
|
| 322 |
+
|
| 323 |
+
# save context before switch
|
| 324 |
+
cache = {attr: getattr(self, attr) for attr in self._defaults}
|
| 325 |
+
|
| 326 |
+
# call reset, update, compute, on single batch
|
| 327 |
+
self.reset()
|
| 328 |
+
self.update(*args, **kwargs)
|
| 329 |
+
self._forward_cache = self.compute()
|
| 330 |
+
|
| 331 |
+
# restore context
|
| 332 |
+
for attr, val in cache.items():
|
| 333 |
+
setattr(self, attr, val)
|
| 334 |
+
self._is_synced = False
|
| 335 |
+
|
| 336 |
+
self._should_unsync = True
|
| 337 |
+
self._to_sync = True
|
| 338 |
+
self._computed = None
|
| 339 |
+
|
| 340 |
+
return self._forward_cache
|
| 341 |
+
|
| 342 |
+
def _sync_dist(self, dist_sync_fn: Callable = gather_all_tensors, process_group: Optional[Any] = None) -> None:
|
| 343 |
+
input_dict = {attr: getattr(self, attr) for attr in self._reductions}
|
| 344 |
+
|
| 345 |
+
for attr, reduction_fn in self._reductions.items():
|
| 346 |
+
# pre-concatenate metric states that are lists to reduce number of all_gather operations
|
| 347 |
+
if reduction_fn == dim_zero_cat and isinstance(input_dict[attr], list) and len(input_dict[attr]) > 1:
|
| 348 |
+
input_dict[attr] = [dim_zero_cat(input_dict[attr])]
|
| 349 |
+
|
| 350 |
+
output_dict = apply_to_collection(
|
| 351 |
+
input_dict,
|
| 352 |
+
Tensor,
|
| 353 |
+
dist_sync_fn,
|
| 354 |
+
group=process_group or self.process_group,
|
| 355 |
+
)
|
| 356 |
+
|
| 357 |
+
for attr, reduction_fn in self._reductions.items():
|
| 358 |
+
# pre-processing ops (stack or flatten for inputs)
|
| 359 |
+
if isinstance(output_dict[attr][0], Tensor):
|
| 360 |
+
output_dict[attr] = torch.stack(output_dict[attr])
|
| 361 |
+
elif isinstance(output_dict[attr][0], list):
|
| 362 |
+
output_dict[attr] = _flatten(output_dict[attr])
|
| 363 |
+
|
| 364 |
+
if not (callable(reduction_fn) or reduction_fn is None):
|
| 365 |
+
raise TypeError("reduction_fn must be callable or None")
|
| 366 |
+
reduced = reduction_fn(output_dict[attr]) if reduction_fn is not None else output_dict[attr]
|
| 367 |
+
setattr(self, attr, reduced)
|
| 368 |
+
|
| 369 |
+
def _wrap_update(self, update: Callable) -> Callable:
|
| 370 |
+
@functools.wraps(update)
|
| 371 |
+
def wrapped_func(*args: Any, **kwargs: Any) -> Optional[Any]:
|
| 372 |
+
self._computed = None
|
| 373 |
+
self._update_called = True
|
| 374 |
+
return update(*args, **kwargs)
|
| 375 |
+
|
| 376 |
+
return wrapped_func
|
| 377 |
+
|
| 378 |
+
def sync(
|
| 379 |
+
self,
|
| 380 |
+
dist_sync_fn: Optional[Callable] = None,
|
| 381 |
+
process_group: Optional[Any] = None,
|
| 382 |
+
should_sync: bool = True,
|
| 383 |
+
distributed_available: Optional[Callable] = jit_distributed_available,
|
| 384 |
+
) -> None:
|
| 385 |
+
"""Sync function for manually controlling when metrics states should be synced across processes.
|
| 386 |
+
|
| 387 |
+
Args:
|
| 388 |
+
dist_sync_fn: Function to be used to perform states synchronization
|
| 389 |
+
process_group:
|
| 390 |
+
Specify the process group on which synchronization is called.
|
| 391 |
+
default: None (which selects the entire world)
|
| 392 |
+
should_sync: Whether to apply to state synchronization. This will have an impact
|
| 393 |
+
only when running in a distributed setting.
|
| 394 |
+
distributed_available: Function to determine if we are running inside a distributed setting
|
| 395 |
+
"""
|
| 396 |
+
if self._is_synced and should_sync:
|
| 397 |
+
raise TorchMetricsUserError("The Metric has already been synced.")
|
| 398 |
+
|
| 399 |
+
is_distributed = distributed_available() if callable(distributed_available) else None
|
| 400 |
+
|
| 401 |
+
if not should_sync or not is_distributed:
|
| 402 |
+
return
|
| 403 |
+
|
| 404 |
+
if dist_sync_fn is None:
|
| 405 |
+
dist_sync_fn = gather_all_tensors
|
| 406 |
+
|
| 407 |
+
# cache prior to syncing
|
| 408 |
+
self._cache = {attr: getattr(self, attr) for attr in self._defaults}
|
| 409 |
+
|
| 410 |
+
# sync
|
| 411 |
+
self._sync_dist(dist_sync_fn, process_group=process_group)
|
| 412 |
+
self._is_synced = True
|
| 413 |
+
|
| 414 |
+
def unsync(self, should_unsync: bool = True) -> None:
|
| 415 |
+
"""Unsync function for manually controlling when metrics states should be reverted back to their local
|
| 416 |
+
states.
|
| 417 |
+
|
| 418 |
+
Args:
|
| 419 |
+
should_unsync: Whether to perform unsync
|
| 420 |
+
"""
|
| 421 |
+
if not should_unsync:
|
| 422 |
+
return
|
| 423 |
+
|
| 424 |
+
if not self._is_synced:
|
| 425 |
+
raise TorchMetricsUserError("The Metric has already been un-synced.")
|
| 426 |
+
|
| 427 |
+
if self._cache is None:
|
| 428 |
+
raise TorchMetricsUserError("The internal cache should exist to unsync the Metric.")
|
| 429 |
+
|
| 430 |
+
# if we synced, restore to cache so that we can continue to accumulate un-synced state
|
| 431 |
+
for attr, val in self._cache.items():
|
| 432 |
+
setattr(self, attr, val)
|
| 433 |
+
self._is_synced = False
|
| 434 |
+
self._cache = None
|
| 435 |
+
|
| 436 |
+
@contextmanager
|
| 437 |
+
def sync_context(
|
| 438 |
+
self,
|
| 439 |
+
dist_sync_fn: Optional[Callable] = None,
|
| 440 |
+
process_group: Optional[Any] = None,
|
| 441 |
+
should_sync: bool = True,
|
| 442 |
+
should_unsync: bool = True,
|
| 443 |
+
distributed_available: Optional[Callable] = jit_distributed_available,
|
| 444 |
+
) -> Generator:
|
| 445 |
+
"""Context manager to synchronize the states between processes when running in a distributed setting and
|
| 446 |
+
restore the local cache states after yielding.
|
| 447 |
+
|
| 448 |
+
Args:
|
| 449 |
+
dist_sync_fn: Function to be used to perform states synchronization
|
| 450 |
+
process_group:
|
| 451 |
+
Specify the process group on which synchronization is called.
|
| 452 |
+
default: None (which selects the entire world)
|
| 453 |
+
should_sync: Whether to apply to state synchronization. This will have an impact
|
| 454 |
+
only when running in a distributed setting.
|
| 455 |
+
should_unsync: Whether to restore the cache state so that the metrics can
|
| 456 |
+
continue to be accumulated.
|
| 457 |
+
distributed_available: Function to determine if we are running inside a distributed setting
|
| 458 |
+
"""
|
| 459 |
+
self.sync(
|
| 460 |
+
dist_sync_fn=dist_sync_fn,
|
| 461 |
+
process_group=process_group,
|
| 462 |
+
should_sync=should_sync,
|
| 463 |
+
distributed_available=distributed_available,
|
| 464 |
+
)
|
| 465 |
+
|
| 466 |
+
yield
|
| 467 |
+
|
| 468 |
+
self.unsync(should_unsync=self._is_synced and should_unsync)
|
| 469 |
+
|
| 470 |
+
def _wrap_compute(self, compute: Callable) -> Callable:
|
| 471 |
+
@functools.wraps(compute)
|
| 472 |
+
def wrapped_func(*args: Any, **kwargs: Any) -> Any:
|
| 473 |
+
# return cached value
|
| 474 |
+
if self._computed is not None:
|
| 475 |
+
return self._computed
|
| 476 |
+
|
| 477 |
+
# compute relies on the sync context manager to gather the states across processes and apply reduction
|
| 478 |
+
# if synchronization happened, the current rank accumulated states will be restored to keep
|
| 479 |
+
# accumulation going if ``should_unsync=True``,
|
| 480 |
+
with self.sync_context(
|
| 481 |
+
dist_sync_fn=self.dist_sync_fn, should_sync=self._to_sync, should_unsync=self._should_unsync
|
| 482 |
+
):
|
| 483 |
+
self._computed = compute(*args, **kwargs)
|
| 484 |
+
|
| 485 |
+
return self._computed
|
| 486 |
+
|
| 487 |
+
return wrapped_func
|
| 488 |
+
|
| 489 |
+
@abstractmethod
|
| 490 |
+
def update(self, *_: Any, **__: Any) -> None:
|
| 491 |
+
"""Override this method to update the state variables of your metric class."""
|
| 492 |
+
|
| 493 |
+
@abstractmethod
|
| 494 |
+
def compute(self) -> Any:
|
| 495 |
+
"""Override this method to compute the final metric value from state variables synchronized across the
|
| 496 |
+
distributed backend."""
|
| 497 |
+
|
| 498 |
+
def reset(self) -> None:
|
| 499 |
+
"""This method automatically resets the metric state variables to their default value."""
|
| 500 |
+
self._update_called = False
|
| 501 |
+
self._forward_cache = None
|
| 502 |
+
# lower lightning versions requires this implicitly to log metric objects correctly in self.log
|
| 503 |
+
self._computed = None
|
| 504 |
+
|
| 505 |
+
for attr, default in self._defaults.items():
|
| 506 |
+
current_val = getattr(self, attr)
|
| 507 |
+
if isinstance(default, Tensor):
|
| 508 |
+
setattr(self, attr, default.detach().clone().to(current_val.device))
|
| 509 |
+
else:
|
| 510 |
+
setattr(self, attr, [])
|
| 511 |
+
|
| 512 |
+
# reset internal states
|
| 513 |
+
self._cache = None
|
| 514 |
+
self._is_synced = False
|
| 515 |
+
|
| 516 |
+
def clone(self) -> "_Metric":
|
| 517 |
+
"""Make a copy of the metric."""
|
| 518 |
+
return deepcopy(self)
|
| 519 |
+
|
| 520 |
+
def __getstate__(self) -> Dict[str, Any]:
|
| 521 |
+
# ignore update and compute functions for pickling
|
| 522 |
+
return {k: v for k, v in self.__dict__.items() if k not in ["update", "compute", "_update_signature"]}
|
| 523 |
+
|
| 524 |
+
def __setstate__(self, state: Dict[str, Any]) -> None:
|
| 525 |
+
# manually restore update and compute functions for pickling
|
| 526 |
+
self.__dict__.update(state)
|
| 527 |
+
self._update_signature = inspect.signature(self.update)
|
| 528 |
+
self.update: Callable = self._wrap_update(self.update) # type: ignore
|
| 529 |
+
self.compute: Callable = self._wrap_compute(self.compute) # type: ignore
|
| 530 |
+
|
| 531 |
+
def __setattr__(self, name: str, value: Any) -> None:
|
| 532 |
+
if name in ("higher_is_better", "is_differentiable"):
|
| 533 |
+
raise RuntimeError(f"Can't change const `{name}`.")
|
| 534 |
+
super().__setattr__(name, value)
|
| 535 |
+
|
| 536 |
+
@property
|
| 537 |
+
def device(self) -> "torch.device":
|
| 538 |
+
"""Return the device of the metric."""
|
| 539 |
+
return self._device
|
| 540 |
+
|
| 541 |
+
def type(self, dst_type: Union[str, torch.dtype]) -> "_Metric":
|
| 542 |
+
"""Method override default and prevent dtype casting.
|
| 543 |
+
|
| 544 |
+
Please use `metric.set_dtype(dtype)` instead.
|
| 545 |
+
"""
|
| 546 |
+
return self
|
| 547 |
+
|
| 548 |
+
def float(self) -> "_Metric":
|
| 549 |
+
"""Method override default and prevent dtype casting.
|
| 550 |
+
|
| 551 |
+
Please use `metric.set_dtype(dtype)` instead.
|
| 552 |
+
"""
|
| 553 |
+
return self
|
| 554 |
+
|
| 555 |
+
def double(self) -> "_Metric":
|
| 556 |
+
"""Method override default and prevent dtype casting.
|
| 557 |
+
|
| 558 |
+
Please use `metric.set_dtype(dtype)` instead.
|
| 559 |
+
"""
|
| 560 |
+
return self
|
| 561 |
+
|
| 562 |
+
def half(self) -> "_Metric":
|
| 563 |
+
"""Method override default and prevent dtype casting.
|
| 564 |
+
|
| 565 |
+
Please use `metric.set_dtype(dtype)` instead.
|
| 566 |
+
"""
|
| 567 |
+
return self
|
| 568 |
+
|
| 569 |
+
def set_dtype(self, dst_type: Union[str, torch.dtype]) -> None:
|
| 570 |
+
"""Special version of `type` for transferring all metric states to specific dtype
|
| 571 |
+
Arguments:
|
| 572 |
+
dst_type (type or string): the desired type
|
| 573 |
+
"""
|
| 574 |
+
return super().type(dst_type)
|
| 575 |
+
|
| 576 |
+
def _apply(self, fn: Callable) -> nn.Module:
|
| 577 |
+
"""Overwrite _apply function such that we can also move metric states to the correct device when `.to`,
|
| 578 |
+
`.cuda`, etc methods are called."""
|
| 579 |
+
this = super()._apply(fn)
|
| 580 |
+
# Also apply fn to metric states and defaults
|
| 581 |
+
for key, value in this._defaults.items():
|
| 582 |
+
if isinstance(value, Tensor):
|
| 583 |
+
this._defaults[key] = fn(value)
|
| 584 |
+
elif isinstance(value, Sequence):
|
| 585 |
+
this._defaults[key] = [fn(v) for v in value]
|
| 586 |
+
|
| 587 |
+
current_val = getattr(this, key)
|
| 588 |
+
if isinstance(current_val, Tensor):
|
| 589 |
+
setattr(this, key, fn(current_val))
|
| 590 |
+
elif isinstance(current_val, Sequence):
|
| 591 |
+
setattr(this, key, [fn(cur_v) for cur_v in current_val])
|
| 592 |
+
else:
|
| 593 |
+
raise TypeError(
|
| 594 |
+
"Expected metric state to be either a Tensor" f"or a list of Tensor, but encountered {current_val}"
|
| 595 |
+
)
|
| 596 |
+
|
| 597 |
+
# make sure to update the device attribute
|
| 598 |
+
# if the dummy tensor moves device by fn function we should also update the attribute
|
| 599 |
+
self._device = fn(torch.zeros(1, device=self.device)).device
|
| 600 |
+
|
| 601 |
+
# Additional apply to forward cache and computed attributes (may be nested)
|
| 602 |
+
if this._computed is not None:
|
| 603 |
+
this._computed = apply_to_collection(this._computed, Tensor, fn)
|
| 604 |
+
if this._forward_cache is not None:
|
| 605 |
+
this._forward_cache = apply_to_collection(this._forward_cache, Tensor, fn)
|
| 606 |
+
|
| 607 |
+
return this
|
| 608 |
+
|
| 609 |
+
def persistent(self, mode: bool = False) -> None:
|
| 610 |
+
"""Method for post-init to change if metric states should be saved to its state_dict."""
|
| 611 |
+
for key in self._persistent:
|
| 612 |
+
self._persistent[key] = mode
|
| 613 |
+
|
| 614 |
+
def state_dict(
|
| 615 |
+
self,
|
| 616 |
+
destination: Dict[str, Any] = None,
|
| 617 |
+
prefix: str = "",
|
| 618 |
+
keep_vars: bool = False,
|
| 619 |
+
) -> Optional[Dict[str, Any]]:
|
| 620 |
+
destination = super().state_dict(destination=destination, prefix=prefix, keep_vars=keep_vars)
|
| 621 |
+
# Register metric states to be part of the state_dict
|
| 622 |
+
for key in self._defaults:
|
| 623 |
+
if not self._persistent[key]:
|
| 624 |
+
continue
|
| 625 |
+
current_val = getattr(self, key)
|
| 626 |
+
if not keep_vars:
|
| 627 |
+
if isinstance(current_val, Tensor):
|
| 628 |
+
current_val = current_val.detach()
|
| 629 |
+
elif isinstance(current_val, list):
|
| 630 |
+
current_val = [cur_v.detach() if isinstance(cur_v, Tensor) else cur_v for cur_v in current_val]
|
| 631 |
+
destination[prefix + key] = deepcopy(current_val) # type: ignore
|
| 632 |
+
return destination
|
| 633 |
+
|
| 634 |
+
def _load_from_state_dict(
|
| 635 |
+
self,
|
| 636 |
+
state_dict: dict,
|
| 637 |
+
prefix: str,
|
| 638 |
+
local_metadata: dict,
|
| 639 |
+
strict: bool,
|
| 640 |
+
missing_keys: List[str],
|
| 641 |
+
unexpected_keys: List[str],
|
| 642 |
+
error_msgs: List[str],
|
| 643 |
+
) -> None:
|
| 644 |
+
"""Loads metric states from state_dict."""
|
| 645 |
+
|
| 646 |
+
for key in self._defaults:
|
| 647 |
+
name = prefix + key
|
| 648 |
+
if name in state_dict:
|
| 649 |
+
setattr(self, key, state_dict.pop(name))
|
| 650 |
+
super()._load_from_state_dict(
|
| 651 |
+
state_dict, prefix, local_metadata, True, missing_keys, unexpected_keys, error_msgs
|
| 652 |
+
)
|
| 653 |
+
|
| 654 |
+
def _filter_kwargs(self, **kwargs: Any) -> Dict[str, Any]:
|
| 655 |
+
"""filter kwargs such that they match the update signature of the metric."""
|
| 656 |
+
|
| 657 |
+
# filter all parameters based on update signature except those of
|
| 658 |
+
# type VAR_POSITIONAL (*args) and VAR_KEYWORD (**kwargs)
|
| 659 |
+
_params = (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
|
| 660 |
+
_sign_params = self._update_signature.parameters
|
| 661 |
+
filtered_kwargs = {
|
| 662 |
+
k: v for k, v in kwargs.items() if (k in _sign_params.keys() and _sign_params[k].kind not in _params)
|
| 663 |
+
}
|
| 664 |
+
|
| 665 |
+
# if no kwargs filtered, return al kwargs as default
|
| 666 |
+
if not filtered_kwargs:
|
| 667 |
+
filtered_kwargs = kwargs
|
| 668 |
+
return filtered_kwargs
|
| 669 |
+
|
| 670 |
+
def __hash__(self) -> int:
|
| 671 |
+
# we need to add the id here, since PyTorch requires a module hash to be unique.
|
| 672 |
+
# Internally, PyTorch nn.Module relies on that for children discovery
|
| 673 |
+
# (see https://github.com/pytorch/pytorch/blob/v1.9.0/torch/nn/modules/module.py#L1544)
|
| 674 |
+
# For metrics that include tensors it is not a problem,
|
| 675 |
+
# since their hash is unique based on the memory location but we cannot rely on that for every metric.
|
| 676 |
+
hash_vals = [self.__class__.__name__, id(self)]
|
| 677 |
+
|
| 678 |
+
for key in self._defaults:
|
| 679 |
+
val = getattr(self, key)
|
| 680 |
+
# Special case: allow list values, so long
|
| 681 |
+
# as their elements are hashable
|
| 682 |
+
if hasattr(val, "__iter__") and not isinstance(val, Tensor):
|
| 683 |
+
hash_vals.extend(val)
|
| 684 |
+
else:
|
| 685 |
+
hash_vals.append(val)
|
| 686 |
+
|
| 687 |
+
return hash(tuple(hash_vals))
|
| 688 |
+
|
| 689 |
+
def __add__(self, other: "Metric") -> "Metric":
|
| 690 |
+
return CompositionalMetric(torch.add, self, other)
|
| 691 |
+
|
| 692 |
+
def __and__(self, other: "Metric") -> "Metric":
|
| 693 |
+
return CompositionalMetric(torch.bitwise_and, self, other)
|
| 694 |
+
|
| 695 |
+
# Fixme: this shall return bool instead of Metric
|
| 696 |
+
def __eq__(self, other: "Metric") -> "Metric": # type: ignore
|
| 697 |
+
return CompositionalMetric(torch.eq, self, other)
|
| 698 |
+
|
| 699 |
+
def __floordiv__(self, other: "Metric") -> "Metric":
|
| 700 |
+
return CompositionalMetric(torch.floor_divide, self, other)
|
| 701 |
+
|
| 702 |
+
def __ge__(self, other: "Metric") -> "Metric":
|
| 703 |
+
return CompositionalMetric(torch.ge, self, other)
|
| 704 |
+
|
| 705 |
+
def __gt__(self, other: "Metric") -> "Metric":
|
| 706 |
+
return CompositionalMetric(torch.gt, self, other)
|
| 707 |
+
|
| 708 |
+
def __le__(self, other: "Metric") -> "Metric":
|
| 709 |
+
return CompositionalMetric(torch.le, self, other)
|
| 710 |
+
|
| 711 |
+
def __lt__(self, other: "Metric") -> "Metric":
|
| 712 |
+
return CompositionalMetric(torch.lt, self, other)
|
| 713 |
+
|
| 714 |
+
def __matmul__(self, other: "Metric") -> "Metric":
|
| 715 |
+
return CompositionalMetric(torch.matmul, self, other)
|
| 716 |
+
|
| 717 |
+
def __mod__(self, other: "Metric") -> "Metric":
|
| 718 |
+
return CompositionalMetric(torch.fmod, self, other)
|
| 719 |
+
|
| 720 |
+
def __mul__(self, other: "Metric") -> "Metric":
|
| 721 |
+
return CompositionalMetric(torch.mul, self, other)
|
| 722 |
+
|
| 723 |
+
# Fixme: this shall return bool instead of Metric
|
| 724 |
+
def __ne__(self, other: "Metric") -> "Metric": # type: ignore
|
| 725 |
+
return CompositionalMetric(torch.ne, self, other)
|
| 726 |
+
|
| 727 |
+
def __or__(self, other: "Metric") -> "Metric":
|
| 728 |
+
return CompositionalMetric(torch.bitwise_or, self, other)
|
| 729 |
+
|
| 730 |
+
def __pow__(self, other: "Metric") -> "Metric":
|
| 731 |
+
return CompositionalMetric(torch.pow, self, other)
|
| 732 |
+
|
| 733 |
+
def __radd__(self, other: "Metric") -> "Metric":
|
| 734 |
+
return CompositionalMetric(torch.add, other, self)
|
| 735 |
+
|
| 736 |
+
def __rand__(self, other: "Metric") -> "Metric":
|
| 737 |
+
# swap them since bitwise_and only supports that way and it's commutative
|
| 738 |
+
return CompositionalMetric(torch.bitwise_and, self, other)
|
| 739 |
+
|
| 740 |
+
def __rfloordiv__(self, other: "Metric") -> "Metric":
|
| 741 |
+
return CompositionalMetric(torch.floor_divide, other, self)
|
| 742 |
+
|
| 743 |
+
def __rmatmul__(self, other: "Metric") -> "Metric":
|
| 744 |
+
return CompositionalMetric(torch.matmul, other, self)
|
| 745 |
+
|
| 746 |
+
def __rmod__(self, other: "Metric") -> "Metric":
|
| 747 |
+
return CompositionalMetric(torch.fmod, other, self)
|
| 748 |
+
|
| 749 |
+
def __rmul__(self, other: "Metric") -> "Metric":
|
| 750 |
+
return CompositionalMetric(torch.mul, other, self)
|
| 751 |
+
|
| 752 |
+
def __ror__(self, other: "Metric") -> "Metric":
|
| 753 |
+
return CompositionalMetric(torch.bitwise_or, other, self)
|
| 754 |
+
|
| 755 |
+
def __rpow__(self, other: "Metric") -> "Metric":
|
| 756 |
+
return CompositionalMetric(torch.pow, other, self)
|
| 757 |
+
|
| 758 |
+
def __rsub__(self, other: "Metric") -> "Metric":
|
| 759 |
+
return CompositionalMetric(torch.sub, other, self)
|
| 760 |
+
|
| 761 |
+
def __rtruediv__(self, other: "Metric") -> "Metric":
|
| 762 |
+
return CompositionalMetric(torch.true_divide, other, self)
|
| 763 |
+
|
| 764 |
+
def __rxor__(self, other: "Metric") -> "Metric":
|
| 765 |
+
return CompositionalMetric(torch.bitwise_xor, other, self)
|
| 766 |
+
|
| 767 |
+
def __sub__(self, other: "Metric") -> "Metric":
|
| 768 |
+
return CompositionalMetric(torch.sub, self, other)
|
| 769 |
+
|
| 770 |
+
def __truediv__(self, other: "Metric") -> "Metric":
|
| 771 |
+
return CompositionalMetric(torch.true_divide, self, other)
|
| 772 |
+
|
| 773 |
+
def __xor__(self, other: "Metric") -> "Metric":
|
| 774 |
+
return CompositionalMetric(torch.bitwise_xor, self, other)
|
| 775 |
+
|
| 776 |
+
def __abs__(self) -> "Metric":
|
| 777 |
+
return CompositionalMetric(torch.abs, self, None)
|
| 778 |
+
|
| 779 |
+
def __inv__(self) -> "Metric":
|
| 780 |
+
return CompositionalMetric(torch.bitwise_not, self, None)
|
| 781 |
+
|
| 782 |
+
def __invert__(self) -> "Metric":
|
| 783 |
+
return self.__inv__()
|
| 784 |
+
|
| 785 |
+
def __neg__(self) -> "Metric":
|
| 786 |
+
return CompositionalMetric(_neg, self, None)
|
| 787 |
+
|
| 788 |
+
def __pos__(self) -> "Metric":
|
| 789 |
+
return CompositionalMetric(torch.abs, self, None)
|
| 790 |
+
|
| 791 |
+
def __getitem__(self, idx: int) -> "Metric":
|
| 792 |
+
return CompositionalMetric(lambda x: x[idx], self, None)
|
| 793 |
+
|
| 794 |
+
|
| 795 |
+
|
| 796 |
+
class CompositionalMetric(_Metric):
|
| 797 |
+
"""Composition of two metrics with a specific operator which will be executed upon metrics compute."""
|
| 798 |
+
|
| 799 |
+
def __init__(
|
| 800 |
+
self,
|
| 801 |
+
operator: Callable,
|
| 802 |
+
metric_a: Union[_Metric, int, float, Tensor],
|
| 803 |
+
metric_b: Union[_Metric, int, float, Tensor, None],
|
| 804 |
+
) -> None:
|
| 805 |
+
"""
|
| 806 |
+
Args:
|
| 807 |
+
operator: the operator taking in one (if metric_b is None)
|
| 808 |
+
or two arguments. Will be applied to outputs of metric_a.compute()
|
| 809 |
+
and (optionally if metric_b is not None) metric_b.compute()
|
| 810 |
+
metric_a: first metric whose compute() result is the first argument of operator
|
| 811 |
+
metric_b: second metric whose compute() result is the second argument of operator.
|
| 812 |
+
For operators taking in only one input, this should be None
|
| 813 |
+
"""
|
| 814 |
+
super().__init__()
|
| 815 |
+
|
| 816 |
+
self.op = operator
|
| 817 |
+
|
| 818 |
+
if isinstance(metric_a, Tensor):
|
| 819 |
+
self.register_buffer("metric_a", metric_a)
|
| 820 |
+
else:
|
| 821 |
+
self.metric_a = metric_a
|
| 822 |
+
|
| 823 |
+
if isinstance(metric_b, Tensor):
|
| 824 |
+
self.register_buffer("metric_b", metric_b)
|
| 825 |
+
else:
|
| 826 |
+
self.metric_b = metric_b
|
| 827 |
+
|
| 828 |
+
def _sync_dist(self, dist_sync_fn: Optional[Callable] = None, process_group: Optional[Any] = None) -> None:
|
| 829 |
+
# No syncing required here. syncing will be done in metric_a and metric_b
|
| 830 |
+
pass
|
| 831 |
+
|
| 832 |
+
def update(self, *args: Any, **kwargs: Any) -> None:
|
| 833 |
+
if isinstance(self.metric_a, Metric):
|
| 834 |
+
self.metric_a.update(*args, **self.metric_a._filter_kwargs(**kwargs))
|
| 835 |
+
|
| 836 |
+
if isinstance(self.metric_b, Metric):
|
| 837 |
+
self.metric_b.update(*args, **self.metric_b._filter_kwargs(**kwargs))
|
| 838 |
+
|
| 839 |
+
def compute(self) -> Any:
|
| 840 |
+
|
| 841 |
+
# also some parsing for kwargs?
|
| 842 |
+
if isinstance(self.metric_a, Metric):
|
| 843 |
+
val_a = self.metric_a.compute()
|
| 844 |
+
else:
|
| 845 |
+
val_a = self.metric_a
|
| 846 |
+
|
| 847 |
+
if isinstance(self.metric_b, Metric):
|
| 848 |
+
val_b = self.metric_b.compute()
|
| 849 |
+
else:
|
| 850 |
+
val_b = self.metric_b
|
| 851 |
+
|
| 852 |
+
if val_b is None:
|
| 853 |
+
return self.op(val_a)
|
| 854 |
+
|
| 855 |
+
return self.op(val_a, val_b)
|
| 856 |
+
|
| 857 |
+
def reset(self) -> None:
|
| 858 |
+
if isinstance(self.metric_a, Metric):
|
| 859 |
+
self.metric_a.reset()
|
| 860 |
+
|
| 861 |
+
if isinstance(self.metric_b, Metric):
|
| 862 |
+
self.metric_b.reset()
|
| 863 |
+
|
| 864 |
+
def persistent(self, mode: bool = False) -> None:
|
| 865 |
+
if isinstance(self.metric_a, Metric):
|
| 866 |
+
self.metric_a.persistent(mode=mode)
|
| 867 |
+
if isinstance(self.metric_b, Metric):
|
| 868 |
+
self.metric_b.persistent(mode=mode)
|
| 869 |
+
|
| 870 |
+
def __repr__(self) -> str:
|
| 871 |
+
_op_metrics = f"(\n {self.op.__name__}(\n {repr(self.metric_a)},\n {repr(self.metric_b)}\n )\n)"
|
| 872 |
+
repr_str = self.__class__.__name__ + _op_metrics
|
| 873 |
+
|
| 874 |
+
return repr_str
|
| 875 |
+
|
| 876 |
+
|
| 877 |
+
class MetricCollection_(nn.ModuleDict):
|
| 878 |
+
def __init__(
|
| 879 |
+
self,
|
| 880 |
+
metrics: Union[_Metric, Sequence[_Metric], Dict[str, _Metric]],
|
| 881 |
+
*additional_metrics: _Metric,
|
| 882 |
+
prefix: Optional[str] = None,
|
| 883 |
+
postfix: Optional[str] = None,
|
| 884 |
+
) -> None:
|
| 885 |
+
super().__init__()
|
| 886 |
+
|
| 887 |
+
self.add_metrics(metrics, *additional_metrics)
|
| 888 |
+
|
| 889 |
+
self.prefix = self._check_arg(prefix, "prefix")
|
| 890 |
+
self.postfix = self._check_arg(postfix, "postfix")
|
| 891 |
+
|
| 892 |
+
@torch.jit.unused
|
| 893 |
+
def forward(self, *args: Any, **kwargs: Any) -> Dict[str, Any]:
|
| 894 |
+
"""Iteratively call forward for each metric.
|
| 895 |
+
|
| 896 |
+
Positional arguments (args) will be passed to every metric in the collection, while keyword arguments (kwargs)
|
| 897 |
+
will be filtered based on the signature of the individual metric.
|
| 898 |
+
"""
|
| 899 |
+
return {k: m(*args, **m._filter_kwargs(**kwargs)) for k, m in self.items()}
|
| 900 |
+
|
| 901 |
+
def update(self, *args: Any, **kwargs: Any) -> None:
|
| 902 |
+
"""Iteratively call update for each metric.
|
| 903 |
+
|
| 904 |
+
Positional arguments (args) will be passed to every metric in the collection, while keyword arguments (kwargs)
|
| 905 |
+
will be filtered based on the signature of the individual metric.
|
| 906 |
+
"""
|
| 907 |
+
for _, m in self.items(keep_base=True):
|
| 908 |
+
m_kwargs = m._filter_kwargs(**kwargs)
|
| 909 |
+
m.update(*args, **m_kwargs)
|
| 910 |
+
|
| 911 |
+
def compute(self) -> Dict[str, Any]:
|
| 912 |
+
return {k: m.compute() for k, m in self.items()}
|
| 913 |
+
|
| 914 |
+
def reset(self) -> None:
|
| 915 |
+
"""Iteratively call reset for each metric."""
|
| 916 |
+
for _, m in self.items(keep_base=True):
|
| 917 |
+
m.reset()
|
| 918 |
+
|
| 919 |
+
def clone(self, prefix: Optional[str] = None, postfix: Optional[str] = None) -> "MetricCollection_":
|
| 920 |
+
"""Make a copy of the metric collection
|
| 921 |
+
Args:
|
| 922 |
+
prefix: a string to append in front of the metric keys
|
| 923 |
+
postfix: a string to append after the keys of the output dict
|
| 924 |
+
|
| 925 |
+
"""
|
| 926 |
+
mc = deepcopy(self)
|
| 927 |
+
if prefix:
|
| 928 |
+
mc.prefix = self._check_arg(prefix, "prefix")
|
| 929 |
+
if postfix:
|
| 930 |
+
mc.postfix = self._check_arg(postfix, "postfix")
|
| 931 |
+
return mc
|
| 932 |
+
|
| 933 |
+
def persistent(self, mode: bool = True) -> None:
|
| 934 |
+
"""Method for post-init to change if metric states should be saved to its state_dict."""
|
| 935 |
+
for _, m in self.items(keep_base=True):
|
| 936 |
+
m.persistent(mode)
|
| 937 |
+
|
| 938 |
+
def add_metrics(
|
| 939 |
+
self, metrics: Union[_Metric, Sequence[_Metric], Dict[str, _Metric]], *additional_metrics: _Metric
|
| 940 |
+
) -> None:
|
| 941 |
+
"""Add new metrics to Metric Collection."""
|
| 942 |
+
if isinstance(metrics, Metric):
|
| 943 |
+
# set compatible with original type expectations
|
| 944 |
+
metrics = [metrics]
|
| 945 |
+
if isinstance(metrics, Sequence):
|
| 946 |
+
# prepare for optional additions
|
| 947 |
+
metrics = list(metrics)
|
| 948 |
+
remain: list = []
|
| 949 |
+
for m in additional_metrics:
|
| 950 |
+
(metrics if isinstance(m, Metric) else remain).append(m)
|
| 951 |
+
|
| 952 |
+
elif additional_metrics:
|
| 953 |
+
raise ValueError(
|
| 954 |
+
f"You have passes extra arguments {additional_metrics} which are not compatible"
|
| 955 |
+
f" with first passed dictionary {metrics} so they will be ignored."
|
| 956 |
+
)
|
| 957 |
+
|
| 958 |
+
if isinstance(metrics, dict):
|
| 959 |
+
# Check all values are metrics
|
| 960 |
+
# Make sure that metrics are added in deterministic order
|
| 961 |
+
for name in sorted(metrics.keys()):
|
| 962 |
+
metric = metrics[name]
|
| 963 |
+
if not isinstance(metric, Metric):
|
| 964 |
+
raise ValueError(
|
| 965 |
+
f"Value {metric} belonging to key {name} is not an instance of `pl.metrics.Metric`"
|
| 966 |
+
)
|
| 967 |
+
self[name] = metric
|
| 968 |
+
elif isinstance(metrics, Sequence):
|
| 969 |
+
for metric in metrics:
|
| 970 |
+
if not isinstance(metric, Metric):
|
| 971 |
+
raise ValueError(f"Input {metric} to `MetricCollection` is not a instance of `pl.metrics.Metric`")
|
| 972 |
+
name = metric.__class__.__name__
|
| 973 |
+
if name in self:
|
| 974 |
+
raise ValueError(f"Encountered two metrics both named {name}")
|
| 975 |
+
self[name] = metric
|
| 976 |
+
else:
|
| 977 |
+
raise ValueError("Unknown input to MetricCollection.")
|
| 978 |
+
|
| 979 |
+
def _set_name(self, base: str) -> str:
|
| 980 |
+
name = base if self.prefix is None else self.prefix + base
|
| 981 |
+
name = name if self.postfix is None else name + self.postfix
|
| 982 |
+
return name
|
| 983 |
+
|
| 984 |
+
def _to_renamed_ordered_dict(self) -> OrderedDict:
|
| 985 |
+
od = OrderedDict()
|
| 986 |
+
for k, v in self._modules.items():
|
| 987 |
+
od[self._set_name(k)] = v
|
| 988 |
+
return od
|
| 989 |
+
|
| 990 |
+
def keys(self, keep_base: bool = False) -> Iterable[Hashable]:
|
| 991 |
+
r"""Return an iterable of the ModuleDict key.
|
| 992 |
+
Args:
|
| 993 |
+
keep_base: Whether to add prefix/postfix on the items collection.
|
| 994 |
+
"""
|
| 995 |
+
if keep_base:
|
| 996 |
+
return self._modules.keys()
|
| 997 |
+
return self._to_renamed_ordered_dict().keys()
|
| 998 |
+
|
| 999 |
+
def items(self, keep_base: bool = False) -> Iterable[Tuple[str, nn.Module]]:
|
| 1000 |
+
r"""Return an iterable of the ModuleDict key/value pairs.
|
| 1001 |
+
Args:
|
| 1002 |
+
keep_base: Whether to add prefix/postfix on the items collection.
|
| 1003 |
+
"""
|
| 1004 |
+
if keep_base:
|
| 1005 |
+
return self._modules.items()
|
| 1006 |
+
return self._to_renamed_ordered_dict().items()
|
| 1007 |
+
|
| 1008 |
+
@staticmethod
|
| 1009 |
+
def _check_arg(arg: Optional[str], name: str) -> Optional[str]:
|
| 1010 |
+
if arg is None or isinstance(arg, str):
|
| 1011 |
+
return arg
|
| 1012 |
+
raise ValueError(f"Expected input `{name}` to be a string, but got {type(arg)}")
|
| 1013 |
+
|
| 1014 |
+
def __repr__(self) -> str:
|
| 1015 |
+
repr_str = super().__repr__()[:-2]
|
| 1016 |
+
if self.prefix:
|
| 1017 |
+
repr_str += f",\n prefix={self.prefix}{',' if self.postfix else ''}"
|
| 1018 |
+
if self.postfix:
|
| 1019 |
+
repr_str += f"{',' if not self.prefix else ''}\n postfix={self.postfix}"
|
| 1020 |
+
return repr_str + "\n)"
|
| 1021 |
+
|
| 1022 |
+
|
| 1023 |
+
class Metric(_Metric):
|
| 1024 |
+
r"""
|
| 1025 |
+
This implementation refers to :class:`~torchmetrics.Metric`.
|
| 1026 |
+
|
| 1027 |
+
.. warning:: This metric is deprecated, use ``torchmetrics.Metric``. Will be removed in v1.5.0.
|
| 1028 |
+
"""
|
| 1029 |
+
|
| 1030 |
+
def __init__(
|
| 1031 |
+
self,
|
| 1032 |
+
compute_on_step: bool = True,
|
| 1033 |
+
dist_sync_on_step: bool = False,
|
| 1034 |
+
process_group: Optional[Any] = None,
|
| 1035 |
+
dist_sync_fn: Callable = None,
|
| 1036 |
+
):
|
| 1037 |
+
super().__init__(
|
| 1038 |
+
compute_on_step=compute_on_step,
|
| 1039 |
+
dist_sync_on_step=dist_sync_on_step,
|
| 1040 |
+
process_group=process_group,
|
| 1041 |
+
dist_sync_fn=dist_sync_fn,
|
| 1042 |
+
)
|
| 1043 |
+
|
| 1044 |
+
def __hash__(self):
|
| 1045 |
+
return super().__hash__()
|
| 1046 |
+
|
| 1047 |
+
def __add__(self, other: Any):
|
| 1048 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1049 |
+
return CompositionalMetric(torch.add, self, other)
|
| 1050 |
+
|
| 1051 |
+
def __and__(self, other: Any):
|
| 1052 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1053 |
+
return CompositionalMetric(torch.bitwise_and, self, other)
|
| 1054 |
+
|
| 1055 |
+
def __eq__(self, other: Any):
|
| 1056 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1057 |
+
return CompositionalMetric(torch.eq, self, other)
|
| 1058 |
+
|
| 1059 |
+
def __floordiv__(self, other: Any):
|
| 1060 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1061 |
+
return CompositionalMetric(torch.floor_divide, self, other)
|
| 1062 |
+
|
| 1063 |
+
def __ge__(self, other: Any):
|
| 1064 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1065 |
+
return CompositionalMetric(torch.ge, self, other)
|
| 1066 |
+
|
| 1067 |
+
def __gt__(self, other: Any):
|
| 1068 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1069 |
+
return CompositionalMetric(torch.gt, self, other)
|
| 1070 |
+
|
| 1071 |
+
def __le__(self, other: Any):
|
| 1072 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1073 |
+
return CompositionalMetric(torch.le, self, other)
|
| 1074 |
+
|
| 1075 |
+
def __lt__(self, other: Any):
|
| 1076 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1077 |
+
return CompositionalMetric(torch.lt, self, other)
|
| 1078 |
+
|
| 1079 |
+
def __matmul__(self, other: Any):
|
| 1080 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1081 |
+
return CompositionalMetric(torch.matmul, self, other)
|
| 1082 |
+
|
| 1083 |
+
def __mod__(self, other: Any):
|
| 1084 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1085 |
+
return CompositionalMetric(torch.fmod, self, other)
|
| 1086 |
+
|
| 1087 |
+
def __mul__(self, other: Any):
|
| 1088 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1089 |
+
return CompositionalMetric(torch.mul, self, other)
|
| 1090 |
+
|
| 1091 |
+
def __ne__(self, other: Any):
|
| 1092 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1093 |
+
return CompositionalMetric(torch.ne, self, other)
|
| 1094 |
+
|
| 1095 |
+
def __or__(self, other: Any):
|
| 1096 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1097 |
+
return CompositionalMetric(torch.bitwise_or, self, other)
|
| 1098 |
+
|
| 1099 |
+
def __pow__(self, other: Any):
|
| 1100 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1101 |
+
return CompositionalMetric(torch.pow, self, other)
|
| 1102 |
+
|
| 1103 |
+
def __radd__(self, other: Any):
|
| 1104 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1105 |
+
return CompositionalMetric(torch.add, other, self)
|
| 1106 |
+
|
| 1107 |
+
def __rand__(self, other: Any):
|
| 1108 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1109 |
+
|
| 1110 |
+
# swap them since bitwise_and only supports that way and it's commutative
|
| 1111 |
+
return CompositionalMetric(torch.bitwise_and, self, other)
|
| 1112 |
+
|
| 1113 |
+
def __rfloordiv__(self, other: Any):
|
| 1114 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1115 |
+
return CompositionalMetric(torch.floor_divide, other, self)
|
| 1116 |
+
|
| 1117 |
+
def __rmatmul__(self, other: Any):
|
| 1118 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1119 |
+
return CompositionalMetric(torch.matmul, other, self)
|
| 1120 |
+
|
| 1121 |
+
def __rmod__(self, other: Any):
|
| 1122 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1123 |
+
return CompositionalMetric(torch.fmod, other, self)
|
| 1124 |
+
|
| 1125 |
+
def __rmul__(self, other: Any):
|
| 1126 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1127 |
+
return CompositionalMetric(torch.mul, other, self)
|
| 1128 |
+
|
| 1129 |
+
def __ror__(self, other: Any):
|
| 1130 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1131 |
+
return CompositionalMetric(torch.bitwise_or, other, self)
|
| 1132 |
+
|
| 1133 |
+
def __rpow__(self, other: Any):
|
| 1134 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1135 |
+
return CompositionalMetric(torch.pow, other, self)
|
| 1136 |
+
|
| 1137 |
+
def __rsub__(self, other: Any):
|
| 1138 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1139 |
+
return CompositionalMetric(torch.sub, other, self)
|
| 1140 |
+
|
| 1141 |
+
def __rtruediv__(self, other: Any):
|
| 1142 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1143 |
+
return CompositionalMetric(torch.true_divide, other, self)
|
| 1144 |
+
|
| 1145 |
+
def __rxor__(self, other: Any):
|
| 1146 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1147 |
+
return CompositionalMetric(torch.bitwise_xor, other, self)
|
| 1148 |
+
|
| 1149 |
+
def __sub__(self, other: Any):
|
| 1150 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1151 |
+
return CompositionalMetric(torch.sub, self, other)
|
| 1152 |
+
|
| 1153 |
+
def __truediv__(self, other: Any):
|
| 1154 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1155 |
+
return CompositionalMetric(torch.true_divide, self, other)
|
| 1156 |
+
|
| 1157 |
+
def __xor__(self, other: Any):
|
| 1158 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1159 |
+
return CompositionalMetric(torch.bitwise_xor, self, other)
|
| 1160 |
+
|
| 1161 |
+
def __abs__(self):
|
| 1162 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1163 |
+
return CompositionalMetric(torch.abs, self, None)
|
| 1164 |
+
|
| 1165 |
+
def __inv__(self):
|
| 1166 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1167 |
+
return CompositionalMetric(torch.bitwise_not, self, None)
|
| 1168 |
+
|
| 1169 |
+
def __invert__(self):
|
| 1170 |
+
return self.__inv__()
|
| 1171 |
+
|
| 1172 |
+
def __neg__(self):
|
| 1173 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1174 |
+
return CompositionalMetric(_neg, self, None)
|
| 1175 |
+
|
| 1176 |
+
def __pos__(self):
|
| 1177 |
+
from pytorch_lightning.metrics.compositional import CompositionalMetric
|
| 1178 |
+
return CompositionalMetric(torch.abs, self, None)
|
| 1179 |
+
|
| 1180 |
+
|
| 1181 |
+
def _neg(tensor: torch.Tensor):
|
| 1182 |
+
return -torch.abs(tensor)
|
| 1183 |
+
|
| 1184 |
+
|
| 1185 |
+
class MicroF1(Metric):
|
| 1186 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1187 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1188 |
+
|
| 1189 |
+
self.add_state("n", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1190 |
+
self.add_state("prec_d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1191 |
+
self.add_state("rec_d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1192 |
+
|
| 1193 |
+
def update(self, p, g):
|
| 1194 |
+
|
| 1195 |
+
self.n += len(g.intersection(p))
|
| 1196 |
+
self.prec_d += len(p)
|
| 1197 |
+
self.rec_d += len(g)
|
| 1198 |
+
|
| 1199 |
+
def compute(self):
|
| 1200 |
+
p = self.n.float() / self.prec_d
|
| 1201 |
+
r = self.n.float() / self.rec_d
|
| 1202 |
+
return (2 * p * r / (p + r)) if (p + r) > 0 else (p + r)
|
| 1203 |
+
|
| 1204 |
+
|
| 1205 |
+
class MacroF1(Metric):
|
| 1206 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1207 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1208 |
+
|
| 1209 |
+
self.add_state("n", default=torch.tensor(0.0), dist_reduce_fx="sum")
|
| 1210 |
+
self.add_state("d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1211 |
+
|
| 1212 |
+
def update(self, p, g):
|
| 1213 |
+
|
| 1214 |
+
prec = len(g.intersection(p)) / len(p)
|
| 1215 |
+
rec = len(g.intersection(p)) / len(g) if g else 0.0
|
| 1216 |
+
|
| 1217 |
+
self.n += (2 * prec * rec / (prec + rec)) if (prec + rec) > 0 else (prec + rec)
|
| 1218 |
+
self.d += 1
|
| 1219 |
+
|
| 1220 |
+
def compute(self):
|
| 1221 |
+
return (self.n / self.d) if self.d > 0 else self.d
|
| 1222 |
+
|
| 1223 |
+
|
| 1224 |
+
class MicroPrecision(Metric):
|
| 1225 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1226 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1227 |
+
|
| 1228 |
+
self.add_state("n", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1229 |
+
self.add_state("d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1230 |
+
|
| 1231 |
+
def update(self, p, g):
|
| 1232 |
+
self.n += len(g.intersection(p))
|
| 1233 |
+
self.d += len(p)
|
| 1234 |
+
|
| 1235 |
+
def compute(self):
|
| 1236 |
+
return (self.n.float() / self.d) if self.d > 0 else self.d
|
| 1237 |
+
|
| 1238 |
+
|
| 1239 |
+
class MacroPrecision(Metric):
|
| 1240 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1241 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1242 |
+
|
| 1243 |
+
self.add_state("n", default=torch.tensor(0.0), dist_reduce_fx="sum")
|
| 1244 |
+
self.add_state("d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1245 |
+
|
| 1246 |
+
def update(self, p, g):
|
| 1247 |
+
self.n += len(g.intersection(p)) / len(p)
|
| 1248 |
+
self.d += 1
|
| 1249 |
+
|
| 1250 |
+
def compute(self):
|
| 1251 |
+
return (self.n / self.d) if self.d > 0 else self.d
|
| 1252 |
+
|
| 1253 |
+
|
| 1254 |
+
class MicroRecall(Metric):
|
| 1255 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1256 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1257 |
+
|
| 1258 |
+
self.add_state("n", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1259 |
+
self.add_state("d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1260 |
+
|
| 1261 |
+
def update(self, p, g):
|
| 1262 |
+
self.n += len(g.intersection(p))
|
| 1263 |
+
self.d += len(g)
|
| 1264 |
+
|
| 1265 |
+
def compute(self):
|
| 1266 |
+
return (self.n.float() / self.d) if self.d > 0 else self.d
|
| 1267 |
+
|
| 1268 |
+
|
| 1269 |
+
class MacroRecall(Metric):
|
| 1270 |
+
def __init__(self, dist_sync_on_step=False):
|
| 1271 |
+
super().__init__(dist_sync_on_step=dist_sync_on_step)
|
| 1272 |
+
|
| 1273 |
+
self.add_state("n", default=torch.tensor(0.0), dist_reduce_fx="sum")
|
| 1274 |
+
self.add_state("d", default=torch.tensor(0), dist_reduce_fx="sum")
|
| 1275 |
+
|
| 1276 |
+
def update(self, p, g):
|
| 1277 |
+
self.n += len(g.intersection(p)) / len(g) if g else 0.0
|
| 1278 |
+
self.d += 1
|
| 1279 |
+
|
| 1280 |
+
def compute(self):
|
| 1281 |
+
return (self.n / self.d) if self.d > 0 else self.d
|
| 1282 |
+
|
| 1283 |
+
# The following two classes are not inherited from https://github.com/nicola-decao/efficient-autoregressive-EL
|
| 1284 |
+
# and are implemented in this project.
|
| 1285 |
+
|
| 1286 |
+
|
| 1287 |
+
class _EvaluationScores:
|
| 1288 |
+
def __init__(self, is_micro):
|
| 1289 |
+
self.is_micro = is_micro
|
| 1290 |
+
if is_micro:
|
| 1291 |
+
self.f1 = MicroF1()
|
| 1292 |
+
self.p = MicroPrecision()
|
| 1293 |
+
self.r = MicroRecall()
|
| 1294 |
+
else:
|
| 1295 |
+
self.f1 = MacroF1()
|
| 1296 |
+
self.p = MacroPrecision()
|
| 1297 |
+
self.r = MacroRecall()
|
| 1298 |
+
|
| 1299 |
+
def record_results(self, prediction, gold):
|
| 1300 |
+
self.f1(prediction, gold)
|
| 1301 |
+
self.p(prediction, gold)
|
| 1302 |
+
self.r(prediction, gold)
|
| 1303 |
+
|
| 1304 |
+
def __str__(self):
|
| 1305 |
+
im = "Micro" if self.is_micro else "Macro"
|
| 1306 |
+
return f"\t{im} evaluation results: F1: {self.f1.compute() * 100:.3f}%\tP: {self.p.compute() * 100:.3f}%" \
|
| 1307 |
+
f"\t R: {self.r.compute() * 100:.3f}%"
|
| 1308 |
+
|
| 1309 |
+
|
| 1310 |
+
class EntityEvaluationScores:
|
| 1311 |
+
def __init__(self, dataset_name):
|
| 1312 |
+
self.dataset_name = dataset_name
|
| 1313 |
+
self.micro_mention_detection = _EvaluationScores(True)
|
| 1314 |
+
self.macro_mention_detection = _EvaluationScores(False)
|
| 1315 |
+
self.micro_entity_linking = _EvaluationScores(True)
|
| 1316 |
+
self.macro_entity_linking = _EvaluationScores(False)
|
| 1317 |
+
|
| 1318 |
+
def record_mention_detection_results(self, prediction, gold):
|
| 1319 |
+
self.micro_mention_detection.record_results(prediction, gold)
|
| 1320 |
+
self.macro_mention_detection.record_results(prediction, gold)
|
| 1321 |
+
|
| 1322 |
+
def record_entity_linking_results(self, prediction, gold):
|
| 1323 |
+
self.micro_entity_linking.record_results(prediction, gold)
|
| 1324 |
+
self.macro_entity_linking.record_results(prediction, gold)
|
| 1325 |
+
|
| 1326 |
+
def __str__(self):
|
| 1327 |
+
return f"Evaluated model for set: {self.dataset_name} (Entity Linking)\n" \
|
| 1328 |
+
f"{str(self.macro_entity_linking)}\n" \
|
| 1329 |
+
f"{str(self.micro_entity_linking)}\n" \
|
| 1330 |
+
f"Evaluated model for set: {self.dataset_name} (Mention Detection)\n" \
|
| 1331 |
+
f"{str(self.macro_mention_detection)}\n" \
|
| 1332 |
+
f"{str(self.micro_mention_detection)}"
|
| 1333 |
+
|
| 1334 |
+
|
| 1335 |
+
class InOutMentionEvaluationResult:
|
| 1336 |
+
def __init__(self, activation_threshold=0.5, vocab_index_of_o=-1):
|
| 1337 |
+
self.activation_threshold = activation_threshold
|
| 1338 |
+
self.vocab_index_of_o = vocab_index_of_o
|
| 1339 |
+
self.total_predictions = 0.0
|
| 1340 |
+
self.correct_predictions = 0.0
|
| 1341 |
+
self.total_true_predictions = 0.0
|
| 1342 |
+
self.correct_true_predictions = 0.0
|
| 1343 |
+
self.total_false_predictions = 0.0
|
| 1344 |
+
self.correct_false_predictions = 0.0
|
| 1345 |
+
|
| 1346 |
+
def _preprocess_logits(self, subword_logits):
|
| 1347 |
+
if self.vocab_index_of_o > -1:
|
| 1348 |
+
return (subword_logits.argmax(-1) != self.vocab_index_of_o).bool()
|
| 1349 |
+
else:
|
| 1350 |
+
return (subword_logits > self.activation_threshold).squeeze(-1)
|
| 1351 |
+
|
| 1352 |
+
def update_scores(self, inputs_eval_mask, s_mentions_is_in_mention, subword_logits):
|
| 1353 |
+
self.total_predictions += inputs_eval_mask.sum().item()
|
| 1354 |
+
for em, ac, pr in zip(inputs_eval_mask, s_mentions_is_in_mention.bool(),
|
| 1355 |
+
self._preprocess_logits(subword_logits)):
|
| 1356 |
+
for m, a, p in zip(em, ac, pr):
|
| 1357 |
+
if m:
|
| 1358 |
+
if a == p:
|
| 1359 |
+
self.correct_predictions += 1.0
|
| 1360 |
+
if a:
|
| 1361 |
+
self.total_true_predictions += 1.0
|
| 1362 |
+
if p:
|
| 1363 |
+
self.correct_true_predictions += 1.0
|
| 1364 |
+
else:
|
| 1365 |
+
self.total_false_predictions += 1.0
|
| 1366 |
+
if not p:
|
| 1367 |
+
self.correct_false_predictions += 1.0
|
| 1368 |
+
|
| 1369 |
+
@property
|
| 1370 |
+
def overall_mention_detection_accuracy(self):
|
| 1371 |
+
return self.correct_predictions * 100 / self.total_predictions if self.total_predictions > 0.0 else 0.0
|
| 1372 |
+
|
| 1373 |
+
@property
|
| 1374 |
+
def in_mention_mention_detection_accuracy(self):
|
| 1375 |
+
return self.correct_true_predictions * 100 / self.total_true_predictions \
|
| 1376 |
+
if self.total_true_predictions > 0.0 else 0.0
|
| 1377 |
+
|
| 1378 |
+
@property
|
| 1379 |
+
def out_of_mention_overall_mention_detection_accuracy(self):
|
| 1380 |
+
return self.correct_false_predictions * 100 / self.total_false_predictions \
|
| 1381 |
+
if self.total_false_predictions > 0.0 else 0.0
|
| 1382 |
+
|
| 1383 |
+
def __str__(self):
|
| 1384 |
+
return f"Subword-level mention detection accuracy = {self.overall_mention_detection_accuracy:.3f}% " \
|
| 1385 |
+
f"({int(self.correct_predictions)}/{int(self.total_predictions)})\n" \
|
| 1386 |
+
f"\t In-Mention Subword-level mention detection accuracy = " \
|
| 1387 |
+
f"{self.in_mention_mention_detection_accuracy:.3f}% " \
|
| 1388 |
+
f"({int(self.correct_true_predictions)}/{int(self.total_true_predictions)})\n" \
|
| 1389 |
+
f"\tOut-of-Mention Subword-level mention detection accuracy = " \
|
| 1390 |
+
f"{self.out_of_mention_overall_mention_detection_accuracy:.3f}% " \
|
| 1391 |
+
f"({int(self.correct_false_predictions)}/{int(self.total_false_predictions)})"
|
model.py
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
The implementation of the main annotator class from "SpEL: Structured Prediction for Entity Linking"
|
| 3 |
+
"""
|
| 4 |
+
import os
|
| 5 |
+
import re
|
| 6 |
+
import pickle
|
| 7 |
+
import numpy
|
| 8 |
+
from typing import List
|
| 9 |
+
from glob import glob
|
| 10 |
+
from itertools import chain
|
| 11 |
+
|
| 12 |
+
from transformers import AutoModelForMaskedLM
|
| 13 |
+
import torch
|
| 14 |
+
import torch.nn as nn
|
| 15 |
+
from torch import optim
|
| 16 |
+
from tqdm import tqdm
|
| 17 |
+
|
| 18 |
+
from utils import store_validation_data_wiki, chunk_annotate_and_merge_to_phrase, \
|
| 19 |
+
get_aida_set_phrase_splitted_documents, compare_gold_and_predicted_annotation_documents
|
| 20 |
+
from decao_eval import EntityEvaluationScores, InOutMentionEvaluationResult
|
| 21 |
+
from span_annotation import SubwordAnnotation
|
| 22 |
+
from data_loader import BERT_MODEL_NAME, dl_sa, tokenizer
|
| 23 |
+
from configuration import get_checkpoints_dir, get_aida_train_canonical_redirects, get_ood_canonical_redirects, \
|
| 24 |
+
get_logdir_dir, get_exec_run_file
|
| 25 |
+
|
| 26 |
+
class SpELAnnotator:
|
| 27 |
+
def __init__(self):
|
| 28 |
+
super(SpELAnnotator, self).__init__()
|
| 29 |
+
self.checkpoints_root = get_checkpoints_dir()
|
| 30 |
+
self.logdir = get_logdir_dir()
|
| 31 |
+
self.exec_run_file = get_exec_run_file()
|
| 32 |
+
|
| 33 |
+
self.text_chunk_length = 254
|
| 34 |
+
self.text_chunk_overlap = 20
|
| 35 |
+
|
| 36 |
+
self.bert_lm = None
|
| 37 |
+
self.number_of_bert_layers = 0
|
| 38 |
+
self.bert_lm_h = 0
|
| 39 |
+
self.out = None
|
| 40 |
+
self.softmax = None
|
| 41 |
+
|
| 42 |
+
def init_model_from_scratch(self, base_model=BERT_MODEL_NAME, device="cpu"):
|
| 43 |
+
"""
|
| 44 |
+
This is required to be called to load up the base model architecture before loading the fine-tuned checkpoint.
|
| 45 |
+
"""
|
| 46 |
+
if base_model:
|
| 47 |
+
self.bert_lm = AutoModelForMaskedLM.from_pretrained(base_model, output_hidden_states=True,
|
| 48 |
+
cache_dir=get_checkpoints_dir() / "hf").to(device)
|
| 49 |
+
self.disable_roberta_lm_head()
|
| 50 |
+
self.number_of_bert_layers = self.bert_lm.config.num_hidden_layers + 1
|
| 51 |
+
self.bert_lm_h = self.bert_lm.config.hidden_size
|
| 52 |
+
self.out = nn.Embedding(num_embeddings=len(dl_sa.mentions_vocab),
|
| 53 |
+
embedding_dim=self.bert_lm_h, sparse=True).to(device)
|
| 54 |
+
self.softmax = nn.Softmax(dim=-1)
|
| 55 |
+
|
| 56 |
+
def shrink_classification_head_to_aida(self, device):
|
| 57 |
+
"""
|
| 58 |
+
This will be called in fine-tuning step 3 to shrink the classification head to in-domain data vocabulary.
|
| 59 |
+
"""
|
| 60 |
+
aida_mentions_vocab, aida_mentions_itos = dl_sa.get_aida_vocab_and_itos()
|
| 61 |
+
if self.out_module.num_embeddings == len(aida_mentions_vocab):
|
| 62 |
+
return
|
| 63 |
+
current_state_dict = self.out_module.state_dict()
|
| 64 |
+
new_out = nn.Embedding(num_embeddings=len(aida_mentions_vocab),
|
| 65 |
+
embedding_dim=self.bert_lm_h, sparse=True).to(device)
|
| 66 |
+
new_state_dict = new_out.state_dict()
|
| 67 |
+
for index_new in range(len(aida_mentions_itos)):
|
| 68 |
+
item_new = aida_mentions_itos[index_new]
|
| 69 |
+
assert item_new in dl_sa.mentions_vocab, \
|
| 70 |
+
"the aida fine-tuned mention vocab must be a subset of the original vocab"
|
| 71 |
+
index_current = dl_sa.mentions_vocab[item_new]
|
| 72 |
+
new_state_dict['weight'][index_new] = current_state_dict['weight'][index_current]
|
| 73 |
+
new_out.load_state_dict(new_state_dict, strict=False)
|
| 74 |
+
self.out = new_out.to(device)
|
| 75 |
+
dl_sa.shrink_vocab_to_aida()
|
| 76 |
+
model_params = sum(p.numel() for p in self.bert_lm.parameters())
|
| 77 |
+
out_params = sum(p.numel() for p in self.out.parameters())
|
| 78 |
+
print(f' * Shrank model to {model_params+out_params} number of parameters ({model_params} parameters '
|
| 79 |
+
f'for the encoder and {out_params} parameters for the classification head)!')
|
| 80 |
+
|
| 81 |
+
@property
|
| 82 |
+
def current_device(self):
|
| 83 |
+
return self.lm_module.device
|
| 84 |
+
|
| 85 |
+
@property
|
| 86 |
+
def lm_module(self):
|
| 87 |
+
return self.bert_lm.module if isinstance(self.bert_lm, nn.DataParallel) or \
|
| 88 |
+
isinstance(self.bert_lm, nn.parallel.DistributedDataParallel) else self.bert_lm
|
| 89 |
+
|
| 90 |
+
@property
|
| 91 |
+
def out_module(self):
|
| 92 |
+
return self.out.module if isinstance(self.out, nn.DataParallel) or \
|
| 93 |
+
isinstance(self.out, nn.parallel.DistributedDataParallel) else self.out
|
| 94 |
+
|
| 95 |
+
@staticmethod
|
| 96 |
+
def get_canonical_redirects(limit_to_conll=True):
|
| 97 |
+
return get_aida_train_canonical_redirects() if limit_to_conll else get_ood_canonical_redirects()
|
| 98 |
+
|
| 99 |
+
def create_optimizers(self, encoder_lr=5e-5, decoder_lr=0.1, exclude_parameter_names_regex=None):
|
| 100 |
+
if exclude_parameter_names_regex is not None:
|
| 101 |
+
bert_lm_parameters = list()
|
| 102 |
+
regex = re.compile(exclude_parameter_names_regex)
|
| 103 |
+
for n, p in list(self.lm_module.named_parameters()):
|
| 104 |
+
if not len(regex.findall(n)) > 0:
|
| 105 |
+
bert_lm_parameters.append(p)
|
| 106 |
+
else:
|
| 107 |
+
bert_lm_parameters = list(self.lm_module.parameters())
|
| 108 |
+
bert_optim = optim.Adam(bert_lm_parameters, lr=encoder_lr)
|
| 109 |
+
if decoder_lr < 1e-323:
|
| 110 |
+
# IMPORTANT! This is a hack since if we don't consider an optimizer for the last layer(e.g. decoder_lr=0.0),
|
| 111 |
+
# BCEWithLogitsLoss will become unstable and memory will explode.
|
| 112 |
+
decoder_lr = 1e-323
|
| 113 |
+
out_optim = optim.SparseAdam(self.out.parameters(), lr=decoder_lr)
|
| 114 |
+
return bert_optim, out_optim
|
| 115 |
+
|
| 116 |
+
@staticmethod
|
| 117 |
+
def create_warmup_scheduler(optimizer, warmup_steps):
|
| 118 |
+
"""
|
| 119 |
+
Creates a scheduler which increases the :param optimizer: learning rate from 0 to the specified learning rate
|
| 120 |
+
in :param warmup_steps: number of batches.
|
| 121 |
+
You need to call scheduler.step() after optimizer.step() in your code for this scheduler to take effect
|
| 122 |
+
"""
|
| 123 |
+
return optim.lr_scheduler.LambdaLR(
|
| 124 |
+
optimizer, lambda epoch: epoch / warmup_steps if epoch < warmup_steps else 1.0)
|
| 125 |
+
|
| 126 |
+
def get_highest_confidence_model_predictions(self, batch_token_ids, topk_per_token=20, topk_from_batch=8196):
|
| 127 |
+
"""
|
| 128 |
+
This function will be used for hard negative mining. For a given input batch, it will return
|
| 129 |
+
the `topk_from_batch` mentions which have had model puzzled. In the process, to reduce the computational
|
| 130 |
+
complexity the model will first select `topk_per_token` number of candidates from the vocabulary, and then
|
| 131 |
+
applies the topk selection on it.
|
| 132 |
+
"""
|
| 133 |
+
with torch.no_grad():
|
| 134 |
+
logits = self.get_model_raw_logits_inference(batch_token_ids)
|
| 135 |
+
# topk_logit_per_token, topk_eids_per_token = logits.topk(topk_per_token, sorted=False, dim=-1)
|
| 136 |
+
# This is a workaround to the torch.topk bug for large sized tensors
|
| 137 |
+
topk_logit_per_token, topk_eids_per_token = [], []
|
| 138 |
+
for batch_item in logits:
|
| 139 |
+
topk_probs, topk_ids = batch_item.topk(topk_per_token, sorted=False, dim=-1)
|
| 140 |
+
topk_logit_per_token.append(topk_probs)
|
| 141 |
+
topk_eids_per_token.append(topk_ids)
|
| 142 |
+
topk_logit_per_token = torch.stack(topk_logit_per_token, dim=0)
|
| 143 |
+
topk_eids_per_token = torch.stack(topk_eids_per_token, dim=0)
|
| 144 |
+
i = torch.cat(
|
| 145 |
+
[
|
| 146 |
+
topk_eids_per_token.view(1, -1),
|
| 147 |
+
torch.zeros(topk_eids_per_token.view(-1).size(), dtype=torch.long,
|
| 148 |
+
device=topk_eids_per_token.device).view(1, -1),
|
| 149 |
+
],
|
| 150 |
+
dim=0,
|
| 151 |
+
)
|
| 152 |
+
v = topk_logit_per_token.view(-1)
|
| 153 |
+
st = torch.sparse.FloatTensor(i, v)
|
| 154 |
+
stc = st.coalesce()
|
| 155 |
+
topk_indices = stc._values().sort(descending=True)[1][:topk_from_batch]
|
| 156 |
+
result = stc._indices()[0, topk_indices]
|
| 157 |
+
|
| 158 |
+
return result.cpu().tolist()
|
| 159 |
+
# ###########################################################################################
|
| 160 |
+
|
| 161 |
+
def annotate_subword_ids(self, subword_ids_list: List, k_for_top_k_to_keep: int, token_offsets=None) \
|
| 162 |
+
-> List[SubwordAnnotation]:
|
| 163 |
+
with torch.no_grad():
|
| 164 |
+
token_ids = torch.LongTensor(subword_ids_list)
|
| 165 |
+
raw_logits, hidden_states = self.get_model_raw_logits_inference(token_ids, return_hidden_states=True)
|
| 166 |
+
logits = self.get_model_logits_inference(raw_logits, hidden_states, k_for_top_k_to_keep, token_offsets)
|
| 167 |
+
return logits
|
| 168 |
+
|
| 169 |
+
def get_model_raw_logits_training(self, token_ids, label_ids, label_probs):
|
| 170 |
+
# label_probs is not used in this function but provided for the classes inheriting SpELAnnotator.
|
| 171 |
+
enc = self.bert_lm(token_ids).hidden_states[-1]
|
| 172 |
+
out = self.out(label_ids)
|
| 173 |
+
logits = enc.matmul(out.transpose(0, 1))
|
| 174 |
+
return logits
|
| 175 |
+
|
| 176 |
+
def get_model_logits_inference(self, raw_logits, hidden_states, k_for_top_k_to_keep, token_offsets=None) \
|
| 177 |
+
-> List[SubwordAnnotation]:
|
| 178 |
+
# hidden_states is not used in this function but provided for the classes inheriting SpELAnnotator.
|
| 179 |
+
logits = self.softmax(raw_logits)
|
| 180 |
+
# The following line could possibly cause errors in torch version 1.13.1
|
| 181 |
+
# see https://github.com/pytorch/pytorch/issues/95455 for more information
|
| 182 |
+
top_k_logits, top_k_indices = logits.topk(k_for_top_k_to_keep)
|
| 183 |
+
top_k_logits = top_k_logits.squeeze(0).cpu().tolist()
|
| 184 |
+
top_k_indices = top_k_indices.squeeze(0).cpu().tolist()
|
| 185 |
+
chunk = ["" for _ in top_k_logits] if token_offsets is None else token_offsets
|
| 186 |
+
return [SubwordAnnotation(p, i, x[0]) for p, i, x in zip(top_k_logits, top_k_indices, chunk)]
|
| 187 |
+
|
| 188 |
+
def get_model_raw_logits_inference(self, token_ids, return_hidden_states=False):
|
| 189 |
+
encs = self.lm_module(token_ids.to(self.current_device)).hidden_states
|
| 190 |
+
out = self.out_module.weight
|
| 191 |
+
logits = encs[-1].matmul(out.transpose(0, 1))
|
| 192 |
+
return (logits, encs) if return_hidden_states else logits
|
| 193 |
+
|
| 194 |
+
def evaluate(self, epoch, batch_size, label_size, best_f1, is_training=True, use_retokenized_wikipedia_data=False,
|
| 195 |
+
potent_score_threshold=0.82):
|
| 196 |
+
self.bert_lm.eval()
|
| 197 |
+
self.out.eval()
|
| 198 |
+
vocab_pad_id = dl_sa.mentions_vocab['<pad>']
|
| 199 |
+
|
| 200 |
+
all_words, all_tags, all_y, all_y_hat, all_predicted, all_token_ids = [], [], [], [], [], []
|
| 201 |
+
subword_eval = InOutMentionEvaluationResult(vocab_index_of_o=dl_sa.mentions_vocab['|||O|||'])
|
| 202 |
+
dataset_name = store_validation_data_wiki(
|
| 203 |
+
self.checkpoints_root, batch_size, label_size, is_training=is_training,
|
| 204 |
+
use_retokenized_wikipedia_data=use_retokenized_wikipedia_data)
|
| 205 |
+
with torch.no_grad():
|
| 206 |
+
for d_file in tqdm(sorted(glob(os.path.join(self.checkpoints_root, dataset_name, "*")))):
|
| 207 |
+
batch_token_ids, label_ids, label_probs, eval_mask, label_id_to_entity_id_dict, \
|
| 208 |
+
batch_entity_ids, is_in_mention, _ = pickle.load(open(d_file, "rb"))
|
| 209 |
+
logits = self.get_model_raw_logits_inference(batch_token_ids)
|
| 210 |
+
subword_eval.update_scores(eval_mask, is_in_mention, logits)
|
| 211 |
+
y_hat = logits.argmax(-1)
|
| 212 |
+
|
| 213 |
+
tags = list()
|
| 214 |
+
predtags = list()
|
| 215 |
+
y_resolved_list = list()
|
| 216 |
+
y_hat_resolved_list = list()
|
| 217 |
+
token_list = list()
|
| 218 |
+
|
| 219 |
+
for batch_id, seq in enumerate(label_probs.max(-1)[1]):
|
| 220 |
+
for token_id, label_id in enumerate(seq[:-self.text_chunk_overlap]):
|
| 221 |
+
if eval_mask[batch_id][token_id].item() == 0:
|
| 222 |
+
y_resolved = vocab_pad_id
|
| 223 |
+
else:
|
| 224 |
+
y_resolved = label_ids[label_id].item()
|
| 225 |
+
y_resolved_list.append(y_resolved)
|
| 226 |
+
tags.append(dl_sa.mentions_itos[y_resolved])
|
| 227 |
+
y_hat_resolved = y_hat[batch_id][token_id].item()
|
| 228 |
+
y_hat_resolved_list.append(y_hat_resolved)
|
| 229 |
+
predtags.append(dl_sa.mentions_itos[y_hat_resolved])
|
| 230 |
+
token_list.append(batch_token_ids[batch_id][token_id].item())
|
| 231 |
+
|
| 232 |
+
all_y.append(y_resolved_list)
|
| 233 |
+
all_y_hat.append(y_hat_resolved_list)
|
| 234 |
+
all_tags.append(tags)
|
| 235 |
+
all_predicted.append(predtags)
|
| 236 |
+
all_words.append(tokenizer.convert_ids_to_tokens(token_list))
|
| 237 |
+
all_token_ids.append(token_list)
|
| 238 |
+
del batch_token_ids, label_ids, label_probs, eval_mask, \
|
| 239 |
+
label_id_to_entity_id_dict, batch_entity_ids, logits, y_hat
|
| 240 |
+
|
| 241 |
+
y_true = numpy.array(list(chain(*all_y)))
|
| 242 |
+
y_pred = numpy.array(list(chain(*all_y_hat)))
|
| 243 |
+
all_token_ids = numpy.array(list(chain(*all_token_ids)))
|
| 244 |
+
|
| 245 |
+
num_proposed = len(y_pred[(1 < y_pred) & (all_token_ids > 0)])
|
| 246 |
+
num_correct = (((y_true == y_pred) & (1 < y_true) & (all_token_ids > 0))).astype(int).sum()
|
| 247 |
+
num_gold = len(y_true[(1 < y_true) & (all_token_ids > 0)])
|
| 248 |
+
|
| 249 |
+
precision = num_correct / num_proposed if num_proposed > 0.0 else 0.0
|
| 250 |
+
recall = num_correct / num_gold if num_gold > 0.0 else 0.0
|
| 251 |
+
f1 = 2.0 * precision * recall / (precision + recall) if precision + recall > 0.0 else 0.0
|
| 252 |
+
f05 = 1.5 * precision * recall / (precision + recall) if precision + recall > 0.0 else 0.0
|
| 253 |
+
if f1 > best_f1:
|
| 254 |
+
print("Saving the best checkpoint ...")
|
| 255 |
+
config = self.prepare_model_checkpoint(epoch)
|
| 256 |
+
fname = self.get_mode_checkpoint_name()
|
| 257 |
+
torch.save(config, f"{fname}.pt")
|
| 258 |
+
print(f"weights were saved to {fname}.pt")
|
| 259 |
+
if precision > potent_score_threshold and recall > potent_score_threshold and is_training:
|
| 260 |
+
print(f"Saving the potent checkpoint with both precision and recall above {potent_score_threshold} ...")
|
| 261 |
+
config = self.prepare_model_checkpoint(epoch)
|
| 262 |
+
try:
|
| 263 |
+
fname = self.get_mode_checkpoint_name()
|
| 264 |
+
torch.save(config, f"{fname}-potent.pt")
|
| 265 |
+
print(f"weights were saved to {fname}-potent.pt")
|
| 266 |
+
except NotImplementedError:
|
| 267 |
+
pass
|
| 268 |
+
self.bert_lm.train()
|
| 269 |
+
self.out.train()
|
| 270 |
+
with open(self.exec_run_file, "a+") as exec_file:
|
| 271 |
+
exec_file.write(f"{precision}, {recall}, {f1}, {f05}, {num_proposed}, {num_correct}, {num_gold}, "
|
| 272 |
+
f"{epoch+1},,\n")
|
| 273 |
+
return precision, recall, f1, f05, num_proposed, num_correct, num_gold, subword_eval
|
| 274 |
+
|
| 275 |
+
def inference_evaluate(self, epoch, best_f1, dataset_name='testa'):
|
| 276 |
+
self.bert_lm.eval()
|
| 277 |
+
self.out.eval()
|
| 278 |
+
evaluation_results = EntityEvaluationScores(dataset_name)
|
| 279 |
+
gold_documents = get_aida_set_phrase_splitted_documents(dataset_name)
|
| 280 |
+
for gold_document in tqdm(gold_documents):
|
| 281 |
+
t_sentence = " ".join([x.word_string for x in gold_document])
|
| 282 |
+
predicted_document = chunk_annotate_and_merge_to_phrase(self, t_sentence, k_for_top_k_to_keep=1)
|
| 283 |
+
comparison_results = compare_gold_and_predicted_annotation_documents(gold_document, predicted_document)
|
| 284 |
+
g_md = set((e[1].begin_character, e[1].end_character)
|
| 285 |
+
for e in comparison_results if e[0].resolved_annotation)
|
| 286 |
+
p_md = set((e[1].begin_character, e[1].end_character)
|
| 287 |
+
for e in comparison_results if e[1].resolved_annotation)
|
| 288 |
+
g_el = set((e[1].begin_character, e[1].end_character, dl_sa.mentions_itos[e[0].resolved_annotation])
|
| 289 |
+
for e in comparison_results if e[0].resolved_annotation)
|
| 290 |
+
p_el = set((e[1].begin_character, e[1].end_character, dl_sa.mentions_itos[e[1].resolved_annotation])
|
| 291 |
+
for e in comparison_results if e[1].resolved_annotation)
|
| 292 |
+
if p_el:
|
| 293 |
+
evaluation_results.record_mention_detection_results(p_md, g_md)
|
| 294 |
+
evaluation_results.record_entity_linking_results(p_el, g_el)
|
| 295 |
+
if evaluation_results.micro_entity_linking.f1.compute() > best_f1:
|
| 296 |
+
print("Saving the best checkpoint ...")
|
| 297 |
+
config = self.prepare_model_checkpoint(epoch)
|
| 298 |
+
fname = self.get_mode_checkpoint_name()
|
| 299 |
+
torch.save(config, f"{fname}.pt")
|
| 300 |
+
print(f"weights were saved to {fname}.pt")
|
| 301 |
+
self.bert_lm.train()
|
| 302 |
+
self.out.train()
|
| 303 |
+
return evaluation_results
|
| 304 |
+
|
| 305 |
+
def prepare_model_checkpoint(self, epoch):
|
| 306 |
+
chk_point = {
|
| 307 |
+
"bert_lm": self.lm_module.state_dict(),
|
| 308 |
+
"number_of_bert_layers": self.number_of_bert_layers,
|
| 309 |
+
"bert_lm_h": self.bert_lm_h,
|
| 310 |
+
"out": self.out_module.state_dict(),
|
| 311 |
+
"epoch": epoch,
|
| 312 |
+
}
|
| 313 |
+
sub_model_specific_checkpoint_data = self.sub_model_specific_checkpoint_data()
|
| 314 |
+
for key in sub_model_specific_checkpoint_data:
|
| 315 |
+
assert key not in ["bert_lm", "number_of_bert_layers", "bert_lm_h", "out", "epoch"], \
|
| 316 |
+
f"{key} is already considered in prepare_model_checkpoint function"
|
| 317 |
+
chk_point[key] = sub_model_specific_checkpoint_data[key]
|
| 318 |
+
return chk_point
|
| 319 |
+
|
| 320 |
+
def disable_roberta_lm_head(self):
|
| 321 |
+
assert self.bert_lm is not None
|
| 322 |
+
self.bert_lm.lm_head.layer_norm.bias.requires_grad = False
|
| 323 |
+
self.bert_lm.lm_head.layer_norm.weight.requires_grad = False
|
| 324 |
+
self.bert_lm.lm_head.dense.bias.requires_grad = False
|
| 325 |
+
self.bert_lm.lm_head.dense.weight.requires_grad = False
|
| 326 |
+
self.bert_lm.lm_head.decoder.bias.requires_grad = False
|
| 327 |
+
|
| 328 |
+
def _load_from_checkpoint_object(self, checkpoint, device="cpu"):
|
| 329 |
+
torch.cuda.empty_cache()
|
| 330 |
+
self.bert_lm.load_state_dict(checkpoint["bert_lm"], strict=False)
|
| 331 |
+
self.bert_lm.to(device)
|
| 332 |
+
self.disable_roberta_lm_head()
|
| 333 |
+
self.out.load_state_dict(checkpoint["out"], strict=False)
|
| 334 |
+
self.out.to(device)
|
| 335 |
+
self.number_of_bert_layers = checkpoint["number_of_bert_layers"]
|
| 336 |
+
self.bert_lm_h = checkpoint["bert_lm_h"]
|
| 337 |
+
self.sub_model_specific_load_checkpoint_data(checkpoint)
|
| 338 |
+
self.bert_lm.eval()
|
| 339 |
+
self.out.eval()
|
| 340 |
+
model_params = sum(p.numel() for p in self.bert_lm.parameters())
|
| 341 |
+
out_params = sum(p.numel() for p in self.out.parameters())
|
| 342 |
+
print(f' * Loaded model with {model_params+out_params} number of parameters ({model_params} parameters '
|
| 343 |
+
f'for the encoder and {out_params} parameters for the classification head)!')
|
| 344 |
+
|
| 345 |
+
@staticmethod
|
| 346 |
+
def download_from_torch_hub(finetuned_after_step=1):
|
| 347 |
+
assert 4 >= finetuned_after_step >= 1
|
| 348 |
+
if finetuned_after_step == 4:
|
| 349 |
+
# This model is the same SpEL finetuned model after step 3 except that its classification layer projects to
|
| 350 |
+
# the entirety of the step-2 model rather than shrinking it in size
|
| 351 |
+
file_name = "spel-base-step-3-500K.pt"
|
| 352 |
+
# Downloads and returns the finetuned model checkpoint created on Oct-03-2023
|
| 353 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/8nw5fFXdz2yBP5z/download',
|
| 354 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 355 |
+
file_name=file_name)
|
| 356 |
+
elif finetuned_after_step == 3:
|
| 357 |
+
file_name = "spel-base-step-3.pt"
|
| 358 |
+
# Downloads and returns the finetuned model checkpoint created on Sep-26-2023 with P=92.06|R=91.93|F1=91.99
|
| 359 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/HpQ3PMm6A3y1NBl/download',
|
| 360 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 361 |
+
file_name=file_name)
|
| 362 |
+
elif finetuned_after_step == 2:
|
| 363 |
+
file_name = 'spel-base-step-2.pt'
|
| 364 |
+
# Downloads and returns the pretrained model checkpoint created on Sep-26-2023 with P=77.60|R=77.91|F1=77.75
|
| 365 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/Hf37vc1foluHPBh/download',
|
| 366 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 367 |
+
file_name=file_name)
|
| 368 |
+
else:
|
| 369 |
+
file_name = 'spel-base-step-1.pt'
|
| 370 |
+
# Downloads and returns the pretrained model checkpoint created on Sep-11-2023 with P=82.50|R=83.16|F1=82.83
|
| 371 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/9OAoAG5eYeREE9V/download',
|
| 372 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 373 |
+
file_name=file_name)
|
| 374 |
+
print(f" * Loaded pretrained model checkpoint: {file_name}")
|
| 375 |
+
return checkpoint
|
| 376 |
+
|
| 377 |
+
@staticmethod
|
| 378 |
+
def download_large_from_torch_hub(finetuned_after_step=1):
|
| 379 |
+
assert 4 >= finetuned_after_step >= 1
|
| 380 |
+
if finetuned_after_step == 4:
|
| 381 |
+
# This model is the same SpEL finetuned model after step 3 except that its classification layer projects to
|
| 382 |
+
# the entirety of the step-2 model rather than shrinking it in size
|
| 383 |
+
file_name = "spel-large-step-3-500K.pt"
|
| 384 |
+
# Downloads and returns the finetuned model checkpoint created on Oct-03-2023
|
| 385 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/BCvputD1ByAvILC/download',
|
| 386 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 387 |
+
file_name=file_name)
|
| 388 |
+
elif finetuned_after_step == 3:
|
| 389 |
+
file_name = "spel-large-step-3.pt"
|
| 390 |
+
# Downloads and returns the finetuned model checkpoint created on Oct-02-2023 with P=92.53|R=92.99|F1=93.76
|
| 391 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/kBBlYVM4Tr59P0q/download',
|
| 392 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 393 |
+
file_name=file_name)
|
| 394 |
+
elif finetuned_after_step == 2:
|
| 395 |
+
file_name = 'spel-large-step-2.pt'
|
| 396 |
+
# Downloads and returns the pretrained model checkpoint created on Oct-02-2023 with P=77.36|R=73.11|F1=75.18
|
| 397 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/rnDiuKns7gzADyb/download',
|
| 398 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 399 |
+
file_name=file_name)
|
| 400 |
+
else:
|
| 401 |
+
file_name = 'spel-large-step-1.pt'
|
| 402 |
+
# Downloads and returns the pretrained model checkpoint created on Sep-11-2023 with P=84.02|R=82.74|F1=83.37
|
| 403 |
+
checkpoint = torch.hub.load_state_dict_from_url('https://vault.sfu.ca/index.php/s/bTp6UN2xL7Yh52w/download',
|
| 404 |
+
model_dir=str(get_checkpoints_dir()), map_location="cpu",
|
| 405 |
+
file_name=file_name)
|
| 406 |
+
print(f" * Loaded pretrained model checkpoint: {file_name}")
|
| 407 |
+
return checkpoint
|
| 408 |
+
|
| 409 |
+
|
| 410 |
+
def load_checkpoint(self, checkpoint_name, device="cpu", rank=0, load_from_torch_hub=False, finetuned_after_step=1):
|
| 411 |
+
if load_from_torch_hub and BERT_MODEL_NAME == "roberta-large":
|
| 412 |
+
checkpoint = self.download_large_from_torch_hub(finetuned_after_step)
|
| 413 |
+
self._load_from_checkpoint_object(checkpoint, device)
|
| 414 |
+
elif load_from_torch_hub and BERT_MODEL_NAME == "roberta-base":
|
| 415 |
+
checkpoint = self.download_from_torch_hub(finetuned_after_step)
|
| 416 |
+
self._load_from_checkpoint_object(checkpoint, device)
|
| 417 |
+
else: # load from the local .checkpoints directory
|
| 418 |
+
if rank == 0:
|
| 419 |
+
print("Loading model checkpoint: {}".format(checkpoint_name))
|
| 420 |
+
fname = os.path.join(self.checkpoints_root, checkpoint_name)
|
| 421 |
+
checkpoint = torch.load(fname, map_location="cpu")
|
| 422 |
+
self._load_from_checkpoint_object(checkpoint, device)
|
| 423 |
+
|
| 424 |
+
# #############################FUNCTIONS THAT THE SUB-MODELS MUST REIMPLEMENT####################################
|
| 425 |
+
def sub_model_specific_checkpoint_data(self):
|
| 426 |
+
"""
|
| 427 |
+
:return: a dictionary of key values containing everything that matters to the sub-model and is not already
|
| 428 |
+
considered in prepare_model_checkpoint.
|
| 429 |
+
"""
|
| 430 |
+
return {}
|
| 431 |
+
|
| 432 |
+
def sub_model_specific_load_checkpoint_data(self, checkpoint):
|
| 433 |
+
return
|
| 434 |
+
|
| 435 |
+
def get_mode_checkpoint_name(self):
|
| 436 |
+
raise NotImplementedError
|
| 437 |
+
|
| 438 |
+
def annotate(self, nif_collection, **kwargs):
|
| 439 |
+
raise NotImplementedError
|
resources/data/aida_canonical_redirects.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
resources/vocab/aida.txt
ADDED
|
@@ -0,0 +1,5598 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1._FC_Köln
|
| 2 |
+
1._FC_Tatran_Prešov
|
| 3 |
+
1._HFC_Humenné
|
| 4 |
+
10_Downing_Street
|
| 5 |
+
14th_Dalai_Lama
|
| 6 |
+
1936_Summer_Olympics
|
| 7 |
+
1966_FIFA_World_Cup
|
| 8 |
+
1972_Summer_Olympics
|
| 9 |
+
1976_Winter_Olympics
|
| 10 |
+
1990_FIFA_World_Cup
|
| 11 |
+
1992_Summer_Olympics
|
| 12 |
+
1994_Asian_Games
|
| 13 |
+
1995_Rugby_World_Cup
|
| 14 |
+
1996_AFC_Asian_Cup
|
| 15 |
+
1996_Belgian_Grand_Prix
|
| 16 |
+
1996_IAAF_Grand_Prix_Final
|
| 17 |
+
1996_Summer_Olympics
|
| 18 |
+
1996_Wimbledon_Championships
|
| 19 |
+
1996–97_UEFA_Cup
|
| 20 |
+
1997_Fed_Cup
|
| 21 |
+
1998_FIFA_World_Cup
|
| 22 |
+
2,000_Guineas_Stakes
|
| 23 |
+
2000_Summer_Olympics
|
| 24 |
+
7-Eleven_(cycling_team)
|
| 25 |
+
A-Ram
|
| 26 |
+
A.C._Cesena
|
| 27 |
+
A.C._ChievoVerona
|
| 28 |
+
A.C._Milan
|
| 29 |
+
A.C._Monza_Brianza_1912
|
| 30 |
+
A.C._Reggiana_1919
|
| 31 |
+
A.F.C._Bournemouth
|
| 32 |
+
A.S.G._Nocerina
|
| 33 |
+
A.S._Andria_BAT
|
| 34 |
+
A.S._Bari
|
| 35 |
+
A.S._Lucchese_Libertas_1905
|
| 36 |
+
A.S._Roma
|
| 37 |
+
A._G._Edwards
|
| 38 |
+
ABC_(newspaper)
|
| 39 |
+
ABN_AMRO
|
| 40 |
+
ACC_Limited
|
| 41 |
+
ACES_Colombia
|
| 42 |
+
ACF_Fiorentina
|
| 43 |
+
ACF_Gloria_1922_Bistriţa
|
| 44 |
+
AEK_Athens_F.C.
|
| 45 |
+
AEK_Larnaca
|
| 46 |
+
AES_Eletropaulo
|
| 47 |
+
AEX_index
|
| 48 |
+
AFC_Ajax
|
| 49 |
+
AFC_Asian_Cup
|
| 50 |
+
AFC_Progresul_Bucureşti
|
| 51 |
+
AIDS
|
| 52 |
+
AJ_Auxerre
|
| 53 |
+
AK-47
|
| 54 |
+
ALBA_Berlin
|
| 55 |
+
AMR_Corporation
|
| 56 |
+
AOL
|
| 57 |
+
ASARCO
|
| 58 |
+
ASEAN
|
| 59 |
+
ASEC_Mimosas
|
| 60 |
+
ASVEL_Lyon-Villeurbanne
|
| 61 |
+
AS_Cannes
|
| 62 |
+
AS_Monaco_FC
|
| 63 |
+
AS_Nancy
|
| 64 |
+
AT&T_Classic
|
| 65 |
+
AZ_(football_club)
|
| 66 |
+
A_Coruña
|
| 67 |
+
Aamer_Sohail
|
| 68 |
+
Aaron_Slight
|
| 69 |
+
Aashish_Kapoor
|
| 70 |
+
Abdalá_Bucaram
|
| 71 |
+
Abdou_Diouf
|
| 72 |
+
Abdul_Rashid_Dostum
|
| 73 |
+
Abdullah_Ercan
|
| 74 |
+
Abdullah_of_Saudi_Arabia
|
| 75 |
+
Abel_Antón
|
| 76 |
+
Abel_Balbo
|
| 77 |
+
Aberdeen_F.C.
|
| 78 |
+
Abidjan
|
| 79 |
+
Abimael_Guzmán
|
| 80 |
+
Abraham_Lincoln
|
| 81 |
+
Abu_Dhabi
|
| 82 |
+
Abu_Dhabi_(emirate)
|
| 83 |
+
Abuja
|
| 84 |
+
Abulhassan_Banisadr
|
| 85 |
+
Academic_Staff_Union_of_Universities
|
| 86 |
+
Academy_Award
|
| 87 |
+
Academy_Award_for_Best_Actor
|
| 88 |
+
Acatepec
|
| 89 |
+
Action_Against_Hunger
|
| 90 |
+
Ad-Diyar
|
| 91 |
+
Adam_Fedoruk
|
| 92 |
+
Adam_Hollioake
|
| 93 |
+
Adam_Hunter_(golfer)
|
| 94 |
+
Adelaide_Football_Club
|
| 95 |
+
Adige
|
| 96 |
+
Adilson_da_Silva
|
| 97 |
+
Adnan_Al_Talyani
|
| 98 |
+
Adolf_Hitler
|
| 99 |
+
Adrian_Ilie
|
| 100 |
+
Adrian_Knup
|
| 101 |
+
Adrian_Năstase
|
| 102 |
+
Adrian_Voinea
|
| 103 |
+
Adriatic_Sea
|
| 104 |
+
Aegon
|
| 105 |
+
Afghanistan
|
| 106 |
+
Africa
|
| 107 |
+
Africa_Cup_of_Nations
|
| 108 |
+
African_American
|
| 109 |
+
African_National_Congress
|
| 110 |
+
Afrikaans
|
| 111 |
+
Afrikaner
|
| 112 |
+
Agent_Orange
|
| 113 |
+
Agenzia_Nazionale_Stampa_Associata
|
| 114 |
+
Agnieszka_Kotlarska
|
| 115 |
+
Agung_Setyabudi
|
| 116 |
+
Ahmad_Shah_Massoud
|
| 117 |
+
Ahmed_Barada
|
| 118 |
+
Ahmed_Sékou_Touré
|
| 119 |
+
Ahmed_Yassin
|
| 120 |
+
Ahmedou_Ould-Abdallah
|
| 121 |
+
Ahold
|
| 122 |
+
Ai_Sugiyama
|
| 123 |
+
Aidan_Quinn
|
| 124 |
+
Aimé_Jacquet
|
| 125 |
+
Air_France
|
| 126 |
+
Airdrieonians_F.C.
|
| 127 |
+
Ajaccio
|
| 128 |
+
Ajay_Jadeja
|
| 129 |
+
Akira_Ryō
|
| 130 |
+
Akron,_Ohio
|
| 131 |
+
Al-Aqsa_Mosque
|
| 132 |
+
Al_Ain
|
| 133 |
+
Al_Akhbar_(Lebanon)
|
| 134 |
+
Al_Gore
|
| 135 |
+
Al_Karak
|
| 136 |
+
Al_Martin
|
| 137 |
+
Al_Rai
|
| 138 |
+
Al_Unser,_Jr.
|
| 139 |
+
Alabama
|
| 140 |
+
Alain_Caveglia
|
| 141 |
+
Alain_Juppé
|
| 142 |
+
Alama_Ieremia
|
| 143 |
+
Alan_Ball,_Jr.
|
| 144 |
+
Alan_Benes
|
| 145 |
+
Alan_Budikusuma
|
| 146 |
+
Alan_Greenspan
|
| 147 |
+
Alan_Hunte
|
| 148 |
+
Alan_Kelly,_Sr.
|
| 149 |
+
Alan_Kernaghan
|
| 150 |
+
Alan_McLoughlin
|
| 151 |
+
Alan_Moore_(footballer)
|
| 152 |
+
Alan_Mullally
|
| 153 |
+
Alan_Shearer
|
| 154 |
+
Alaska
|
| 155 |
+
Alaska_Aces_(PBA)
|
| 156 |
+
Albania
|
| 157 |
+
Albania_national_football_team
|
| 158 |
+
Albanian_Football_Association
|
| 159 |
+
Albanian_language
|
| 160 |
+
Albanians
|
| 161 |
+
Albert_Belle
|
| 162 |
+
Albert_Emon
|
| 163 |
+
Albert_Ferrer
|
| 164 |
+
Albert_II,_Prince_of_Monaco
|
| 165 |
+
Albert_Schweitzer
|
| 166 |
+
Alberta
|
| 167 |
+
Alberto_Berasategui
|
| 168 |
+
Alberto_García_Aspe
|
| 169 |
+
Albuquerque,_New_Mexico
|
| 170 |
+
Aldi
|
| 171 |
+
Alec_Stewart
|
| 172 |
+
Alejandro_Agustín_Lanusse
|
| 173 |
+
Aleksander_Kwaśniewski
|
| 174 |
+
Aleksandra_Olsza
|
| 175 |
+
Alen_Bokšić
|
| 176 |
+
Alessandra_Mussolini
|
| 177 |
+
Alessandro_Del_Piero
|
| 178 |
+
Alessandro_Lambruschini
|
| 179 |
+
Alessandro_Melli
|
| 180 |
+
Alessandro_Moscardi
|
| 181 |
+
Alessandro_Troncon
|
| 182 |
+
Alex_Arias
|
| 183 |
+
Alex_Ferguson
|
| 184 |
+
Alex_Fernandez_(baseball)
|
| 185 |
+
Alex_Rodriguez
|
| 186 |
+
Alex_Rădulescu
|
| 187 |
+
Alex_Zanardi
|
| 188 |
+
Alex_Čejka
|
| 189 |
+
Alexander_Downer
|
| 190 |
+
Alexander_Gontchenkov
|
| 191 |
+
Alexander_III_of_Scotland
|
| 192 |
+
Alexander_Lebed
|
| 193 |
+
Alexander_Lukashenko
|
| 194 |
+
Alexander_Popov_(swimmer)
|
| 195 |
+
Alexander_Vladimirovich_Volkov
|
| 196 |
+
Alexander_Zickler
|
| 197 |
+
Alexandra_Fusai
|
| 198 |
+
Alexandra_Meissnitzer
|
| 199 |
+
Alexandre_Comisetti
|
| 200 |
+
Alexei_Markov
|
| 201 |
+
Alexia_Dechaume-Balleret
|
| 202 |
+
Aleš_Valenta
|
| 203 |
+
Alfred_Berkeley
|
| 204 |
+
Alfred_Sant
|
| 205 |
+
Algemeen_Nederlands_Persbureau
|
| 206 |
+
Algeria
|
| 207 |
+
Algiers
|
| 208 |
+
Ali_Alatas
|
| 209 |
+
Ali_Brown
|
| 210 |
+
Ali_Shah
|
| 211 |
+
Alicante
|
| 212 |
+
Alicia_Machado
|
| 213 |
+
Alija_Izetbegović
|
| 214 |
+
Alina_Astafei
|
| 215 |
+
Alistair_Campbell_(cricketer)
|
| 216 |
+
Aliuska_López
|
| 217 |
+
Alla_Dudayeva
|
| 218 |
+
Allah
|
| 219 |
+
Allan_Bateman
|
| 220 |
+
Allan_Donald
|
| 221 |
+
Allan_Wells
|
| 222 |
+
Allen_Johnson
|
| 223 |
+
Allenby_Bridge
|
| 224 |
+
Allensbach
|
| 225 |
+
Allentown,_Pennsylvania
|
| 226 |
+
Alliance_'90/The_Greens
|
| 227 |
+
Alloa_Athletic_F.C.
|
| 228 |
+
Ally_McCoist
|
| 229 |
+
Almere
|
| 230 |
+
Aloÿs_Nizigama
|
| 231 |
+
Alpay_Özalan
|
| 232 |
+
Alpine_skiing_at_the_1994_Winter_Olympics
|
| 233 |
+
Alsace
|
| 234 |
+
Altenberg,_Germany
|
| 235 |
+
Altin_Haxhi
|
| 236 |
+
Altin_Rraklli
|
| 237 |
+
Amalgamated_Roadstone_Corporation
|
| 238 |
+
Amanda_Coetzer
|
| 239 |
+
Amara_Essy
|
| 240 |
+
Amarillo,_Texas
|
| 241 |
+
Amazon_River
|
| 242 |
+
American_Airlines
|
| 243 |
+
American_Broadcasting_Company
|
| 244 |
+
American_Civil_War
|
| 245 |
+
American_Depositary_Receipt
|
| 246 |
+
American_League
|
| 247 |
+
American_League_Central
|
| 248 |
+
American_League_East
|
| 249 |
+
American_League_West
|
| 250 |
+
American_Stock_Exchange
|
| 251 |
+
American_University
|
| 252 |
+
American_Veterinary_Medical_Association
|
| 253 |
+
American_studies
|
| 254 |
+
Amica_Wronki
|
| 255 |
+
Amman
|
| 256 |
+
Amnesty_International
|
| 257 |
+
Amoco
|
| 258 |
+
Amr_Moussa
|
| 259 |
+
Amr_Shabana
|
| 260 |
+
Amsterdam
|
| 261 |
+
Amstetten,_Lower_Austria
|
| 262 |
+
Amtrak
|
| 263 |
+
Amy_Frazier
|
| 264 |
+
An-Nahar
|
| 265 |
+
Ana_Fidelia_Quirot
|
| 266 |
+
Anaheim_Ducks
|
| 267 |
+
Anatolia
|
| 268 |
+
Anchorage,_Alaska
|
| 269 |
+
Anders_Forsbrand
|
| 270 |
+
Andhra_Pradesh
|
| 271 |
+
Andre_Agassi
|
| 272 |
+
Andre_Markgraaff
|
| 273 |
+
Andre_Snyman
|
| 274 |
+
Andrea_Collinelli
|
| 275 |
+
Andrea_Ferrigato
|
| 276 |
+
Andrea_Gaudenzi
|
| 277 |
+
Andrea_Giaconi
|
| 278 |
+
Andrea_Glass
|
| 279 |
+
Andreas_Andersson
|
| 280 |
+
Andreas_Goldberger
|
| 281 |
+
Andreas_Heraf
|
| 282 |
+
Andreas_Herzog
|
| 283 |
+
Andreas_Kappes
|
| 284 |
+
Andreas_Köpke
|
| 285 |
+
Andreas_Möller
|
| 286 |
+
Andreas_Ogris
|
| 287 |
+
Andreas_Seelig
|
| 288 |
+
Andreas_Thom
|
| 289 |
+
Andreas_Zeyer
|
| 290 |
+
Andrei_Chesnokov
|
| 291 |
+
Andrei_Kanchelskis
|
| 292 |
+
Andrei_Olhovskiy
|
| 293 |
+
Andrei_Pavel
|
| 294 |
+
Andrei_Tchmil
|
| 295 |
+
Andrew_Caddick
|
| 296 |
+
Andrew_Coltart
|
| 297 |
+
Andrew_Hudson
|
| 298 |
+
Andrew_Magee
|
| 299 |
+
Andrew_Mehrtens
|
| 300 |
+
Andrew_Symonds
|
| 301 |
+
Andrew_Wakefield
|
| 302 |
+
Andriy_Medvedev
|
| 303 |
+
Andruw_Jones
|
| 304 |
+
André_Joubert
|
| 305 |
+
André_Ribeiro
|
| 306 |
+
André_Trulsen
|
| 307 |
+
Andrés_Galarraga
|
| 308 |
+
Andy_Benes
|
| 309 |
+
Andy_Etchebarren
|
| 310 |
+
Andy_Flower
|
| 311 |
+
Andy_Goram
|
| 312 |
+
Andy_Hinchcliffe
|
| 313 |
+
Andy_Melville
|
| 314 |
+
Andy_Pettitte
|
| 315 |
+
Andy_Sinton
|
| 316 |
+
Andy_Townsend
|
| 317 |
+
Andy_Whittall
|
| 318 |
+
Ange-Félix_Patassé
|
| 319 |
+
Angel_Miranda
|
| 320 |
+
Anghel_Iordănescu
|
| 321 |
+
Anglicanism
|
| 322 |
+
Anglo-Welsh_Cup
|
| 323 |
+
Angola
|
| 324 |
+
Angola_national_football_team
|
| 325 |
+
Angélica_Gavaldón
|
| 326 |
+
Anhui
|
| 327 |
+
Anil_Kumble
|
| 328 |
+
Anita_Gradin
|
| 329 |
+
Anita_Wachter
|
| 330 |
+
Anja_Rücker
|
| 331 |
+
Ankara
|
| 332 |
+
Anke_Huber
|
| 333 |
+
Ann_Grossman
|
| 334 |
+
Anna_Kournikova
|
| 335 |
+
Anne-Gaëlle_Sidot
|
| 336 |
+
Anne_Boleyn
|
| 337 |
+
Annemari_Sandell-Hyvärinen
|
| 338 |
+
Annemarie_Jorritsma
|
| 339 |
+
Annett_Neumann
|
| 340 |
+
Antara_(news_agency)
|
| 341 |
+
Anthony_Bancarel
|
| 342 |
+
Anthony_Gobert
|
| 343 |
+
Anthony_Quayle
|
| 344 |
+
Anthony_Raine_Barker
|
| 345 |
+
Anthony_Sullivan
|
| 346 |
+
Anthony_Washington
|
| 347 |
+
Anthuan_Maybank
|
| 348 |
+
Antioquia_Department
|
| 349 |
+
Anto_Drobnjak
|
| 350 |
+
Antoine_Kombouaré
|
| 351 |
+
Antoine_Lahad
|
| 352 |
+
Anton_Bruckner
|
| 353 |
+
Anton_Doboş
|
| 354 |
+
Anton_Pfeffer
|
| 355 |
+
Anton_Shantyr
|
| 356 |
+
Antonella_Bellutti
|
| 357 |
+
Antonio_Esposito
|
| 358 |
+
Antonio_Quarracino
|
| 359 |
+
Antonio_Tartaglia
|
| 360 |
+
Antony_Marlow
|
| 361 |
+
Antwerp
|
| 362 |
+
António_Folha
|
| 363 |
+
António_Luís_Alves_Ribeiro_Oliveira
|
| 364 |
+
Anyang_LG_Cheetahs
|
| 365 |
+
Apple_Inc.
|
| 366 |
+
Appleton,_Wisconsin
|
| 367 |
+
Aqaba
|
| 368 |
+
Arab_Contractors_(company)
|
| 369 |
+
Arab_World
|
| 370 |
+
Arab_citizens_of_Israel
|
| 371 |
+
Arab_people
|
| 372 |
+
Arabic_language
|
| 373 |
+
Arad,_Romania
|
| 374 |
+
Arantxa_Parra_Santonja
|
| 375 |
+
Arantxa_Sánchez_Vicario
|
| 376 |
+
Aravinda_de_Silva
|
| 377 |
+
Arbil
|
| 378 |
+
Arbroath_F.C.
|
| 379 |
+
Arctic
|
| 380 |
+
Ards_F.C.
|
| 381 |
+
Argentina
|
| 382 |
+
Ari-Pekka_Nikkola
|
| 383 |
+
Arif_Erdem
|
| 384 |
+
Arizona
|
| 385 |
+
Arizona_Cardinals
|
| 386 |
+
Arizona_State_Sun_Devils_football
|
| 387 |
+
Arjan_Xhumba
|
| 388 |
+
Arjuna_Ranatunga
|
| 389 |
+
Arkadiusz_Bąk
|
| 390 |
+
Arkansas
|
| 391 |
+
Arkansas_State_Police
|
| 392 |
+
Arlen_Specter
|
| 393 |
+
Arlington,_Texas
|
| 394 |
+
Armando_Reynoso
|
| 395 |
+
Armen_Martirosyan_(athlete)
|
| 396 |
+
Armenia
|
| 397 |
+
Armenia_national_football_team
|
| 398 |
+
Arminia_Bielefeld
|
| 399 |
+
Arnaud_Boetsch
|
| 400 |
+
Arnold_Rüütel
|
| 401 |
+
Aron_Winter
|
| 402 |
+
Arrigo_Sacchi
|
| 403 |
+
Arrows
|
| 404 |
+
Arsenal_F.C.
|
| 405 |
+
Art_Howe
|
| 406 |
+
Arthur_Levitt
|
| 407 |
+
Arthur_Numan
|
| 408 |
+
Artur_Jorge_(footballer)
|
| 409 |
+
Artur_Lekbello
|
| 410 |
+
Arundel
|
| 411 |
+
Aryan_race
|
| 412 |
+
As-Safir
|
| 413 |
+
Asanka_Gurusinha
|
| 414 |
+
Ascot_Racecourse
|
| 415 |
+
Ashford_Town_F.C._(Kent)
|
| 416 |
+
Ashia_Hansen
|
| 417 |
+
Ashoknagar
|
| 418 |
+
Ashta
|
| 419 |
+
Asia
|
| 420 |
+
Asif_Ali_Zardari
|
| 421 |
+
Asif_Mujtaba
|
| 422 |
+
Aslan_Maskhadov
|
| 423 |
+
Asmara
|
| 424 |
+
Association_for_Relations_Across_the_Taiwan_Straits
|
| 425 |
+
Association_of_Tennis_Professionals
|
| 426 |
+
Associação_Desportiva_Vasco_da_Gama
|
| 427 |
+
Associação_Portuguesa_de_Desportos
|
| 428 |
+
Aston_Villa_F.C.
|
| 429 |
+
Astrid_Kumbernuss
|
| 430 |
+
Ata-ur-Rehman
|
| 431 |
+
Atalanta_B.C.
|
| 432 |
+
Athens
|
| 433 |
+
Athens_Metro
|
| 434 |
+
Athletic_Bilbao
|
| 435 |
+
Atlanta
|
| 436 |
+
Atlanta_Braves
|
| 437 |
+
Atlanta_Falcons
|
| 438 |
+
Atlanta_Hawks
|
| 439 |
+
Atlante_F.C.
|
| 440 |
+
Atlantic_City,_New_Jersey
|
| 441 |
+
Atlantic_Division_(NBA)
|
| 442 |
+
Atlantic_Division_(NHL)
|
| 443 |
+
Atlantic_Highlands,_New_Jersey
|
| 444 |
+
Atlético_Madrid
|
| 445 |
+
Ato_Boldon
|
| 446 |
+
Auchan
|
| 447 |
+
Auckland
|
| 448 |
+
Audi
|
| 449 |
+
Aung_San
|
| 450 |
+
Aung_San_Suu_Kyi
|
| 451 |
+
Australia
|
| 452 |
+
Australia_Davis_Cup_team
|
| 453 |
+
Australia_national_cricket_team
|
| 454 |
+
Australia_national_rugby_union_team
|
| 455 |
+
Australian_Capital_Territory
|
| 456 |
+
Australian_Democrats
|
| 457 |
+
Australian_Football_League
|
| 458 |
+
Australian_Greens
|
| 459 |
+
Australian_Labor_Party
|
| 460 |
+
Australian_Open
|
| 461 |
+
Australian_people
|
| 462 |
+
Australian_rules_football
|
| 463 |
+
Austria
|
| 464 |
+
Austria_Fed_Cup_team
|
| 465 |
+
Austria_national_football_team
|
| 466 |
+
Austria_national_under-21_football_team
|
| 467 |
+
Austrian_Empire
|
| 468 |
+
Austrians
|
| 469 |
+
Avalon,_New_Jersey
|
| 470 |
+
Avianca
|
| 471 |
+
Avigdor_Kahalani
|
| 472 |
+
Axel_Schulz
|
| 473 |
+
Axis_Bank
|
| 474 |
+
Ayodhya
|
| 475 |
+
Ayr_United_F.C.
|
| 476 |
+
Azad_Kashmir
|
| 477 |
+
Azerbaijan
|
| 478 |
+
Azerbaijan_national_football_team
|
| 479 |
+
BBC
|
| 480 |
+
BNP_Paribas
|
| 481 |
+
BP
|
| 482 |
+
BSC_Young_Boys
|
| 483 |
+
BVSC_Budapest
|
| 484 |
+
Ba'ath_Party
|
| 485 |
+
Babel_(newspaper)
|
| 486 |
+
Baburam_Bhattarai
|
| 487 |
+
Bachirou_Salou
|
| 488 |
+
Baghdad
|
| 489 |
+
Bagram
|
| 490 |
+
Bahrain
|
| 491 |
+
Bahía_Blanca
|
| 492 |
+
Bailundo
|
| 493 |
+
Baja_California
|
| 494 |
+
Baku
|
| 495 |
+
Bali
|
| 496 |
+
Balkan_Bulgarian_Airlines
|
| 497 |
+
Balkans
|
| 498 |
+
Bally_Shoe
|
| 499 |
+
Ballybunion
|
| 500 |
+
Balmain_Tigers
|
| 501 |
+
Balochistan,_Pakistan
|
| 502 |
+
Baltimore
|
| 503 |
+
Baltimore_Orioles
|
| 504 |
+
Baltimore_Ravens
|
| 505 |
+
Bancomext
|
| 506 |
+
Bandundu
|
| 507 |
+
Bangkok
|
| 508 |
+
Bangladesh
|
| 509 |
+
Bangladesh_Awami_League
|
| 510 |
+
Bangladesh_Nationalist_Party
|
| 511 |
+
Bangui
|
| 512 |
+
Banharn_Silpa-archa
|
| 513 |
+
Banja_Luka
|
| 514 |
+
Bank_Indonesia
|
| 515 |
+
Bank_One_Corporation
|
| 516 |
+
Bank_of_Canada
|
| 517 |
+
Bank_of_Finland
|
| 518 |
+
Bank_of_Israel
|
| 519 |
+
Bank_of_Japan
|
| 520 |
+
Bank_of_Mexico
|
| 521 |
+
Bank_of_New_Zealand
|
| 522 |
+
Bank_of_Spain
|
| 523 |
+
Banque_de_France
|
| 524 |
+
Barangay_Ginebra_Kings
|
| 525 |
+
Barbara_Paulus
|
| 526 |
+
Barbara_Rittner
|
| 527 |
+
Barbara_Schett
|
| 528 |
+
Barbarian_F.C.
|
| 529 |
+
Barcelona
|
| 530 |
+
Barentsburg
|
| 531 |
+
Barnet_F.C.
|
| 532 |
+
Barnsley_F.C.
|
| 533 |
+
Barrick_Gold
|
| 534 |
+
Barry,_Vale_of_Glamorgan
|
| 535 |
+
Barry_Bonds
|
| 536 |
+
Barry_Lane
|
| 537 |
+
Barry_Larkin
|
| 538 |
+
Bart_Voskamp
|
| 539 |
+
Barvikha
|
| 540 |
+
Basarab_Panduru
|
| 541 |
+
Basque_Country_(autonomous_community)
|
| 542 |
+
Basque_Country_(greater_region)
|
| 543 |
+
Batajnica
|
| 544 |
+
Batasuna
|
| 545 |
+
Bath_Rugby
|
| 546 |
+
Baudouin_of_Belgium
|
| 547 |
+
Bavaria
|
| 548 |
+
Bayer_04_Leverkusen
|
| 549 |
+
Bayer_Giants_Leverkusen
|
| 550 |
+
Bayer_HealthCare_Pharmaceuticals
|
| 551 |
+
Beatrix_of_the_Netherlands
|
| 552 |
+
Bedouin
|
| 553 |
+
Beijing
|
| 554 |
+
Beirut
|
| 555 |
+
Beirut_Stock_Exchange
|
| 556 |
+
Beitar_Jerusalem_F.C.
|
| 557 |
+
Belarus
|
| 558 |
+
Belarus_national_football_team
|
| 559 |
+
Belfast
|
| 560 |
+
Belga_(news_agency)
|
| 561 |
+
Belgium
|
| 562 |
+
Belgium_Fed_Cup_team
|
| 563 |
+
Belgium_national_football_team
|
| 564 |
+
Belgrade
|
| 565 |
+
BellSouth
|
| 566 |
+
Bellerive_Oval
|
| 567 |
+
Belém
|
| 568 |
+
Benazir_Bhutto
|
| 569 |
+
Benedetto_Santapaola
|
| 570 |
+
Benelux
|
| 571 |
+
Benetton_Formula
|
| 572 |
+
Benghazi
|
| 573 |
+
Benin_national_football_team
|
| 574 |
+
Benito_Mussolini
|
| 575 |
+
Benito_Santiago
|
| 576 |
+
Benjamin_Netanyahu
|
| 577 |
+
Benoît_Cauet
|
| 578 |
+
Benson_Koech
|
| 579 |
+
Bergen
|
| 580 |
+
Berkshire_Hathaway
|
| 581 |
+
Berlin
|
| 582 |
+
Berlin_Tegel_Airport
|
| 583 |
+
Berlin_Tempelhof_Airport
|
| 584 |
+
Bermuda
|
| 585 |
+
Bern
|
| 586 |
+
Bernama
|
| 587 |
+
Bernard_Barmasai
|
| 588 |
+
Bernard_Collomb
|
| 589 |
+
Bernard_Ingham
|
| 590 |
+
Bernard_Lama
|
| 591 |
+
Bernard_Tapie
|
| 592 |
+
Bernd_Karbacher
|
| 593 |
+
Bernhard_Langer
|
| 594 |
+
Berovo
|
| 595 |
+
Bert_Konterman
|
| 596 |
+
Bertelsmann
|
| 597 |
+
Berti_Vogts
|
| 598 |
+
Bertrand_Crasson
|
| 599 |
+
Berwick_Rangers_F.C.
|
| 600 |
+
Bessemer_Venture_Partners
|
| 601 |
+
Best_Products
|
| 602 |
+
Beth_Daniel
|
| 603 |
+
Bethlehem
|
| 604 |
+
Be��chatów
|
| 605 |
+
Beşiktaş_J.K.
|
| 606 |
+
Bharat_Ratna
|
| 607 |
+
Bharatiya_Janata_Party
|
| 608 |
+
Bhavnagar
|
| 609 |
+
Biathlon_World_Cup
|
| 610 |
+
Bible
|
| 611 |
+
Bilbao
|
| 612 |
+
Bild
|
| 613 |
+
Biljana_Plavšić
|
| 614 |
+
Bill_Birch
|
| 615 |
+
Bill_Clinton
|
| 616 |
+
Bill_Russell_(baseball)
|
| 617 |
+
Billa_(supermarket)
|
| 618 |
+
Billie_Jean_King
|
| 619 |
+
Billings,_Montana
|
| 620 |
+
Billy_Andrade
|
| 621 |
+
Billy_Ashley
|
| 622 |
+
Billy_Davies
|
| 623 |
+
Billy_Dodds
|
| 624 |
+
Billy_Mayfair
|
| 625 |
+
Bima_Sakti
|
| 626 |
+
Biogen_Idec
|
| 627 |
+
Birendra_of_Nepal
|
| 628 |
+
Birmingham
|
| 629 |
+
Birmingham_City_F.C.
|
| 630 |
+
Bistriţa
|
| 631 |
+
Bixente_Lizarazu
|
| 632 |
+
Black_Sea
|
| 633 |
+
Blackburn_Rovers_F.C.
|
| 634 |
+
Blackpool_F.C.
|
| 635 |
+
Blaise_Compaoré
|
| 636 |
+
Blantyre,_Malawi
|
| 637 |
+
Bledar_Kola
|
| 638 |
+
Blendi_Nallbani
|
| 639 |
+
Blida_Province
|
| 640 |
+
Bnei_Yehuda_Tel_Aviv_F.C.
|
| 641 |
+
Board_of_Control_for_Cricket_in_India
|
| 642 |
+
Boavista_F.C.
|
| 643 |
+
Bob_Brett
|
| 644 |
+
Bob_Dole
|
| 645 |
+
Bob_Dwyer
|
| 646 |
+
Bob_Estes
|
| 647 |
+
Bob_Halverson
|
| 648 |
+
Bob_Kennedy_(athlete)
|
| 649 |
+
Bob_May_(golfer)
|
| 650 |
+
Bob_Wickman
|
| 651 |
+
Bob_Willis
|
| 652 |
+
Bob_Wollek
|
| 653 |
+
Bob_Woolmer
|
| 654 |
+
Bobbie_Goulding
|
| 655 |
+
Bobby_Bonilla
|
| 656 |
+
Bobby_Charlton
|
| 657 |
+
Bobby_Rahal
|
| 658 |
+
Bobby_Robson
|
| 659 |
+
Bobby_Valentine
|
| 660 |
+
Boca_Juniors
|
| 661 |
+
Boddington_Gold_Mine
|
| 662 |
+
Boeing
|
| 663 |
+
Bogdan_Stelea
|
| 664 |
+
Bogotá
|
| 665 |
+
Bogra
|
| 666 |
+
Bohdan_Ulihrach
|
| 667 |
+
Bohemians_1905
|
| 668 |
+
Boland_cricket_team
|
| 669 |
+
Bolivia
|
| 670 |
+
Bolloré
|
| 671 |
+
Bologna_F.C._1909
|
| 672 |
+
Bolton_Wanderers_F.C.
|
| 673 |
+
Bonn
|
| 674 |
+
Bordeaux
|
| 675 |
+
Boreham_Wood_F.C.
|
| 676 |
+
Boris_Becker
|
| 677 |
+
Boris_Yeltsin
|
| 678 |
+
Borodino_(village),_Mozhaysky_District,_Moscow_Oblast
|
| 679 |
+
Boroughmuir_RFC
|
| 680 |
+
Borussia_Dortmund
|
| 681 |
+
Borussia_Mönchengladbach
|
| 682 |
+
Borussia_Neunkirchen
|
| 683 |
+
Bosnia
|
| 684 |
+
Bosnia_(region)
|
| 685 |
+
Boston
|
| 686 |
+
Boston_Bruins
|
| 687 |
+
Boston_Celtics
|
| 688 |
+
Boston_Red_Sox
|
| 689 |
+
Boston_United_F.C.
|
| 690 |
+
Botafogo_de_Futebol_e_Regatas
|
| 691 |
+
Botswana
|
| 692 |
+
Botswana_national_football_team
|
| 693 |
+
Boulder,_Colorado
|
| 694 |
+
Boutros_Boutros-Ghali
|
| 695 |
+
Boutros_Harb
|
| 696 |
+
Bovine_spongiform_encephalopathy
|
| 697 |
+
Boxer_Protocol
|
| 698 |
+
Brad_Ausmus
|
| 699 |
+
Brad_Bryant
|
| 700 |
+
Brad_Clontz
|
| 701 |
+
Brad_Hogg
|
| 702 |
+
Bradford_Bulls
|
| 703 |
+
Bradford_City_A.F.C.
|
| 704 |
+
Bradford_Vaughan
|
| 705 |
+
Bradley_Hughes_(golfer)
|
| 706 |
+
Brady_Anderson
|
| 707 |
+
Brahim_Lahlafi
|
| 708 |
+
Brasília
|
| 709 |
+
Bratislava
|
| 710 |
+
Brazil
|
| 711 |
+
Brazil_national_football_team
|
| 712 |
+
Brazilian_Football_Confederation
|
| 713 |
+
Bre-X
|
| 714 |
+
Brechin_City_F.C.
|
| 715 |
+
Breda
|
| 716 |
+
Breisach
|
| 717 |
+
Bremen_Airport
|
| 718 |
+
Brenda_Schultz-McCarthy
|
| 719 |
+
Brenden_Pappas
|
| 720 |
+
Brent_Mayne
|
| 721 |
+
Brentford_F.C.
|
| 722 |
+
Brett_Liddle
|
| 723 |
+
Brett_Martin
|
| 724 |
+
Brian_Burke_(ice_hockey)
|
| 725 |
+
Brian_Currin
|
| 726 |
+
Brian_De_Palma
|
| 727 |
+
Brian_Giles
|
| 728 |
+
Brian_Henninger
|
| 729 |
+
Brian_Lara
|
| 730 |
+
Brian_Laudrup
|
| 731 |
+
Brian_McMillan
|
| 732 |
+
Brian_McRae
|
| 733 |
+
Brian_Shimer
|
| 734 |
+
Brian_Wellman
|
| 735 |
+
Bridgend_Ravens
|
| 736 |
+
Brighton_&_Hove_Albion_F.C.
|
| 737 |
+
Brigita_Bukovec
|
| 738 |
+
Brisbane
|
| 739 |
+
Brisbane_Broncos
|
| 740 |
+
Brisbane_Lions
|
| 741 |
+
Bristol
|
| 742 |
+
Bristol_City_F.C.
|
| 743 |
+
Bristol_Rovers_F.C.
|
| 744 |
+
Bristol_Rugby
|
| 745 |
+
British_Airways
|
| 746 |
+
British_Columbia
|
| 747 |
+
British_Heart_Foundation
|
| 748 |
+
British_Jews
|
| 749 |
+
British_Land
|
| 750 |
+
British_Masters
|
| 751 |
+
British_Universities_cricket_team
|
| 752 |
+
British_West_Indies
|
| 753 |
+
British_people
|
| 754 |
+
Brno
|
| 755 |
+
Brown_Deer_Park_Golf_Course
|
| 756 |
+
Bruce_Dyer
|
| 757 |
+
Bruce_Grobbelaar
|
| 758 |
+
Brunei
|
| 759 |
+
Bruno_Risi
|
| 760 |
+
Bruno_Rodriguez
|
| 761 |
+
Bruno_Thiry
|
| 762 |
+
Bruny_Surin
|
| 763 |
+
Brush_Engineered_Materials
|
| 764 |
+
Brussels
|
| 765 |
+
Bryan_Herta
|
| 766 |
+
Bryan_Robson
|
| 767 |
+
Bucharest
|
| 768 |
+
Budapest
|
| 769 |
+
Budapest_Honvéd_FC
|
| 770 |
+
Budapest_Stock_Exchange
|
| 771 |
+
Buddy_Groom
|
| 772 |
+
Buenaventura,_Valle_del_Cauca
|
| 773 |
+
Buenos_Aires
|
| 774 |
+
Buenos_Aires_Province
|
| 775 |
+
Buffalo_Bills
|
| 776 |
+
Buffalo_Sabres
|
| 777 |
+
Building_(magazine)
|
| 778 |
+
Bukavu
|
| 779 |
+
Bulgaria
|
| 780 |
+
Bulgaria_national_football_team
|
| 781 |
+
Bulgaria_national_under-21_football_team
|
| 782 |
+
Bulgarians
|
| 783 |
+
Bunge_Limited
|
| 784 |
+
Bureau_Veritas
|
| 785 |
+
Burhanuddin_Rabbani
|
| 786 |
+
Burkhard_Reich
|
| 787 |
+
Burkina_Faso
|
| 788 |
+
Burma
|
| 789 |
+
Burnley_F.C.
|
| 790 |
+
Burundi
|
| 791 |
+
Burundi_national_football_team
|
| 792 |
+
Bury_F.C.
|
| 793 |
+
Business_Recorder
|
| 794 |
+
Butch_Harmon
|
| 795 |
+
Buñol
|
| 796 |
+
Byron_Black
|
| 797 |
+
Béja
|
| 798 |
+
Béla_Markó
|
| 799 |
+
C.D._Guadalajara
|
| 800 |
+
C.F._Monterrey
|
| 801 |
+
C.F._Os_Belenenses
|
| 802 |
+
C.F._Pachuca
|
| 803 |
+
C._Rangarajan
|
| 804 |
+
CB_Estudiantes
|
| 805 |
+
CB_Sevilla
|
| 806 |
+
CD_Tenerife
|
| 807 |
+
CF_Extremadura
|
| 808 |
+
CITIC_Pacific
|
| 809 |
+
CNBC
|
| 810 |
+
CNN
|
| 811 |
+
CONCACAF_Champions_League
|
| 812 |
+
CRH_plc
|
| 813 |
+
CR_Vasco_da_Gama
|
| 814 |
+
CSP_Limoges
|
| 815 |
+
CS_Jiul_Petroşani
|
| 816 |
+
Cabinet_(government)
|
| 817 |
+
Caerphilly_RFC
|
| 818 |
+
Caesarea
|
| 819 |
+
Cagliari_Calcio
|
| 820 |
+
Cairo
|
| 821 |
+
Cal_Eldred
|
| 822 |
+
Cal_Ripken,_Jr.
|
| 823 |
+
Calgary
|
| 824 |
+
Calgary_Flames
|
| 825 |
+
California
|
| 826 |
+
Caltex
|
| 827 |
+
Calvin_Davis
|
| 828 |
+
Cambodia
|
| 829 |
+
Cambridge,_Massachusetts
|
| 830 |
+
Cambridge_United_F.C.
|
| 831 |
+
Camden,_Arkansas
|
| 832 |
+
Camelot,_Chesapeake,_Virginia
|
| 833 |
+
Cameroon
|
| 834 |
+
Cameroon_national_football_team
|
| 835 |
+
Camilla_Martin
|
| 836 |
+
Canada
|
| 837 |
+
Canadian_Grain_Commission
|
| 838 |
+
Canadian_Prairies
|
| 839 |
+
Canadian_Wheat_Board
|
| 840 |
+
Canberra
|
| 841 |
+
Canberra_Raiders
|
| 842 |
+
Canopic_jar
|
| 843 |
+
Canterbury-Bankstown_Bulldogs
|
| 844 |
+
Cape_Town
|
| 845 |
+
Caracas
|
| 846 |
+
Cardiff
|
| 847 |
+
Cardiff_City_F.C.
|
| 848 |
+
Cardiff_RFC
|
| 849 |
+
Cargill
|
| 850 |
+
Caribbean
|
| 851 |
+
Carl-Uwe_Steeb
|
| 852 |
+
Carl_Fogarty
|
| 853 |
+
Carl_Hooper
|
| 854 |
+
Carl_Lewis
|
| 855 |
+
Carl_Mason
|
| 856 |
+
Carl_Suneson
|
| 857 |
+
Carla_Sacramento
|
| 858 |
+
Carlisle_United_F.C.
|
| 859 |
+
Carlo_Ancelotti
|
| 860 |
+
Carlo_Checchinato
|
| 861 |
+
Carlos_Bianchi
|
| 862 |
+
Carlos_Calado
|
| 863 |
+
Carlos_Checa
|
| 864 |
+
Carlos_Costa
|
| 865 |
+
Carlos_Delgado
|
| 866 |
+
Carlos_Filipe_Ximenes_Belo
|
| 867 |
+
Carlos_Moyá
|
| 868 |
+
Carlos_Pavón
|
| 869 |
+
Carlos_Sainz
|
| 870 |
+
Carlos_Secretário
|
| 871 |
+
Carlsbad,_California
|
| 872 |
+
Carlsberg_Group
|
| 873 |
+
Carlton_Football_Club
|
| 874 |
+
Carole_Montillet
|
| 875 |
+
Carolina_Panthers
|
| 876 |
+
Caroline,_Princess_of_Hanover
|
| 877 |
+
Carroll_A._Campbell,_Jr.
|
| 878 |
+
Carsten_Ramelow
|
| 879 |
+
Carsten_Wolf
|
| 880 |
+
Cartagena,_Colombia
|
| 881 |
+
Casa_de_Nariño
|
| 882 |
+
Casey_FitzRandolph
|
| 883 |
+
Castle_Park_Cricket_Ground
|
| 884 |
+
Castleford_Tigers
|
| 885 |
+
Catalonia
|
| 886 |
+
Catania
|
| 887 |
+
Catholic_Church
|
| 888 |
+
Catholicism
|
| 889 |
+
Cathy_Freeman
|
| 890 |
+
CeBIT
|
| 891 |
+
Cecil_Mamiit
|
| 892 |
+
Celsius
|
| 893 |
+
Celta_de_Vigo
|
| 894 |
+
Celtic_F.C.
|
| 895 |
+
Central_African_Republic
|
| 896 |
+
Central_African_Republic_national_football_team
|
| 897 |
+
Central_Asia
|
| 898 |
+
Central_Bank_of_Brazil
|
| 899 |
+
Central_Clinical_Hospital
|
| 900 |
+
Central_Division_(NBA)
|
| 901 |
+
Central_Division_(NHL)
|
| 902 |
+
Central_European_Free_Trade_Agreement
|
| 903 |
+
Central_Narcotics_Bureau
|
| 904 |
+
Cercle_Brugge_K.S.V.
|
| 905 |
+
Chabab_Massira
|
| 906 |
+
Chad_Curtis
|
| 907 |
+
Chad_Ogea
|
| 908 |
+
Challenge_Cup
|
| 909 |
+
Chaminda_Vaas
|
| 910 |
+
Chanda_Rubin
|
| 911 |
+
Chandigarh
|
| 912 |
+
Chandra_Sturrup
|
| 913 |
+
Chandrika_Kumaratunga
|
| 914 |
+
Changi_Prison
|
| 915 |
+
Channel_2_(Israel)
|
| 916 |
+
Channel_Islands
|
| 917 |
+
Charleroi
|
| 918 |
+
Charles,_Prince_of_Wales
|
| 919 |
+
Charles_Austin
|
| 920 |
+
Charles_Nagy
|
| 921 |
+
Charles_Taylor_(Liberia)
|
| 922 |
+
Charles_VI,_Holy_Roman_Emperor
|
| 923 |
+
Charleston,_South_Carolina
|
| 924 |
+
Charleston,_West_Virginia
|
| 925 |
+
Charlotte_Bobcats
|
| 926 |
+
Charlton_Athletic_F.C.
|
| 927 |
+
Charmaine_Crooks
|
| 928 |
+
Chatichai_Choonhavan
|
| 929 |
+
Chavakacheri
|
| 930 |
+
Chavalit_Yongchaiyudh
|
| 931 |
+
Cheah_Soon_Kit
|
| 932 |
+
Chechen_people
|
| 933 |
+
Chechnya
|
| 934 |
+
Chelsea_Clinton
|
| 935 |
+
Chelsea_F.C.
|
| 936 |
+
Chenab_River
|
| 937 |
+
Cherbourg-Octeville
|
| 938 |
+
Chesapeake,_Virginia
|
| 939 |
+
Chester-le-Street
|
| 940 |
+
Chester_City_F.C.
|
| 941 |
+
Chesterfield
|
| 942 |
+
Chesterfield_F.C.
|
| 943 |
+
Chevron_Corporation
|
| 944 |
+
Chiapas
|
| 945 |
+
Chicago
|
| 946 |
+
Chicago_Bears
|
| 947 |
+
Chicago_Blackhawks
|
| 948 |
+
Chicago_Board_Options_Exchange
|
| 949 |
+
Chicago_Board_of_Trade
|
| 950 |
+
Chicago_Bulls
|
| 951 |
+
Chicago_Cubs
|
| 952 |
+
Chicago_Mercantile_Exchange
|
| 953 |
+
Chicago_Stock_Exchange
|
| 954 |
+
Chicago_White_Sox
|
| 955 |
+
Chihuahua,_Chihuahua
|
| 956 |
+
Chile
|
| 957 |
+
Chile_national_football_team
|
| 958 |
+
Chili_Davis
|
| 959 |
+
Chillicothe,_Ohio
|
| 960 |
+
Chilpancingo
|
| 961 |
+
China_Daily
|
| 962 |
+
China_PR_national_football_team
|
| 963 |
+
China_Steel
|
| 964 |
+
Chinese_language
|
| 965 |
+
Chinese_people
|
| 966 |
+
Chipper_Jones
|
| 967 |
+
Chiquinho_Conde
|
| 968 |
+
Chiron_Corporation
|
| 969 |
+
Chişinău
|
| 970 |
+
Chongqing
|
| 971 |
+
Chorzów
|
| 972 |
+
Chris_Adams_(cricketer)
|
| 973 |
+
Chris_Boardman
|
| 974 |
+
Chris_Cairns
|
| 975 |
+
Chris_Harris_(cricketer)
|
| 976 |
+
Chris_Hay
|
| 977 |
+
Chris_Hoiles
|
| 978 |
+
Chris_Lewis_(cricketer)
|
| 979 |
+
Chris_Patten,_Baron_Patten_of_Barnes
|
| 980 |
+
Chris_Powell
|
| 981 |
+
Chris_Sutton
|
| 982 |
+
Chris_Walker_(squash_player)
|
| 983 |
+
Chris_Witty
|
| 984 |
+
Chris_Woodruff
|
| 985 |
+
Christchurch
|
| 986 |
+
Christian_Blanc
|
| 987 |
+
Christian_Cullen
|
| 988 |
+
Christian_Cévaër
|
| 989 |
+
Christian_Karembeu
|
| 990 |
+
Christian_Ruud
|
| 991 |
+
Christian_Ruuttu
|
| 992 |
+
Christian_Springer
|
| 993 |
+
Christian_Ziege
|
| 994 |
+
Christian_theology
|
| 995 |
+
Christine_Magnusson
|
| 996 |
+
Christine_Wachtel
|
| 997 |
+
Christophe_Bonvin
|
| 998 |
+
Christophe_Ohrel
|
| 999 |
+
Christopher_Reeve
|
| 1000 |
+
Christopher_Wreh
|
| 1001 |
+
Chrysler_Classic_of_Tucson
|
| 1002 |
+
Chryste_Gaines
|
| 1003 |
+
Chua_Jui_Meng
|
| 1004 |
+
Chuck_Adams
|
| 1005 |
+
Chuck_Finley
|
| 1006 |
+
Cincinnati
|
| 1007 |
+
Cincinnati_Bengals
|
| 1008 |
+
Cincinnati_Reds
|
| 1009 |
+
Circuit_de_Spa-Francorchamps
|
| 1010 |
+
Ciriaco_Sforza
|
| 1011 |
+
Civil_Aviation_Administration_of_China
|
| 1012 |
+
Civil_Aviation_Authority_(United_Kingdom)
|
| 1013 |
+
Clarence_Park,_Weston-super-Mare
|
| 1014 |
+
Clarence_Rose
|
| 1015 |
+
Clarence_Seedorf
|
| 1016 |
+
Clarence_Woolmer
|
| 1017 |
+
Clarksburg,_West_Virginia
|
| 1018 |
+
Claude_Lelouch
|
| 1019 |
+
Claude_Makélélé
|
| 1020 |
+
Claudio_Suárez
|
| 1021 |
+
Cleveland
|
| 1022 |
+
Cleveland_Cavaliers
|
| 1023 |
+
Cleveland_Indians
|
| 1024 |
+
Cliftonville_F.C.
|
| 1025 |
+
Clinton_Whitelaw
|
| 1026 |
+
Clive_Lloyd
|
| 1027 |
+
Club_América
|
| 1028 |
+
Club_Atlas
|
| 1029 |
+
Club_Atlético_Banfield
|
| 1030 |
+
Club_Atlético_Huracán
|
| 1031 |
+
Club_Atlético_Independiente
|
| 1032 |
+
Club_Atlético_Lanús
|
| 1033 |
+
Club_Atlético_Platense
|
| 1034 |
+
Club_Atlético_River_Plate
|
| 1035 |
+
Club_Atlético_Vélez_Sársfield
|
| 1036 |
+
Club_Brugge_K.V.
|
| 1037 |
+
Club_Celaya
|
| 1038 |
+
Club_León
|
| 1039 |
+
Club_Necaxa
|
| 1040 |
+
Club_Santos_Laguna
|
| 1041 |
+
Club_Universidad_Nacional
|
| 1042 |
+
Clube_Atlético_Bragantino
|
| 1043 |
+
Clube_Atlético_Mineiro
|
| 1044 |
+
Clube_Atlético_Paranaense
|
| 1045 |
+
Clube_de_Regatas_do_Flamengo
|
| 1046 |
+
Clyde_F.C.
|
| 1047 |
+
Clydebank_F.C.
|
| 1048 |
+
Coalition_(Australia)
|
| 1049 |
+
Coast_guard
|
| 1050 |
+
Cochabamba
|
| 1051 |
+
Cocker_Spaniel
|
| 1052 |
+
Codelco
|
| 1053 |
+
Codos
|
| 1054 |
+
Colchester
|
| 1055 |
+
Colchester_United_F.C.
|
| 1056 |
+
Coleraine_F.C.
|
| 1057 |
+
Colin_Calderwood
|
| 1058 |
+
Colin_Cameron_(footballer)
|
| 1059 |
+
Colin_Edwards
|
| 1060 |
+
Colin_Hendry
|
| 1061 |
+
Colin_Jackson
|
| 1062 |
+
Colin_McRae
|
| 1063 |
+
Colin_Montgomerie
|
| 1064 |
+
Collingtree_Park
|
| 1065 |
+
Collingwood_Football_Club
|
| 1066 |
+
Cologne
|
| 1067 |
+
Colombia
|
| 1068 |
+
Colombian_Liberal_Party
|
| 1069 |
+
Colombo
|
| 1070 |
+
Colorado
|
| 1071 |
+
Colorado_Avalanche
|
| 1072 |
+
Colorado_Rockies
|
| 1073 |
+
Columbia_University
|
| 1074 |
+
Columbus,_Ohio
|
| 1075 |
+
Commack,_New_York
|
| 1076 |
+
Commerce_Bancshares
|
| 1077 |
+
Commission_on_Presidential_Debates
|
| 1078 |
+
Commonwealth_Games
|
| 1079 |
+
Commonwealth_of_Nations
|
| 1080 |
+
Communist_Party_of_China
|
| 1081 |
+
Communist_party
|
| 1082 |
+
Community_of_Madrid
|
| 1083 |
+
Competition_Commission_(United_Kingdom)
|
| 1084 |
+
Comprehensive_Nuclear-Test-Ban_Treaty
|
| 1085 |
+
Conakry
|
| 1086 |
+
Conchita_Martínez
|
| 1087 |
+
Confederate_States_of_America
|
| 1088 |
+
Confederation_of_African_Football
|
| 1089 |
+
Confederation_of_British_Industry
|
| 1090 |
+
Congo_DR_national_football_team
|
| 1091 |
+
Congo_national_football_team
|
| 1092 |
+
Conservative_Party_(UK)
|
| 1093 |
+
Constand_Viljoen
|
| 1094 |
+
Constantin_Gâlcă
|
| 1095 |
+
Constanţa
|
| 1096 |
+
Construction_Industry_Council
|
| 1097 |
+
Continental_AG
|
| 1098 |
+
Copenhagen
|
| 1099 |
+
Coppa_Italia
|
| 1100 |
+
Corey_Pavin
|
| 1101 |
+
Corina_Morariu
|
| 1102 |
+
Coritiba_Foot_Ball_Club
|
| 1103 |
+
Cornelius_Euser
|
| 1104 |
+
Cornell_Brown
|
| 1105 |
+
Corporación_Venezolana_de_Guayana
|
| 1106 |
+
Corsica
|
| 1107 |
+
Cosenza_Calcio_1914
|
| 1108 |
+
Cosmin_Contra
|
| 1109 |
+
Costa_Rica
|
| 1110 |
+
Costa_Rica_national_football_team
|
| 1111 |
+
Costain_Group
|
| 1112 |
+
Costantino_Rocca
|
| 1113 |
+
Costas_Simitis
|
| 1114 |
+
Council_of_Europe
|
| 1115 |
+
County_Antrim
|
| 1116 |
+
County_Championship
|
| 1117 |
+
County_Cricket_Ground,_Bristol
|
| 1118 |
+
County_Cricket_Ground,_Hove
|
| 1119 |
+
County_Tipperary
|
| 1120 |
+
Court_of_Cassation_(France)
|
| 1121 |
+
Courtney_Walsh
|
| 1122 |
+
Coventry_City_F.C.
|
| 1123 |
+
Cowdenbeath_F.C.
|
| 1124 |
+
Craig_Brown_(footballer)
|
| 1125 |
+
Craig_Burley
|
| 1126 |
+
Craig_Dowd
|
| 1127 |
+
Craig_Evans
|
| 1128 |
+
Craig_MacLean
|
| 1129 |
+
Craig_Matthews
|
| 1130 |
+
Craig_Parry
|
| 1131 |
+
Craig_Quinnell
|
| 1132 |
+
Craig_Spearman
|
| 1133 |
+
Craig_Stadler
|
| 1134 |
+
Craig_Wishart
|
| 1135 |
+
Crawley
|
| 1136 |
+
Credit_Suisse
|
| 1137 |
+
Creedmoor,_North_Carolina
|
| 1138 |
+
Creutzfeldt–Jakob_disease
|
| 1139 |
+
Crewe_Alexandra_F.C.
|
| 1140 |
+
Criciúma_Esporte_Clube
|
| 1141 |
+
Cricket_World_Cup
|
| 1142 |
+
Criminal_Investigation_Department
|
| 1143 |
+
Croatia
|
| 1144 |
+
Croatia_Davis_Cup_team
|
| 1145 |
+
Croatia_national_football_team
|
| 1146 |
+
Crohn's_disease
|
| 1147 |
+
Cronulla-Sutherland_Sharks
|
| 1148 |
+
Crossfire_(film)
|
| 1149 |
+
Crusaders_F.C.
|
| 1150 |
+
Cruz_Azul
|
| 1151 |
+
Cruzeiro_Esporte_Clube
|
| 1152 |
+
Crystal_Palace,_London
|
| 1153 |
+
Crystal_Palace_F.C.
|
| 1154 |
+
Crédit_Agricole_(cycling_team)
|
| 1155 |
+
Csepel_SC
|
| 1156 |
+
Cuauhtémoc_Blanco
|
| 1157 |
+
Cuba
|
| 1158 |
+
Cuba_national_football_team
|
| 1159 |
+
Culpeper,_Virginia
|
| 1160 |
+
Curitiba
|
| 1161 |
+
Curragh_Racecourse
|
| 1162 |
+
Currie_RFC
|
| 1163 |
+
Curtis_Fleming
|
| 1164 |
+
Curtly_Ambrose
|
| 1165 |
+
Cy_Young_Award
|
| 1166 |
+
Cycle_Collstrop
|
| 1167 |
+
Cynthia_McKinney
|
| 1168 |
+
Cyprus
|
| 1169 |
+
Cyprus_national_football_team
|
| 1170 |
+
Czech_National_Bank
|
| 1171 |
+
Czech_Republic
|
| 1172 |
+
Czech_Republic_Fed_Cup_team
|
| 1173 |
+
Czech_Republic_men's_national_ice_hockey_team
|
| 1174 |
+
Czech_Republic_national_football_team
|
| 1175 |
+
Czechoslovakia
|
| 1176 |
+
Czechs
|
| 1177 |
+
Cédric_Pioline
|
| 1178 |
+
Côte_d'Ivoire
|
| 1179 |
+
D._A._Weibring
|
| 1180 |
+
DAX
|
| 1181 |
+
DFB-Pokal
|
| 1182 |
+
Daewoo
|
| 1183 |
+
Daily_News_(New_York)
|
| 1184 |
+
Dakar
|
| 1185 |
+
Dale_McIntosh
|
| 1186 |
+
Dalian
|
| 1187 |
+
Dallas
|
| 1188 |
+
Dallas_Cowboys
|
| 1189 |
+
Dallas_Mavericks
|
| 1190 |
+
Dallas_Stars
|
| 1191 |
+
Dally_Randriantefy
|
| 1192 |
+
Dalmatian_(dog)
|
| 1193 |
+
Damascus
|
| 1194 |
+
Damian_Lynch
|
| 1195 |
+
Damion_Easley
|
| 1196 |
+
Damon_Hill
|
| 1197 |
+
Dampier,_Western_Australia
|
| 1198 |
+
Dan_Crowley
|
| 1199 |
+
Dan_Glickman
|
| 1200 |
+
Dan_Jenson
|
| 1201 |
+
Dan_Petrescu
|
| 1202 |
+
Dana_Rohrabacher
|
| 1203 |
+
Daniel_Andersson_(footballer_born_1977)
|
| 1204 |
+
Daniel_Bravo
|
| 1205 |
+
Daniel_Chopra
|
| 1206 |
+
Daniel_Ducruet
|
| 1207 |
+
Daniel_Herbert
|
| 1208 |
+
Daniel_Komen
|
| 1209 |
+
Daniel_Nestor
|
| 1210 |
+
Daniel_Prodan
|
| 1211 |
+
Daniel_Vacek
|
| 1212 |
+
Daniel_da_Cruz_Carvalho
|
| 1213 |
+
Daniele_Carnasciali
|
| 1214 |
+
Danilo_Hondo
|
| 1215 |
+
Danny_Blind
|
| 1216 |
+
Danny_Tartabull
|
| 1217 |
+
Dante_Bichette
|
| 1218 |
+
Darius_Milhaud
|
| 1219 |
+
Dariusz_Rosati
|
| 1220 |
+
Dariusz_Wosz
|
| 1221 |
+
Darlington_F.C.
|
| 1222 |
+
Darren_Anderton
|
| 1223 |
+
Darren_Bragg
|
| 1224 |
+
Darren_Dreifort
|
| 1225 |
+
Darren_Eadie
|
| 1226 |
+
Darren_Garforth
|
| 1227 |
+
Darren_Gough
|
| 1228 |
+
Darren_Jackson
|
| 1229 |
+
Darren_Lehmann
|
| 1230 |
+
Darryl_Powell
|
| 1231 |
+
Darryl_Strawberry
|
| 1232 |
+
Darryn_Hill
|
| 1233 |
+
Daryll_Cullinan
|
| 1234 |
+
Dave_Barr_(golfer)
|
| 1235 |
+
Dave_Gilbert_(cricketer)
|
| 1236 |
+
Dave_McPherson_(footballer)
|
| 1237 |
+
Dave_Nilsson
|
| 1238 |
+
Dave_Richardson
|
| 1239 |
+
Dave_Telgheder
|
| 1240 |
+
Dave_Wilson_(rugby_union)
|
| 1241 |
+
Davey_Johnson
|
| 1242 |
+
David
|
| 1243 |
+
David_Batty
|
| 1244 |
+
David_Boon
|
| 1245 |
+
David_Brabham
|
| 1246 |
+
David_Byas
|
| 1247 |
+
David_Campese
|
| 1248 |
+
David_Carter_(golfer)
|
| 1249 |
+
David_Coulthard
|
| 1250 |
+
David_Elleray
|
| 1251 |
+
David_Evans_(squash_player)
|
| 1252 |
+
David_Giffin
|
| 1253 |
+
David_Gilford
|
| 1254 |
+
David_Ginola
|
| 1255 |
+
David_Howell_(golfer)
|
| 1256 |
+
David_Hulse_(baseball)
|
| 1257 |
+
David_J_Russell
|
| 1258 |
+
David_Kelly_(footballer)
|
| 1259 |
+
David_Levy_(Israeli_politician)
|
| 1260 |
+
David_MacEachern
|
| 1261 |
+
David_Millns
|
| 1262 |
+
David_Peleg
|
| 1263 |
+
David_Platt_(footballer)
|
| 1264 |
+
David_Prinosil
|
| 1265 |
+
David_Richards_(racing)
|
| 1266 |
+
David_Rikl
|
| 1267 |
+
David_Rowson
|
| 1268 |
+
David_Segui
|
| 1269 |
+
David_Sesa
|
| 1270 |
+
David_Wheaton
|
| 1271 |
+
David_Zitelli
|
| 1272 |
+
David_Škoch
|
| 1273 |
+
Davidson_Ezinwa
|
| 1274 |
+
Davis_Cup
|
| 1275 |
+
Davis_Kamoga
|
| 1276 |
+
Davis_Love_III
|
| 1277 |
+
Davor_Šuker
|
| 1278 |
+
Dawn_(newspaper)
|
| 1279 |
+
Dayton,_Ohio
|
| 1280 |
+
Dayton_Agreement
|
| 1281 |
+
De_Graafschap
|
| 1282 |
+
Dead_Sea
|
| 1283 |
+
Dean_Gorré
|
| 1284 |
+
Dean_Headley
|
| 1285 |
+
Dean_Holdsworth
|
| 1286 |
+
Dean_Jones_(cricketer)
|
| 1287 |
+
Dean_Palmer
|
| 1288 |
+
Dean_Richards_(rugby_union)
|
| 1289 |
+
Dean_Saunders
|
| 1290 |
+
Dean_Sturridge
|
| 1291 |
+
Dean_Ward
|
| 1292 |
+
Dean_Windass
|
| 1293 |
+
Debbie_Graham
|
| 1294 |
+
Deborah_Compagnoni
|
| 1295 |
+
Debreceni_VSC
|
| 1296 |
+
Decatur,_Illinois
|
| 1297 |
+
Deere_&_Company
|
| 1298 |
+
Dejan_Koturović
|
| 1299 |
+
Dejan_Savićević
|
| 1300 |
+
Dejan_Stefanović
|
| 1301 |
+
Del_Harris_(squash_player)
|
| 1302 |
+
Delfino_Pescara_1936
|
| 1303 |
+
Delino_DeShields
|
| 1304 |
+
Democracy_Wall
|
| 1305 |
+
Democratic_Karen_Buddhist_Army
|
| 1306 |
+
Democratic_Left_Alliance
|
| 1307 |
+
Democratic_National_Convention
|
| 1308 |
+
Democratic_Party_(Hong_Kong)
|
| 1309 |
+
Democratic_Party_(United_States)
|
| 1310 |
+
Democratic_Party_of_Iranian_Kurdistan
|
| 1311 |
+
Democratic_Republic_of_the_Congo
|
| 1312 |
+
Democratic_Union_of_Hungarians_in_Romania
|
| 1313 |
+
Deng_Xiaoping
|
| 1314 |
+
Denis_Irwin
|
| 1315 |
+
Denis_Streak
|
| 1316 |
+
Denmark
|
| 1317 |
+
Dennis_Bergkamp
|
| 1318 |
+
Dennis_Lillee
|
| 1319 |
+
Dennis_Mitchell
|
| 1320 |
+
Dennis_Ross
|
| 1321 |
+
Denny_Neagle
|
| 1322 |
+
Denver
|
| 1323 |
+
Denver_Broncos
|
| 1324 |
+
Denver_Nuggets
|
| 1325 |
+
Deon_Hemmings
|
| 1326 |
+
Department_for_International_Development
|
| 1327 |
+
Deportivo_Español
|
| 1328 |
+
Deportivo_Toluca_F.C.
|
| 1329 |
+
Deportivo_de_La_Coruña
|
| 1330 |
+
Der_Spiegel
|
| 1331 |
+
Derby_County_F.C.
|
| 1332 |
+
Derbyshire_County_Cricket_Club
|
| 1333 |
+
Derek_Crookes
|
| 1334 |
+
Derek_Jeter
|
| 1335 |
+
Derek_Mills
|
| 1336 |
+
Derek_Ringer
|
| 1337 |
+
Derek_Ryan
|
| 1338 |
+
Derrick_Adkins
|
| 1339 |
+
Derrick_Cooper
|
| 1340 |
+
Des_Moines,_Iowa
|
| 1341 |
+
Des_Smyth
|
| 1342 |
+
Des_Terblanche
|
| 1343 |
+
Desmond_Tutu
|
| 1344 |
+
Desvonde_Botes
|
| 1345 |
+
Detroit
|
| 1346 |
+
Detroit_Lions
|
| 1347 |
+
Detroit_Pistons
|
| 1348 |
+
Detroit_Red_Wings
|
| 1349 |
+
Detroit_Tigers
|
| 1350 |
+
Deutsche_Bahn
|
| 1351 |
+
Deutsche_Bundesbank
|
| 1352 |
+
Deutsche_Mark
|
| 1353 |
+
Devon_White_(baseball)
|
| 1354 |
+
Dewas
|
| 1355 |
+
Dhahran
|
| 1356 |
+
Dhaka
|
| 1357 |
+
Dhaka_Stock_Exchange
|
| 1358 |
+
Dhar
|
| 1359 |
+
Dia_(supermarket_chain)
|
| 1360 |
+
Diana,_Princess_of_Wales
|
| 1361 |
+
Dianne_Feinstein
|
| 1362 |
+
Diario_16
|
| 1363 |
+
Dick_Gephardt
|
| 1364 |
+
Dick_Morris
|
| 1365 |
+
Dick_Schreuder
|
| 1366 |
+
Dick_Spring
|
| 1367 |
+
Didier_Deschamps
|
| 1368 |
+
Diego_Borrego
|
| 1369 |
+
Diego_Domínguez
|
| 1370 |
+
Dieter_Eilts
|
| 1371 |
+
Dieter_Ramusch
|
| 1372 |
+
Dieter_Thoma
|
| 1373 |
+
Dietmar_Beiersdorfer
|
| 1374 |
+
Dietmar_Hirsch
|
| 1375 |
+
Dietmar_Kühbauer
|
| 1376 |
+
Dili
|
| 1377 |
+
Dimas_Teixeira
|
| 1378 |
+
Dinamina
|
| 1379 |
+
Dirk_Coetzee
|
| 1380 |
+
Dirk_Medved
|
| 1381 |
+
Dirk_Wiese
|
| 1382 |
+
Discovery_Channel_Pro_Cycling_Team
|
| 1383 |
+
Divaina
|
| 1384 |
+
Dmitri_Dashinski
|
| 1385 |
+
Dmitri_Markov
|
| 1386 |
+
Dnevni_Avaz
|
| 1387 |
+
Doberman_Pinscher
|
| 1388 |
+
Doboj
|
| 1389 |
+
Dodge_City,_Kansas
|
| 1390 |
+
Doetinchem
|
| 1391 |
+
Doku_Zavgayev
|
| 1392 |
+
Dominic_Cork
|
| 1393 |
+
Dominic_Hewson
|
| 1394 |
+
Dominion_Bond_Rating_Service
|
| 1395 |
+
Dominique_Baratelli
|
| 1396 |
+
Dominique_Monami
|
| 1397 |
+
Don_McKinnon
|
| 1398 |
+
Don_Wengert
|
| 1399 |
+
Donald_Tsang
|
| 1400 |
+
Donaldson,_Lufkin_&_Jenrette
|
| 1401 |
+
Donato_Gama_da_Silva
|
| 1402 |
+
Doncaster_Cup
|
| 1403 |
+
Doncaster_Rovers_F.C.
|
| 1404 |
+
Dong_Jiong
|
| 1405 |
+
Donna_Andrews_(golfer)
|
| 1406 |
+
Donna_Weinbrecht
|
| 1407 |
+
Donne_Wall
|
| 1408 |
+
Donovan_Bailey
|
| 1409 |
+
Dore_Gold
|
| 1410 |
+
Dorinel_Munteanu
|
| 1411 |
+
Doug_Flach
|
| 1412 |
+
Doug_Young
|
| 1413 |
+
Dow_Chemical_Company
|
| 1414 |
+
Dow_Jones_Industrial_Average
|
| 1415 |
+
Dresden
|
| 1416 |
+
Dresden_Airport
|
| 1417 |
+
Dubai
|
| 1418 |
+
Dublin
|
| 1419 |
+
Ducati
|
| 1420 |
+
Ducati_Corse
|
| 1421 |
+
Duff_&_Phelps
|
| 1422 |
+
Duffy_Waldorf
|
| 1423 |
+
Duhok,_Iraq
|
| 1424 |
+
Duilio_Davino
|
| 1425 |
+
Duluth,_Minnesota
|
| 1426 |
+
Duma
|
| 1427 |
+
Dumbarton_F.C.
|
| 1428 |
+
Duncan_Ferguson
|
| 1429 |
+
Dundee_F.C.
|
| 1430 |
+
Dundee_United_F.C.
|
| 1431 |
+
Dunedin
|
| 1432 |
+
Dunfermline_Athletic_F.C.
|
| 1433 |
+
Dunnes_Stores
|
| 1434 |
+
Dunvant_RFC
|
| 1435 |
+
Durban
|
| 1436 |
+
Durham_County_Cricket_Club
|
| 1437 |
+
Durrës
|
| 1438 |
+
Dushanbe
|
| 1439 |
+
Dust_Bowl
|
| 1440 |
+
Dutch_people
|
| 1441 |
+
Dwight_Yorke
|
| 1442 |
+
Dynamo_Sports_Club
|
| 1443 |
+
Dzhokhar_Dudayev
|
| 1444 |
+
Dési_Bouterse
|
| 1445 |
+
Dănuţ_Lupu
|
| 1446 |
+
ETA
|
| 1447 |
+
Eamonn_Darcy
|
| 1448 |
+
East_Fife_F.C.
|
| 1449 |
+
East_Germany
|
| 1450 |
+
East_Java
|
| 1451 |
+
East_Jerusalem
|
| 1452 |
+
East_Kalimantan
|
| 1453 |
+
East_North_Central_States
|
| 1454 |
+
East_Stirlingshire_F.C.
|
| 1455 |
+
East_Timor
|
| 1456 |
+
Eau_Claire,_Wisconsin
|
| 1457 |
+
Ebbw_Vale_RFC
|
| 1458 |
+
Eberhard_Carl
|
| 1459 |
+
Economic_Community_of_West_African_States
|
| 1460 |
+
Economic_Community_of_West_African_States_Monitoring_Group
|
| 1461 |
+
Ecuador
|
| 1462 |
+
Ed_Vosberg
|
| 1463 |
+
Ed_de_Goey
|
| 1464 |
+
Eddie_Irvine
|
| 1465 |
+
Eddie_Murray
|
| 1466 |
+
Eddo_Brandes
|
| 1467 |
+
Edgar_Davids
|
| 1468 |
+
Edgar_Martínez
|
| 1469 |
+
Edgar_Rentería
|
| 1470 |
+
Edgbaston
|
| 1471 |
+
Edgbaston_Cricket_Ground
|
| 1472 |
+
Edinburgh
|
| 1473 |
+
Edmonton
|
| 1474 |
+
Edmonton_Oilers
|
| 1475 |
+
Eduard_Gritsun
|
| 1476 |
+
Eduardo_Romero
|
| 1477 |
+
Edvard_Grieg
|
| 1478 |
+
Edward_Dmytryk
|
| 1479 |
+
Edward_Said
|
| 1480 |
+
Edwin_Godee
|
| 1481 |
+
Edwin_Vurens
|
| 1482 |
+
Edwin_van_der_Sar
|
| 1483 |
+
Edwina_Currie
|
| 1484 |
+
Efan_Ekoku
|
| 1485 |
+
Efes_Pilsen_S.K.
|
| 1486 |
+
Egypt
|
| 1487 |
+
EgyptAir
|
| 1488 |
+
Egyptians
|
| 1489 |
+
Eindhoven
|
| 1490 |
+
Ejup_Ganić
|
| 1491 |
+
El_Al
|
| 1492 |
+
El_Mundo_(Spain)
|
| 1493 |
+
El_Nuevo_Diario
|
| 1494 |
+
El_País
|
| 1495 |
+
El_Salvador
|
| 1496 |
+
El_Salvador_national_football_team
|
| 1497 |
+
El_Watan
|
| 1498 |
+
Elakhbar
|
| 1499 |
+
Elena_Likhovtseva
|
| 1500 |
+
Elena_Makarova
|
| 1501 |
+
Elena_Pampoulova
|
| 1502 |
+
Eleusina
|
| 1503 |
+
Elf_Aquitaine
|
| 1504 |
+
Elgin_City_F.C.
|
| 1505 |
+
Elia_Kazan
|
| 1506 |
+
Eliyahu_Ben-Elissar
|
| 1507 |
+
Elizabeth,_New_Jersey
|
| 1508 |
+
Elizabeth_I_of_England
|
| 1509 |
+
Elizabeth_McIntyre
|
| 1510 |
+
Elland_Road
|
| 1511 |
+
Ellina_Zvereva
|
| 1512 |
+
Ellis_Burks
|
| 1513 |
+
Ellis_Park_Stadium
|
| 1514 |
+
Els_Callens
|
| 1515 |
+
Emanuele_Canonica
|
| 1516 |
+
Emil_Constantinescu
|
| 1517 |
+
Emiliano_Mondonico
|
| 1518 |
+
Emilio_Valle
|
| 1519 |
+
Emmanuel_Tetteh
|
| 1520 |
+
Empire_State_Building
|
| 1521 |
+
Empire_of_Brazil
|
| 1522 |
+
Empoli_F.C.
|
| 1523 |
+
En_Avant_de_Guingamp
|
| 1524 |
+
Endrio_Leoni
|
| 1525 |
+
Enfield_Town_F.C.
|
| 1526 |
+
England
|
| 1527 |
+
England_cricket_team
|
| 1528 |
+
England_national_football_team
|
| 1529 |
+
England_national_rugby_union_team
|
| 1530 |
+
English_language
|
| 1531 |
+
English_people
|
| 1532 |
+
Enrico_Chiesa
|
| 1533 |
+
Enrique_Alfaro
|
| 1534 |
+
Environment_Canada
|
| 1535 |
+
Enzo_Scifo
|
| 1536 |
+
Equipe_Ligier
|
| 1537 |
+
Equitas
|
| 1538 |
+
Eredivisie
|
| 1539 |
+
Erez
|
| 1540 |
+
Eric_Anthony
|
| 1541 |
+
Eric_Bergoust
|
| 1542 |
+
Eric_Davis_(baseball)
|
| 1543 |
+
Eric_Rush
|
| 1544 |
+
Eric_Thomas_(athlete)
|
| 1545 |
+
Eric_Wynalda
|
| 1546 |
+
Ericsson
|
| 1547 |
+
Erik_Breukink
|
| 1548 |
+
Erik_Dekker
|
| 1549 |
+
Erik_Hanson
|
| 1550 |
+
Erik_Zabel
|
| 1551 |
+
Eritrea
|
| 1552 |
+
Erjon_Bogdani
|
| 1553 |
+
Ernest_Faber
|
| 1554 |
+
Ernesto_Samper
|
| 1555 |
+
Ernie_Els
|
| 1556 |
+
Ervin_Fakaj
|
| 1557 |
+
Erzincan
|
| 1558 |
+
Eschen
|
| 1559 |
+
Espen_Bredesen
|
| 1560 |
+
Esporte_Clube_Bahia
|
| 1561 |
+
Esporte_Clube_Flamengo
|
| 1562 |
+
Esporte_Clube_Juventude
|
| 1563 |
+
Esporte_Clube_Vitória
|
| 1564 |
+
Essendon_Football_Club
|
| 1565 |
+
Essex
|
| 1566 |
+
Essex_County_Cricket_Club
|
| 1567 |
+
Essilor
|
| 1568 |
+
Estonia
|
| 1569 |
+
Estonia_national_football_team
|
| 1570 |
+
Estonian_Reform_Party
|
| 1571 |
+
Estudiantes_Tecos
|
| 1572 |
+
Estudiantes_de_La_Plata
|
| 1573 |
+
Eternit
|
| 1574 |
+
Ethiopia
|
| 1575 |
+
Ethiopia_national_football_team
|
| 1576 |
+
Etienne_Saqr
|
| 1577 |
+
Etruria
|
| 1578 |
+
Eugene_Emeralds
|
| 1579 |
+
Eugene_de_Kock
|
| 1580 |
+
Eugenio_Corini
|
| 1581 |
+
Eurodollar
|
| 1582 |
+
Euroleague_Basketball
|
| 1583 |
+
Euronext_Paris
|
| 1584 |
+
Europe
|
| 1585 |
+
Europe_1
|
| 1586 |
+
European_Commission
|
| 1587 |
+
European_Court_of_Human_Rights
|
| 1588 |
+
European_Cup_(athletics)
|
| 1589 |
+
European_Economic_Community
|
| 1590 |
+
European_Union
|
| 1591 |
+
Euroscepticism
|
| 1592 |
+
Eurostat
|
| 1593 |
+
Eurotunnel
|
| 1594 |
+
Evelyne_Leu
|
| 1595 |
+
Everton_F.C.
|
| 1596 |
+
Ewald_Brenner
|
| 1597 |
+
Exeter_City_F.C.
|
| 1598 |
+
Expansión
|
| 1599 |
+
Exxon
|
| 1600 |
+
ExxonMobil
|
| 1601 |
+
Ezer_Weizman
|
| 1602 |
+
F.C._Hansa_Rostock
|
| 1603 |
+
F.C._Internazionale_Milano
|
| 1604 |
+
F.C._Porto
|
| 1605 |
+
F._W._de_Klerk
|
| 1606 |
+
FA_Cup
|
| 1607 |
+
FC_Aarau
|
| 1608 |
+
FC_Alania_Vladikavkaz
|
| 1609 |
+
FC_Baltika_Kaliningrad
|
| 1610 |
+
FC_Baník_Ostrava
|
| 1611 |
+
FC_Barcelona
|
| 1612 |
+
FC_Barcelona_Bàsquet
|
| 1613 |
+
FC_Bayern_Munich
|
| 1614 |
+
FC_CSKA_Kyiv
|
| 1615 |
+
FC_Ceahlăul_Piatra_Neamţ
|
| 1616 |
+
FC_Chornomorets_Odesa
|
| 1617 |
+
FC_Dinamo_Batumi
|
| 1618 |
+
FC_Dinamo_Bucureşti
|
| 1619 |
+
FC_Dnipro_Dnipropetrovsk
|
| 1620 |
+
FC_Dynamo_Kyiv
|
| 1621 |
+
FC_Dynamo_Moscow
|
| 1622 |
+
FC_Girondins_de_Bordeaux
|
| 1623 |
+
FC_Groningen
|
| 1624 |
+
FC_Hradec_Králové
|
| 1625 |
+
FC_Karpaty_Lviv
|
| 1626 |
+
FC_Kotayk_Abovian
|
| 1627 |
+
FC_Kremin_Kremenchuk
|
| 1628 |
+
FC_Krylia_Sovetov_Samara
|
| 1629 |
+
FC_Kryvbas_Kryvyi_Rih
|
| 1630 |
+
FC_Lada_Togliatti
|
| 1631 |
+
FC_Lausanne-Sport
|
| 1632 |
+
FC_Linz
|
| 1633 |
+
FC_Lokomotiv_Moscow
|
| 1634 |
+
FC_Lokomotiv_Nizhny_Novgorod
|
| 1635 |
+
FC_Lokomotíva_Košice
|
| 1636 |
+
FC_Lugano
|
| 1637 |
+
FC_Luzern
|
| 1638 |
+
FC_Metalurh_Zaporizhya
|
| 1639 |
+
FC_Metz
|
| 1640 |
+
FC_Nantes
|
| 1641 |
+
FC_Nitra
|
| 1642 |
+
FC_Nyva_Ternopil
|
| 1643 |
+
FC_Oţelul_Galaţi
|
| 1644 |
+
FC_Rapid_Bucureşti
|
| 1645 |
+
FC_Red_Bull_Salzburg
|
| 1646 |
+
FC_Rostov
|
| 1647 |
+
FC_Rotor_Volgograd
|
| 1648 |
+
FC_Schalke_04
|
| 1649 |
+
FC_Shakhtar_Donetsk
|
| 1650 |
+
FC_Sion
|
| 1651 |
+
FC_Slovan_Liberec
|
| 1652 |
+
FC_Spartak_Moscow
|
| 1653 |
+
FC_Spartak_Trnava
|
| 1654 |
+
FC_Sportul_Studenţesc_Bucureşti
|
| 1655 |
+
FC_St._Gallen
|
| 1656 |
+
FC_St._Pauli
|
| 1657 |
+
FC_Steaua_Bucureşti
|
| 1658 |
+
FC_Tekstilshchik_Kamyshin
|
| 1659 |
+
FC_Tiraspol
|
| 1660 |
+
FC_Tirol_Innsbruck
|
| 1661 |
+
FC_Torpedo_Moscow
|
| 1662 |
+
FC_Torpedo_Zaporizhya
|
| 1663 |
+
FC_Twente
|
| 1664 |
+
FC_Universitatea_Cluj
|
| 1665 |
+
FC_Universitatea_Craiova
|
| 1666 |
+
FC_Ural_Sverdlovsk_Oblast
|
| 1667 |
+
FC_Utrecht
|
| 1668 |
+
FC_Vaduz
|
| 1669 |
+
FC_Viktoria_Plzeň
|
| 1670 |
+
FC_Volendam
|
| 1671 |
+
FC_Volgograd
|
| 1672 |
+
FC_Vorskla_Poltava
|
| 1673 |
+
FC_Zbrojovka_Brno
|
| 1674 |
+
FC_Zenit_Saint_Petersburg
|
| 1675 |
+
FC_Zhemchuzhina-Sochi
|
| 1676 |
+
FDA_(trade_union)
|
| 1677 |
+
FIFA
|
| 1678 |
+
FIFA_World_Cup
|
| 1679 |
+
FIS_Alpine_Ski_World_Cup
|
| 1680 |
+
FIS_Freestyle_Skiing_World_Cup
|
| 1681 |
+
FIS_Ski_Jumping_World_Cup
|
| 1682 |
+
FK_Austria_Wien
|
| 1683 |
+
FK_Baumit_Jablonec
|
| 1684 |
+
FK_Borac_Čačak
|
| 1685 |
+
FK_Budućnost_Podgorica
|
| 1686 |
+
FK_DAC_1904_Dunajská_Streda
|
| 1687 |
+
FK_Drnovice
|
| 1688 |
+
FK_Dukla_Banská_Bystrica
|
| 1689 |
+
FK_Hajduk_Beograd
|
| 1690 |
+
FK_Hajduk_Kula
|
| 1691 |
+
FK_Inter_Bratislava
|
| 1692 |
+
FK_Kareda_Kaunas
|
| 1693 |
+
FK_Kikinda
|
| 1694 |
+
FK_Metalurg_Skopje
|
| 1695 |
+
FK_Partizan
|
| 1696 |
+
FK_Proleter_Zrenjanin
|
| 1697 |
+
FK_Rad
|
| 1698 |
+
FK_Rudar_Pljevlja
|
| 1699 |
+
FK_Rudar_Ugljevik
|
| 1700 |
+
FK_Sloboda_Tuzla
|
| 1701 |
+
FK_Sloga_Jugomagnat
|
| 1702 |
+
FK_Spartak_Zlatibor_Voda
|
| 1703 |
+
FK_Sutjeska_Foča
|
| 1704 |
+
FK_Sutjeska_Nikšić
|
| 1705 |
+
FK_Teplice
|
| 1706 |
+
FK_Viktoria_Žižkov
|
| 1707 |
+
FK_Vojvodina
|
| 1708 |
+
FK_Zemun
|
| 1709 |
+
FSC_Prykarpattya_Ivano-Frankivsk
|
| 1710 |
+
FTSE_100_Index
|
| 1711 |
+
Fabio_Baldato
|
| 1712 |
+
Fabio_Cannavaro
|
| 1713 |
+
Fabio_Capello
|
| 1714 |
+
Fabrizio_Mori
|
| 1715 |
+
Fabrizio_Ravanelli
|
| 1716 |
+
Fairmont,_West_Virginia
|
| 1717 |
+
Fairview,_Texas
|
| 1718 |
+
Falilat_Ogunkoya
|
| 1719 |
+
Falk_Balzer
|
| 1720 |
+
Falkirk_F.C.
|
| 1721 |
+
Fanie_de_Villiers
|
| 1722 |
+
Farmington_Hills,_Michigan
|
| 1723 |
+
Faroe_Islands
|
| 1724 |
+
Faroe_Islands_national_football_team
|
| 1725 |
+
Fatima_Yusuf
|
| 1726 |
+
Fatmir_Vata
|
| 1727 |
+
Fatos_Nano
|
| 1728 |
+
Faustino_Asprilla
|
| 1729 |
+
Fausto_Pizzi
|
| 1730 |
+
Fed_Cup
|
| 1731 |
+
Federal_Aviation_Administration
|
| 1732 |
+
Federal_Bureau_of_Investigation
|
| 1733 |
+
Federal_Open_Market_Committee
|
| 1734 |
+
Federal_Reserve_System
|
| 1735 |
+
Felipe_Lira
|
| 1736 |
+
Fenerbahçe_S.K.
|
| 1737 |
+
Ferdi_Vierklau
|
| 1738 |
+
Ferenc_Horváth
|
| 1739 |
+
Ferencvárosi_TC
|
| 1740 |
+
Fernanda_Ribeiro
|
| 1741 |
+
Fernando_Couto
|
| 1742 |
+
Fernando_Henrique_Cardoso
|
| 1743 |
+
Fernando_Hierro
|
| 1744 |
+
Fernando_Meligeni
|
| 1745 |
+
Fernando_Redondo
|
| 1746 |
+
Fernando_Sanz
|
| 1747 |
+
Ferrari
|
| 1748 |
+
Ferro_Carril_Oeste
|
| 1749 |
+
Feyenoord
|
| 1750 |
+
Fidel_Castro
|
| 1751 |
+
Fidel_V._Ramos
|
| 1752 |
+
Filip_De_Wilde
|
| 1753 |
+
Filip_Dewulf
|
| 1754 |
+
Filippo_Inzaghi
|
| 1755 |
+
Finance_minister
|
| 1756 |
+
Financial_Post
|
| 1757 |
+
Financial_Services_Authority
|
| 1758 |
+
Finland
|
| 1759 |
+
Finland_men's_national_ice_hockey_team
|
| 1760 |
+
Fiona_May
|
| 1761 |
+
First_Chicago_Bank
|
| 1762 |
+
First_Pacific
|
| 1763 |
+
Fita_Bayisa
|
| 1764 |
+
Fitzroy_Football_Club
|
| 1765 |
+
Five_Nations_XV
|
| 1766 |
+
Flachau
|
| 1767 |
+
Flag_of_the_United_States
|
| 1768 |
+
Flamurtari_Vlorë
|
| 1769 |
+
Flavio_Cotti
|
| 1770 |
+
Florence
|
| 1771 |
+
Florence_Masnada
|
| 1772 |
+
Florencia_Labat
|
| 1773 |
+
Florian_Maurice
|
| 1774 |
+
Florian_Rousseau
|
| 1775 |
+
Florian_Schwarthoff
|
| 1776 |
+
Florida_Marlins
|
| 1777 |
+
Florida_Panthers
|
| 1778 |
+
Florin_Prunea
|
| 1779 |
+
Fluminense_Football_Club
|
| 1780 |
+
Flushing_Meadows_–_Corona_Park
|
| 1781 |
+
Foindu
|
| 1782 |
+
Football_Association_of_Ireland
|
| 1783 |
+
Footwork_Arrows
|
| 1784 |
+
Ford_Escort
|
| 1785 |
+
Ford_Escort_(Europe)
|
| 1786 |
+
Ford_Motor_Company
|
| 1787 |
+
Ford_World_Rally_Team
|
| 1788 |
+
Foreign_Office_(Germany)
|
| 1789 |
+
Foreign_minister
|
| 1790 |
+
Forfar_Athletic_F.C.
|
| 1791 |
+
Formula_One
|
| 1792 |
+
Forrest_Gump
|
| 1793 |
+
Forsa_institute
|
| 1794 |
+
Fort_Lauderdale,_Florida
|
| 1795 |
+
Fort_Worth,_Texas
|
| 1796 |
+
Forth_Road_Bridge
|
| 1797 |
+
Fortitudo_Bologna
|
| 1798 |
+
Fortuna_Düsseldorf
|
| 1799 |
+
Fortuna_Sittard
|
| 1800 |
+
Fos-sur-Mer
|
| 1801 |
+
Fourth_World_Conference_on_Women
|
| 1802 |
+
Fox_Broadcasting_Company
|
| 1803 |
+
France
|
| 1804 |
+
France_Fed_Cup_team
|
| 1805 |
+
France_Soir
|
| 1806 |
+
France_Télécom
|
| 1807 |
+
France_national_football_team
|
| 1808 |
+
Francesca_Lubiani
|
| 1809 |
+
Francesco_Casagrande
|
| 1810 |
+
Francesco_Mazzariol
|
| 1811 |
+
Francesco_Toldo
|
| 1812 |
+
Francesco_Totti
|
| 1813 |
+
Francis_Agyepong
|
| 1814 |
+
Francis_Moreau
|
| 1815 |
+
Francisco_Clavet
|
| 1816 |
+
Francisco_Palencia
|
| 1817 |
+
Franco_Baresi
|
| 1818 |
+
Frank_Bruno
|
| 1819 |
+
Frank_Bunce
|
| 1820 |
+
Frank_Busemann
|
| 1821 |
+
Frank_Leboeuf
|
| 1822 |
+
Frank_Nobilo
|
| 1823 |
+
Frank_Rodriguez
|
| 1824 |
+
Frank_Thomas_(baseball,_born_1968)
|
| 1825 |
+
Frank_Vandenbroucke_(cyclist)
|
| 1826 |
+
Frank_de_Boer
|
| 1827 |
+
Franka_Dietzsch
|
| 1828 |
+
Frankfurt_Airport
|
| 1829 |
+
Frankfurt_Stock_Exchange
|
| 1830 |
+
Frankfurt_am_Main
|
| 1831 |
+
Frankie_Fredericks
|
| 1832 |
+
Franklin_D._Roosevelt
|
| 1833 |
+
Franz_Fischler
|
| 1834 |
+
Franz_Konrad
|
| 1835 |
+
Franziska_Schenk
|
| 1836 |
+
François_Pienaar
|
| 1837 |
+
Fraser,_Australian_Capital_Territory
|
| 1838 |
+
Fred_Couples
|
| 1839 |
+
Fred_Funk
|
| 1840 |
+
Fred_McGriff
|
| 1841 |
+
Fred_Trueman
|
| 1842 |
+
Frederick_Chiluba
|
| 1843 |
+
Fredi_Bobic
|
| 1844 |
+
Free_Democratic_Party_(Germany)
|
| 1845 |
+
Free_Democratic_Party_of_Switzerland
|
| 1846 |
+
Freedom_Front_Plus
|
| 1847 |
+
Freetown
|
| 1848 |
+
Freiburg_im_Breisgau
|
| 1849 |
+
Fremantle_Football_Club
|
| 1850 |
+
French_Democratic_Confederation_of_Labour
|
| 1851 |
+
French_Guiana
|
| 1852 |
+
French_Open
|
| 1853 |
+
French_Riviera
|
| 1854 |
+
Fribourg
|
| 1855 |
+
Fritz_van_Heerden
|
| 1856 |
+
Frode_Andresen
|
| 1857 |
+
Frédéric_Magné
|
| 1858 |
+
Frédéric_Peiremans
|
| 1859 |
+
Fulgencio_Batista
|
| 1860 |
+
Fulham_F.C.
|
| 1861 |
+
Fung_Permadi
|
| 1862 |
+
Fußball-Bundesliga
|
| 1863 |
+
Fédération_Syndicale_Unitaire
|
| 1864 |
+
Félicia_Ballanger
|
| 1865 |
+
Félix_Mantilla_Botella
|
| 1866 |
+
GKS_Bełchatów
|
| 1867 |
+
GKS_Katowice
|
| 1868 |
+
Gabon
|
| 1869 |
+
Gabon_national_football_team
|
| 1870 |
+
Gabriel_Batistuta
|
| 1871 |
+
Gabriel_Curuchet
|
| 1872 |
+
Gabriela_Sabatini
|
| 1873 |
+
Gabriela_Szabo
|
| 1874 |
+
Gabriele_Colombo
|
| 1875 |
+
Gail_Devers
|
| 1876 |
+
Gala_León_García
|
| 1877 |
+
Galanta
|
| 1878 |
+
Galatasaray_S.K._(football_team)
|
| 1879 |
+
Gale_Norton
|
| 1880 |
+
Galina_Malchugina
|
| 1881 |
+
Galo_Blanco
|
| 1882 |
+
Garamba_National_Park
|
| 1883 |
+
Gareth_Farrelly
|
| 1884 |
+
Garhi_Habibullah
|
| 1885 |
+
Garret_Anderson
|
| 1886 |
+
Garrett_Hines
|
| 1887 |
+
Garry_Galley
|
| 1888 |
+
Garry_Pagel
|
| 1889 |
+
Gartner
|
| 1890 |
+
Gary_Breen
|
| 1891 |
+
Gary_DiSarcina
|
| 1892 |
+
Gary_Emerson
|
| 1893 |
+
Gary_Kelly_(footballer_born_1974)
|
| 1894 |
+
Gary_Kirsten
|
| 1895 |
+
Gary_McAllister
|
| 1896 |
+
Gary_Neiwand
|
| 1897 |
+
Gary_Orr
|
| 1898 |
+
Gary_Sheffield
|
| 1899 |
+
Gary_Speed
|
| 1900 |
+
Gary_Teichmann
|
| 1901 |
+
Gaston_Taument
|
| 1902 |
+
Gatwick_Airport
|
| 1903 |
+
Gaza
|
| 1904 |
+
Gaza_Strip
|
| 1905 |
+
Gazeta_Wyborcza
|
| 1906 |
+
Gazprom
|
| 1907 |
+
Gdańsk
|
| 1908 |
+
Geelong_Football_Club
|
| 1909 |
+
Geir_Moen
|
| 1910 |
+
General_Administration_of_Customs
|
| 1911 |
+
General_Confederation_of_Labour_(France)
|
| 1912 |
+
General_Motors
|
| 1913 |
+
Geneva
|
| 1914 |
+
Genoa
|
| 1915 |
+
Genoa_C.F.C.
|
| 1916 |
+
Gente_(magazine)
|
| 1917 |
+
Geoff_Aunger
|
| 1918 |
+
Geoff_Marsh
|
| 1919 |
+
Geoffrey_Claeys
|
| 1920 |
+
Geoffrey_Fieger
|
| 1921 |
+
George_Duffield
|
| 1922 |
+
George_H._W._Bush
|
| 1923 |
+
George_Hincapie
|
| 1924 |
+
George_Joulwan
|
| 1925 |
+
George_Weah
|
| 1926 |
+
Georges_Simenon
|
| 1927 |
+
Georgia_(U.S._state)
|
| 1928 |
+
Georgia_(country)
|
| 1929 |
+
Georgios_Panagiotopoulos
|
| 1930 |
+
Georgiy_Mammadov
|
| 1931 |
+
Gerard_van_Velde
|
| 1932 |
+
Gerhard_Berger
|
| 1933 |
+
German_Open_(golf)
|
| 1934 |
+
German_Shepherd_Dog
|
| 1935 |
+
German_language
|
| 1936 |
+
Germans
|
| 1937 |
+
Germany
|
| 1938 |
+
Germany_Davis_Cup_team
|
| 1939 |
+
Germany_Fed_Cup_team
|
| 1940 |
+
Germany_men's_national_ice_hockey_team
|
| 1941 |
+
Germany_national_football_team
|
| 1942 |
+
Germán_Villa
|
| 1943 |
+
Geronimo
|
| 1944 |
+
Gerry_Britton
|
| 1945 |
+
Gert_Verheyen
|
| 1946 |
+
Gete_Wami
|
| 1947 |
+
Ghana
|
| 1948 |
+
Gheorghe_Craioveanu
|
| 1949 |
+
Gheorghe_Funar
|
| 1950 |
+
Gheorghe_Hagi
|
| 1951 |
+
Gheorghe_Popescu
|
| 1952 |
+
Gianfranco_Fini
|
| 1953 |
+
Gianfranco_Zola
|
| 1954 |
+
Gianluca_Pozzi
|
| 1955 |
+
Gianluca_Vialli
|
| 1956 |
+
Gianluigi_Lentini
|
| 1957 |
+
Gianni_Bugno
|
| 1958 |
+
Gianni_Versace
|
| 1959 |
+
Gigi_Fernández
|
| 1960 |
+
Gil_Vicente_F.C.
|
| 1961 |
+
Gil_de_Ferran
|
| 1962 |
+
Gilbert_Agius
|
| 1963 |
+
Gilbert_Gress
|
| 1964 |
+
Gilbert_Schaller
|
| 1965 |
+
Gilles_De_Bilde
|
| 1966 |
+
Gillian_Russell
|
| 1967 |
+
Gillingham_F.C.
|
| 1968 |
+
Giovanni_Lavaggi
|
| 1969 |
+
Giovanni_Lombardi
|
| 1970 |
+
Giovanni_Silva_de_Oliveira
|
| 1971 |
+
Giovanni_van_Bronckhorst
|
| 1972 |
+
Gisenyi
|
| 1973 |
+
Giuseppe_Garibaldi
|
| 1974 |
+
Gjon_Buzuku
|
| 1975 |
+
Glamorgan_County_Cricket_Club
|
| 1976 |
+
Glasgow
|
| 1977 |
+
Glen_Osborne
|
| 1978 |
+
Glenallen_Hill
|
| 1979 |
+
Glenavon_F.C.
|
| 1980 |
+
Glenn_Hoddle
|
| 1981 |
+
Glenn_McGrath
|
| 1982 |
+
Glentoran_F.C.
|
| 1983 |
+
Gloria_Pizzichini
|
| 1984 |
+
Gloucester_Rugby
|
| 1985 |
+
Gloucestershire_County_Cricket_Club
|
| 1986 |
+
God
|
| 1987 |
+
Goiás_Esporte_Clube
|
| 1988 |
+
Golan_Heights
|
| 1989 |
+
Gold_Coast_Chargers
|
| 1990 |
+
Gold_Coast_Titans
|
| 1991 |
+
Golden_State_Warriors
|
| 1992 |
+
Goldman_Sachs
|
| 1993 |
+
Goma
|
| 1994 |
+
Gong_Zhichao
|
| 1995 |
+
Goran_Ivanišević
|
| 1996 |
+
Gordon_Durie
|
| 1997 |
+
Gordon_Parsons
|
| 1998 |
+
Gorgona,_Colombia
|
| 1999 |
+
Gorleben
|
| 2000 |
+
Gouda
|
| 2001 |
+
Government_of_Russia
|
| 2002 |
+
Governor_of_South_Carolina
|
| 2003 |
+
Grace_Kelly
|
| 2004 |
+
Grace_Road
|
| 2005 |
+
Graeme_Hick
|
| 2006 |
+
Graeme_Obree
|
| 2007 |
+
Graham_Gooch
|
| 2008 |
+
Graham_Lloyd
|
| 2009 |
+
Graham_Thorpe
|
| 2010 |
+
Grand_Rapids,_Michigan
|
| 2011 |
+
Grand_Slam_(tennis)
|
| 2012 |
+
Grand_Slam_Cup
|
| 2013 |
+
Grande_Prairie
|
| 2014 |
+
Granma_(newspaper)
|
| 2015 |
+
Grant_Flower
|
| 2016 |
+
Grant_Stafford
|
| 2017 |
+
Grasshopper_Club_Zürich
|
| 2018 |
+
Grazer_AK
|
| 2019 |
+
Great_Britain_national_rugby_league_team
|
| 2020 |
+
Great_Hall_of_the_People
|
| 2021 |
+
Great_Lakes
|
| 2022 |
+
Greece
|
| 2023 |
+
Green_Bay_Packers
|
| 2024 |
+
Greenock_Morton_F.C.
|
| 2025 |
+
Greenville_Braves
|
| 2026 |
+
Greenwich_Mean_Time
|
| 2027 |
+
Greg_Blewett
|
| 2028 |
+
Greg_Chalmers
|
| 2029 |
+
Greg_Chappell
|
| 2030 |
+
Greg_Gagne_(baseball)
|
| 2031 |
+
Greg_Kraft
|
| 2032 |
+
Greg_Norman
|
| 2033 |
+
Greg_Rusedski
|
| 2034 |
+
Greg_Turner
|
| 2035 |
+
Gregor_Townsend
|
| 2036 |
+
Grimsby_Town_F.C.
|
| 2037 |
+
Griqualand_West
|
| 2038 |
+
Groningen_(city)
|
| 2039 |
+
Grozny
|
| 2040 |
+
Grupo_Santander
|
| 2041 |
+
Grupos_Antiterroristas_de_Liberación
|
| 2042 |
+
Grégory_Carraz
|
| 2043 |
+
Grêmio_Foot-Ball_Porto_Alegrense
|
| 2044 |
+
Guangdong
|
| 2045 |
+
Guangxi
|
| 2046 |
+
Guangzhou
|
| 2047 |
+
Guarani_Futebol_Clube
|
| 2048 |
+
Guardians_of_the_Cedars
|
| 2049 |
+
Guatemala
|
| 2050 |
+
Guernsey
|
| 2051 |
+
Guerrero
|
| 2052 |
+
Guido_Acklin
|
| 2053 |
+
Guido_Fulst
|
| 2054 |
+
Guilin
|
| 2055 |
+
Guillaume_Raoux
|
| 2056 |
+
Guillermo_Amor
|
| 2057 |
+
Guinea_national_football_team
|
| 2058 |
+
Gujar_Khan
|
| 2059 |
+
Gujarat
|
| 2060 |
+
Gulbuddin_Hekmatyar
|
| 2061 |
+
Gulf_War
|
| 2062 |
+
Gulf_of_Mexico
|
| 2063 |
+
Gunhild_Haugen
|
| 2064 |
+
Gunn_Margit_Andreassen
|
| 2065 |
+
Gunther_Schepens
|
| 2066 |
+
Guus_Hiddink
|
| 2067 |
+
Guy_Forget
|
| 2068 |
+
Guy_Hellers
|
| 2069 |
+
Guy_Whittall
|
| 2070 |
+
Guy_Whittingham
|
| 2071 |
+
Gwen_Torrence
|
| 2072 |
+
Győri_ETO_FC
|
| 2073 |
+
Gérard_de_Nooijer
|
| 2074 |
+
Górnik_Zabrze
|
| 2075 |
+
Günther_Huber
|
| 2076 |
+
H._D._Deve_Gowda
|
| 2077 |
+
HALO_Trust
|
| 2078 |
+
HINA
|
| 2079 |
+
HP_Enterprise_Services
|
| 2080 |
+
Haaretz
|
| 2081 |
+
Haarlem
|
| 2082 |
+
Habib_Boularès
|
| 2083 |
+
Hachette_Filipacchi_Médias
|
| 2084 |
+
Hafez_al-Assad
|
| 2085 |
+
Haile_Gebrselassie
|
| 2086 |
+
Hainan
|
| 2087 |
+
Haiti
|
| 2088 |
+
Hakan_Ünsal
|
| 2089 |
+
Hakan_Şükür
|
| 2090 |
+
Hakkâri
|
| 2091 |
+
Hakkâri_Province
|
| 2092 |
+
Hal_Morris
|
| 2093 |
+
Hal_Sutton
|
| 2094 |
+
Halifax_RLFC
|
| 2095 |
+
Hamas
|
| 2096 |
+
Hambrecht_&_Quist
|
| 2097 |
+
Hamburg
|
| 2098 |
+
Hamburg_Airport
|
| 2099 |
+
Hamburger_SV
|
| 2100 |
+
Hamid_Algabid
|
| 2101 |
+
Hamilton,_New_Zealand
|
| 2102 |
+
Hamilton_Academical_F.C.
|
| 2103 |
+
Hammerson
|
| 2104 |
+
Hampshire
|
| 2105 |
+
Hampshire_County_Cricket_Club
|
| 2106 |
+
Haneda_Airport
|
| 2107 |
+
Hang_Seng_Index
|
| 2108 |
+
Hangzhou
|
| 2109 |
+
Hanne_Haugland
|
| 2110 |
+
Hannes_Strydom
|
| 2111 |
+
Hanover
|
| 2112 |
+
Hans_Segers
|
| 2113 |
+
Hansie_Cronje
|
| 2114 |
+
Hanson_plc
|
| 2115 |
+
Hanwha_Eagles
|
| 2116 |
+
Hapoel_Be'er_Sheva_A.F.C.
|
| 2117 |
+
Hapoel_Haifa_F.C.
|
| 2118 |
+
Hapoel_Ironi_Rishon_LeZion_F.C.
|
| 2119 |
+
Hapoel_Jerusalem_F.C.
|
| 2120 |
+
Hapoel_Petah_Tikva_F.C.
|
| 2121 |
+
Hapoel_Tayibe_F.C.
|
| 2122 |
+
Hapoel_Tel_Aviv_F.C.
|
| 2123 |
+
Hapoel_Tzafririm_Holon_F.C.
|
| 2124 |
+
Harald_Spörl
|
| 2125 |
+
Harare
|
| 2126 |
+
Harlequin_F.C.
|
| 2127 |
+
Harlequins_Rugby_League
|
| 2128 |
+
Harleysville,_Pennsylvania
|
| 2129 |
+
Harold_Baines
|
| 2130 |
+
HarperCollins
|
| 2131 |
+
Harrison_Dillard
|
| 2132 |
+
Harry_Boland
|
| 2133 |
+
Harry_Decheiver
|
| 2134 |
+
Hartford,_Connecticut
|
| 2135 |
+
Hartford_Whalers
|
| 2136 |
+
Hartford_Wolf_Pack
|
| 2137 |
+
Hartlepool_United_F.C.
|
| 2138 |
+
Haruchika_Aoki
|
| 2139 |
+
Hasan_Muratović
|
| 2140 |
+
Hasely_Crawford
|
| 2141 |
+
Hassan_Abbas
|
| 2142 |
+
Hassan_II_of_Morocco
|
| 2143 |
+
Hassan_al-Turabi
|
| 2144 |
+
Hassania_Agadir
|
| 2145 |
+
Hastings_Banda
|
| 2146 |
+
Havana
|
| 2147 |
+
Havnar_Bóltfelag
|
| 2148 |
+
Havre,_Montana
|
| 2149 |
+
Hawaii
|
| 2150 |
+
Hawick_RFC
|
| 2151 |
+
Hawthorn_Football_Club
|
| 2152 |
+
Hay_Point,_Queensland
|
| 2153 |
+
Headingley
|
| 2154 |
+
Headingley_Stadium
|
| 2155 |
+
Heart_of_Midlothian_F.C.
|
| 2156 |
+
Heath_Streak
|
| 2157 |
+
Heathrow,_London
|
| 2158 |
+
Hebrew_University_of_Jerusalem
|
| 2159 |
+
Hebrew_language
|
| 2160 |
+
Hebron
|
| 2161 |
+
Hednesford_Town_F.C.
|
| 2162 |
+
Heidi_Zurbriggen
|
| 2163 |
+
Heidrun_oil_field
|
| 2164 |
+
Heike_Drechsler
|
| 2165 |
+
Heineken_International
|
| 2166 |
+
Heineken_Pilsener
|
| 2167 |
+
Heinz-Harald_Frentzen
|
| 2168 |
+
Helen_Clark
|
| 2169 |
+
Helena_Suková
|
| 2170 |
+
Heli_Rantanen
|
| 2171 |
+
Helibor
|
| 2172 |
+
Hellas_Verona_F.C.
|
| 2173 |
+
Helmut_Kohl
|
| 2174 |
+
Helsinki
|
| 2175 |
+
Hendrik_Dreekmann
|
| 2176 |
+
Hendro_Kartiko
|
| 2177 |
+
Hengelo
|
| 2178 |
+
Henri_Konan_Bédié
|
| 2179 |
+
Henrik_Larsson
|
| 2180 |
+
Henry_Campbell-Bannerman
|
| 2181 |
+
Henry_Honiball
|
| 2182 |
+
Henry_Hub
|
| 2183 |
+
Henry_VIII_of_England
|
| 2184 |
+
Herbert_Prohaska
|
| 2185 |
+
Herculez_Gomez
|
| 2186 |
+
Hereford_United_F.C.
|
| 2187 |
+
Herfried_Sabitzer
|
| 2188 |
+
Herman_Wijffels
|
| 2189 |
+
Hermann_Göring
|
| 2190 |
+
Hermawan_Susanto
|
| 2191 |
+
Hernán_Gumy
|
| 2192 |
+
Herschelle_Gibbs
|
| 2193 |
+
Hervé_de_Charette
|
| 2194 |
+
Hezbi_Islami
|
| 2195 |
+
Hezbollah
|
| 2196 |
+
Hibernian_F.C.
|
| 2197 |
+
Hicham_Arazi
|
| 2198 |
+
Hicham_El_Guerrouj
|
| 2199 |
+
Hidemichi_Tanaka
|
| 2200 |
+
Hideo_Nomo
|
| 2201 |
+
High_Court_(Hong_Kong)
|
| 2202 |
+
High_Plains_(United_States)
|
| 2203 |
+
Hilary_Lindh
|
| 2204 |
+
Hilde_Gerg
|
| 2205 |
+
Hilde_Synnøve_Lid
|
| 2206 |
+
Hillary_Rodham_Clinton
|
| 2207 |
+
Himalaya_Kingdom
|
| 2208 |
+
Himalayas
|
| 2209 |
+
Hindu_nationalism
|
| 2210 |
+
Hintsa_kaKhawuta
|
| 2211 |
+
Hiroaki_Morishima
|
| 2212 |
+
Hiroshi_Nanami
|
| 2213 |
+
Hiroshige_Yanagimoto
|
| 2214 |
+
Hobart
|
| 2215 |
+
Holding_company
|
| 2216 |
+
Hollywood
|
| 2217 |
+
Holy_See
|
| 2218 |
+
Holzgerlingen
|
| 2219 |
+
Honda
|
| 2220 |
+
Honda_Racing_Corporation
|
| 2221 |
+
Honduras
|
| 2222 |
+
Honduras_national_football_team
|
| 2223 |
+
Hong_Kong
|
| 2224 |
+
Hong_Kong_Economic_Times
|
| 2225 |
+
Hong_Kong_dollar
|
| 2226 |
+
Horst_Siegl
|
| 2227 |
+
Hosni_Mubarak
|
| 2228 |
+
House_of_Commons
|
| 2229 |
+
House_of_Orléans
|
| 2230 |
+
House_of_Representatives
|
| 2231 |
+
Houston
|
| 2232 |
+
Houston_Astros
|
| 2233 |
+
Houston_Cougars_football
|
| 2234 |
+
Houston_Rockets
|
| 2235 |
+
Houston_Texans
|
| 2236 |
+
Hove
|
| 2237 |
+
Howard_Wilkinson
|
| 2238 |
+
Howard_Wolpe
|
| 2239 |
+
Hristo_Stoichkov
|
| 2240 |
+
Hubei
|
| 2241 |
+
Hubert_Schösser
|
| 2242 |
+
Huddersfield_Town_F.C.
|
| 2243 |
+
Hugh_Baiocchi
|
| 2244 |
+
Huize_County
|
| 2245 |
+
Hull_City_A.F.C.
|
| 2246 |
+
Human_Rights_in_China_(organization)
|
| 2247 |
+
Humayun_Rashid_Choudhury
|
| 2248 |
+
Hun_Sen
|
| 2249 |
+
Hungarian_National_Bank
|
| 2250 |
+
Hungary
|
| 2251 |
+
Huntington,_West_Virginia
|
| 2252 |
+
Huntly_F.C.
|
| 2253 |
+
Hurricane_Edouard_(1996)
|
| 2254 |
+
Husaberg
|
| 2255 |
+
Husqvarna_Motorcycles
|
| 2256 |
+
Hussein_of_Jordan
|
| 2257 |
+
Hutnik_Kraków
|
| 2258 |
+
Hutu
|
| 2259 |
+
Hwang_Sun-Hong
|
| 2260 |
+
Hyderabad,_Sindh
|
| 2261 |
+
HypoVereinsbank
|
| 2262 |
+
Héctor_Camacho
|
| 2263 |
+
Hélder_Cristóvão
|
| 2264 |
+
Hércules_CF
|
| 2265 |
+
IBM
|
| 2266 |
+
IFK_Göteborg
|
| 2267 |
+
IFOR
|
| 2268 |
+
IK_Start
|
| 2269 |
+
ING_Group
|
| 2270 |
+
ISO_9000
|
| 2271 |
+
Iain_Pyman
|
| 2272 |
+
Ian_Botham
|
| 2273 |
+
Ian_Ferguson_(footballer_born_1967)
|
| 2274 |
+
Ian_Harte
|
| 2275 |
+
Ian_Harvey
|
| 2276 |
+
Ian_Healy
|
| 2277 |
+
Ian_Jones_(rugby_union)
|
| 2278 |
+
Ian_Lang,_Baron_Lang_of_Monkton
|
| 2279 |
+
Ian_McGeechan
|
| 2280 |
+
Ian_Rush
|
| 2281 |
+
Ian_Salisbury
|
| 2282 |
+
Ian_Woosnam
|
| 2283 |
+
Ian_Wright
|
| 2284 |
+
Iberian_Peninsula
|
| 2285 |
+
Ice-Cold_in_Alex
|
| 2286 |
+
Iceland
|
| 2287 |
+
Idris_I_of_Libya
|
| 2288 |
+
Idriss_Déby
|
| 2289 |
+
Ieng_Mouly
|
| 2290 |
+
Ieng_Sary
|
| 2291 |
+
Igor_Ivanov
|
| 2292 |
+
Igor_Kolyvanov
|
| 2293 |
+
Igor_Korneev
|
| 2294 |
+
Igor_Potapovich
|
| 2295 |
+
Igor_Shkvyrin
|
| 2296 |
+
Igor_Trandenkov
|
| 2297 |
+
Ijaz_Ahmed_(cricketer)
|
| 2298 |
+
Ilir_Shulku
|
| 2299 |
+
Ilke_Wyludda
|
| 2300 |
+
Illawarra_Steelers
|
| 2301 |
+
Illinois
|
| 2302 |
+
Iltalehti
|
| 2303 |
+
Imam_Utomo
|
| 2304 |
+
Imola
|
| 2305 |
+
Imran_Khan
|
| 2306 |
+
In-Nazzjon
|
| 2307 |
+
Ina-Yoko_Teutenberg
|
| 2308 |
+
Incheon
|
| 2309 |
+
Independence_Day_(film)
|
| 2310 |
+
Independent_Commission_Against_Corruption_(Hong_Kong)
|
| 2311 |
+
Independent_State_of_Croatia
|
| 2312 |
+
Inder_Kumar_Gujral
|
| 2313 |
+
India
|
| 2314 |
+
India_national_cricket_team
|
| 2315 |
+
Indian_Oil_Corporation
|
| 2316 |
+
Indiana
|
| 2317 |
+
Indiana_Pacers
|
| 2318 |
+
Indianapolis
|
| 2319 |
+
Indianapolis_Colts
|
| 2320 |
+
Indigenous_peoples_of_the_Americas
|
| 2321 |
+
Indonesia
|
| 2322 |
+
Indonesia_national_football_team
|
| 2323 |
+
Indonesian_Democratic_Party
|
| 2324 |
+
Indore
|
| 2325 |
+
Indrajit_Gupta
|
| 2326 |
+
Indre
|
| 2327 |
+
Industrial_Production_Index
|
| 2328 |
+
IndyCar_Series
|
| 2329 |
+
Inez_Turner
|
| 2330 |
+
Information_Technology_Association_of_America
|
| 2331 |
+
Information_Telegraph_Agency_of_Russia
|
| 2332 |
+
Inger_Miller
|
| 2333 |
+
Ingolstadt
|
| 2334 |
+
Inha_Babakova
|
| 2335 |
+
Inia,_Paphos
|
| 2336 |
+
Inkatha_Freedom_Party
|
| 2337 |
+
Insein_Prison
|
| 2338 |
+
Insein_Township
|
| 2339 |
+
Institute_for_Supply_Management
|
| 2340 |
+
Institute_of_Policy_Studies_(Singapore)
|
| 2341 |
+
Intellectual_Property_Owners_Association
|
| 2342 |
+
Intelligent_network
|
| 2343 |
+
Interfax
|
| 2344 |
+
Interferon_beta-1b
|
| 2345 |
+
Interior_ministry
|
| 2346 |
+
International_Association_of_Athletics_Federations
|
| 2347 |
+
International_Boxing_Association
|
| 2348 |
+
International_Committee_of_the_Red_Cross
|
| 2349 |
+
International_Confederation_of_Free_Trade_Unions
|
| 2350 |
+
International_Labour_Organization
|
| 2351 |
+
International_Monetary_Fund
|
| 2352 |
+
International_Petroleum_Exchange
|
| 2353 |
+
International_Union_of_Railways
|
| 2354 |
+
International_cricketers_of_South_African_origin
|
| 2355 |
+
Interstate_5
|
| 2356 |
+
Interstate_80
|
| 2357 |
+
Interstate_95
|
| 2358 |
+
Inverness
|
| 2359 |
+
Inverness_Caledonian_Thistle_F.C.
|
| 2360 |
+
Inverness_Thistle_F.C.
|
| 2361 |
+
Inzamam-ul-Haq
|
| 2362 |
+
Inés_Gorrochategui
|
| 2363 |
+
Ion_Iliescu
|
| 2364 |
+
Ionel_Dănciulescu
|
| 2365 |
+
Ipsos
|
| 2366 |
+
Ipswich_Town_F.C.
|
| 2367 |
+
Iran
|
| 2368 |
+
Iranian_Kurdistan
|
| 2369 |
+
Iraq
|
| 2370 |
+
Iraqi_Kurdistan
|
| 2371 |
+
Iraqi_National_Congress
|
| 2372 |
+
Ireland
|
| 2373 |
+
Ireland_national_rugby_union_team
|
| 2374 |
+
Irina_Korzhanenko
|
| 2375 |
+
Irina_Privalova
|
| 2376 |
+
Irina_Spîrlea
|
| 2377 |
+
Irish_Independent
|
| 2378 |
+
Irish_Republican_Army
|
| 2379 |
+
Irvine,_California
|
| 2380 |
+
Iryna_Yatchenko
|
| 2381 |
+
Isaac_Viciosa
|
| 2382 |
+
Isel_López
|
| 2383 |
+
Islam
|
| 2384 |
+
Islamabad
|
| 2385 |
+
Islamic_Museum
|
| 2386 |
+
Islamic_Republic_News_Agency
|
| 2387 |
+
Islamic_Republic_of_Iran
|
| 2388 |
+
Islamic_Salvation_Front
|
| 2389 |
+
Islamism
|
| 2390 |
+
Island_Beach_State_Park
|
| 2391 |
+
Isolde_Kostner
|
| 2392 |
+
Israel
|
| 2393 |
+
Israel_national_football_team
|
| 2394 |
+
Israel_national_under-21_football_team
|
| 2395 |
+
Israeli_Labor_Party
|
| 2396 |
+
Israelis
|
| 2397 |
+
Istanbul
|
| 2398 |
+
Isthmus_of_Tehuantepec
|
| 2399 |
+
Italy
|
| 2400 |
+
Italy_national_football_team
|
| 2401 |
+
Italy_national_rugby_union_team
|
| 2402 |
+
Itamar_Rabinovich
|
| 2403 |
+
Iulian_Filipescu
|
| 2404 |
+
Iva_Majoli
|
| 2405 |
+
Ivan_Francescato
|
| 2406 |
+
Ivan_Lendl
|
| 2407 |
+
Iván_García
|
| 2408 |
+
Iván_Rodríguez
|
| 2409 |
+
Iván_Zamorano
|
| 2410 |
+
J._Russell_(Essex_cricketer)
|
| 2411 |
+
JCPenney_Classic
|
| 2412 |
+
JK_Tallinna_Sadam
|
| 2413 |
+
Jaap_Stam
|
| 2414 |
+
Jacek_Dembiński
|
| 2415 |
+
Jack_Charlton
|
| 2416 |
+
Jack_Kemp
|
| 2417 |
+
Jack_Kevorkian
|
| 2418 |
+
Jack_Pierce_(athlete)
|
| 2419 |
+
Jackie_McNamara
|
| 2420 |
+
Jackie_Stewart
|
| 2421 |
+
Jacksonville,_Florida
|
| 2422 |
+
Jacksonville_Jaguars
|
| 2423 |
+
Jacky_Martens
|
| 2424 |
+
Jacob_Brumfield
|
| 2425 |
+
Jacques_Chirac
|
| 2426 |
+
Jacques_Kallis
|
| 2427 |
+
Jacques_Toubon
|
| 2428 |
+
Jacques_Villeneuve
|
| 2429 |
+
Jacqui_Cooper
|
| 2430 |
+
Jaffna
|
| 2431 |
+
Jaime_Oncins
|
| 2432 |
+
Jakarta
|
| 2433 |
+
Jakob_Hlasek
|
| 2434 |
+
Jalal_Talabani
|
| 2435 |
+
Jalalabad
|
| 2436 |
+
Jamaat-e-Islami
|
| 2437 |
+
Jamaica
|
| 2438 |
+
James_Baker
|
| 2439 |
+
James_Baldwin_(baseball)
|
| 2440 |
+
James_Brady
|
| 2441 |
+
James_Dalton_(rugby_player)
|
| 2442 |
+
James_Debbah
|
| 2443 |
+
James_Heath_(Boxer)
|
| 2444 |
+
James_Love
|
| 2445 |
+
James_Van_Allen
|
| 2446 |
+
James_Weaver_(racing_driver)
|
| 2447 |
+
Jamie_Baulch
|
| 2448 |
+
Jamie_Moyer
|
| 2449 |
+
Jamie_Spence
|
| 2450 |
+
Jan_Bos
|
| 2451 |
+
Jan_Ove_Pedersen
|
| 2452 |
+
Jan_Siemerink
|
| 2453 |
+
Jan_van_Eijden
|
| 2454 |
+
Jana_Kandarr
|
| 2455 |
+
Jana_Novotná
|
| 2456 |
+
Janakantha
|
| 2457 |
+
Janet_Reno
|
| 2458 |
+
Janette_Husárová
|
| 2459 |
+
Janez_Drnovšek
|
| 2460 |
+
Jani_Soininen
|
| 2461 |
+
Janne_Ojanen
|
| 2462 |
+
Jans_Koerts
|
| 2463 |
+
Jansher_Khan
|
| 2464 |
+
Jaora
|
| 2465 |
+
Japan
|
| 2466 |
+
Japan_Fed_Cup_team
|
| 2467 |
+
Japan_national_football_team
|
| 2468 |
+
Japie_Mulder
|
| 2469 |
+
Jared_Palmer
|
| 2470 |
+
Jared_Tomich
|
| 2471 |
+
Jari_Litmanen
|
| 2472 |
+
Jarmo_Kytölehto
|
| 2473 |
+
Jason_Belser
|
| 2474 |
+
Jason_Dickson
|
| 2475 |
+
Jason_Gillespie
|
| 2476 |
+
Jason_Little_(rugby_union)
|
| 2477 |
+
Jason_McAteer
|
| 2478 |
+
Jason_Rouser
|
| 2479 |
+
Jason_Stoltenberg
|
| 2480 |
+
Jason_Weaver_(jockey)
|
| 2481 |
+
Java_(programming_language)
|
| 2482 |
+
Javagal_Srinath
|
| 2483 |
+
Javier_Clemente
|
| 2484 |
+
Javier_Frana
|
| 2485 |
+
Javier_Sánchez
|
| 2486 |
+
Jay_Buhner
|
| 2487 |
+
Jean-Denis_Délétraz
|
| 2488 |
+
Jean-Louis_Debré
|
| 2489 |
+
Jean-Luc_Brassard
|
| 2490 |
+
Jean-Marc_Gounon
|
| 2491 |
+
Jean-Michel_Bayle
|
| 2492 |
+
Jean-Paul_van_Gastel
|
| 2493 |
+
Jean-Philippe_Fleurian
|
| 2494 |
+
Jean-Pierre_Cyprien
|
| 2495 |
+
Jean_Alesi
|
| 2496 |
+
Jean_Carlo_Witte
|
| 2497 |
+
Jean_Galfione
|
| 2498 |
+
Jean_Van_de_Velde
|
| 2499 |
+
Jearl_Miles_Clark
|
| 2500 |
+
Jed-Forest_RFC
|
| 2501 |
+
Jeddah
|
| 2502 |
+
Jeff_Bagwell
|
| 2503 |
+
Jeff_Bean
|
| 2504 |
+
Jeff_Parrett
|
| 2505 |
+
Jeff_Russell
|
| 2506 |
+
Jeff_Tarango
|
| 2507 |
+
Jeff_Williams_(athlete)
|
| 2508 |
+
Jeff_Wilson_(sportsman)
|
| 2509 |
+
Jeffrey_Lurie
|
| 2510 |
+
Jennifer_Capriati
|
| 2511 |
+
Jennifer_Flavin
|
| 2512 |
+
Jens_Fiedler_(cyclist)
|
| 2513 |
+
Jens_Todt
|
| 2514 |
+
Jeremy_Guscott
|
| 2515 |
+
Jeremy_Wotherspoon
|
| 2516 |
+
Jeroen_Blijlevens
|
| 2517 |
+
Jerry_Kelly
|
| 2518 |
+
Jersey
|
| 2519 |
+
Jerusalem
|
| 2520 |
+
Jesper_Parnevik
|
| 2521 |
+
Jesper_Skibby
|
| 2522 |
+
Jesse_Owens
|
| 2523 |
+
Jesus
|
| 2524 |
+
Jesús_Arellano
|
| 2525 |
+
Jesús_Tavárez
|
| 2526 |
+
Jews
|
| 2527 |
+
Jiang_Zemin
|
| 2528 |
+
Jiangsu
|
| 2529 |
+
Jiangxi
|
| 2530 |
+
Jill_Craybas
|
| 2531 |
+
Jim_Bolger
|
| 2532 |
+
Jim_Courier
|
| 2533 |
+
Jim_Edmonds
|
| 2534 |
+
Jim_Furyk
|
| 2535 |
+
Jim_Grabb
|
| 2536 |
+
Jim_Harbaugh
|
| 2537 |
+
Jim_Hines
|
| 2538 |
+
Jim_Leyritz
|
| 2539 |
+
Jim_Payne_(golfer)
|
| 2540 |
+
Jim_Telfer
|
| 2541 |
+
Jim_Thome
|
| 2542 |
+
Jimi_Hendrix
|
| 2543 |
+
Jimmy_Adams
|
| 2544 |
+
Jimmy_Key
|
| 2545 |
+
Jimmy_Thomson_(footballer)
|
| 2546 |
+
Jimmy_Vasser
|
| 2547 |
+
Jimy_Szymanski
|
| 2548 |
+
Jiří_Dopita
|
| 2549 |
+
Jiří_Džmura
|
| 2550 |
+
Jiří_Novák
|
| 2551 |
+
Joakim_Haeggman
|
| 2552 |
+
Joakim_Persson
|
| 2553 |
+
Joan_Llaneras
|
| 2554 |
+
Joannette_Kruger
|
| 2555 |
+
Joaquín_del_Olmo
|
| 2556 |
+
Jocelyn_Gourvennec
|
| 2557 |
+
Jodie_Foster
|
| 2558 |
+
Jody_Reed
|
| 2559 |
+
Joe-Max_Moore
|
| 2560 |
+
Joe_Carter
|
| 2561 |
+
Joe_Kneipp
|
| 2562 |
+
Joe_Miller_(footballer)
|
| 2563 |
+
Joe_Roff
|
| 2564 |
+
Joel_Stransky
|
| 2565 |
+
Joey_Hamilton
|
| 2566 |
+
Johan_Capiot
|
| 2567 |
+
Johan_Museeuw
|
| 2568 |
+
Johan_de_Kock
|
| 2569 |
+
Johann_Sebastian_Bach
|
| 2570 |
+
Johannesburg
|
| 2571 |
+
John_Boles_(baseball)
|
| 2572 |
+
John_C._Kornblum
|
| 2573 |
+
John_Collins_(footballer)
|
| 2574 |
+
John_Cook_(golfer)
|
| 2575 |
+
John_Crawley
|
| 2576 |
+
John_Fashanu
|
| 2577 |
+
John_Hagelin
|
| 2578 |
+
John_Hart_(rugby_coach)
|
| 2579 |
+
John_Hartson
|
| 2580 |
+
John_Hinckley,_Jr.
|
| 2581 |
+
John_Howard
|
| 2582 |
+
John_J._Sheehan
|
| 2583 |
+
John_Jaha
|
| 2584 |
+
John_Kerry
|
| 2585 |
+
John_Kocinski
|
| 2586 |
+
John_Langmore
|
| 2587 |
+
John_Lewis_Partnership
|
| 2588 |
+
John_Major
|
| 2589 |
+
John_Mark_Inienger
|
| 2590 |
+
John_Marzano
|
| 2591 |
+
John_Mayock
|
| 2592 |
+
John_McNamara_(baseball)
|
| 2593 |
+
John_Michael_Gorst
|
| 2594 |
+
John_Newcombe
|
| 2595 |
+
John_Regis_(athlete)
|
| 2596 |
+
John_Robinson_(footballer)
|
| 2597 |
+
John_Smiley
|
| 2598 |
+
John_Smoltz
|
| 2599 |
+
John_Stephenson_(cricketer,_born_1965)
|
| 2600 |
+
John_Talen
|
| 2601 |
+
John_Toshack
|
| 2602 |
+
John_Veldman
|
| 2603 |
+
John_White_(squash_player)
|
| 2604 |
+
John_Winslow_Bissell
|
| 2605 |
+
John_Y._Simon
|
| 2606 |
+
Johnny_Bench
|
| 2607 |
+
Johnny_Damon
|
| 2608 |
+
Johnny_Herbert
|
| 2609 |
+
Johnny_Oates
|
| 2610 |
+
Johns_Hopkins_Hospital
|
| 2611 |
+
Johnson_Controls
|
| 2612 |
+
Johor_Bahru
|
| 2613 |
+
Jon_Dahl_Tomasson
|
| 2614 |
+
Jon_Drummond
|
| 2615 |
+
Jonah_Lomu
|
| 2616 |
+
Jonas_Björkman
|
| 2617 |
+
Jonas_Savimbi
|
| 2618 |
+
Jonathan_Akpoborie
|
| 2619 |
+
Jonathan_Bachini
|
| 2620 |
+
Jonathan_Edwards_(athlete)
|
| 2621 |
+
Jonathan_Lomas
|
| 2622 |
+
Jonathan_Stark
|
| 2623 |
+
Jonathon_Power
|
| 2624 |
+
Jonty_Rhodes
|
| 2625 |
+
Joost_van_der_Westhuizen
|
| 2626 |
+
Jordan
|
| 2627 |
+
Jordan_Grand_Prix
|
| 2628 |
+
Jordan_River
|
| 2629 |
+
Jordi_Burillo
|
| 2630 |
+
Jordi_Cruyff
|
| 2631 |
+
Jorge_Cadete
|
| 2632 |
+
Jorge_Costa
|
| 2633 |
+
Jos_Verstappen
|
| 2634 |
+
Josef_Zieleniec
|
| 2635 |
+
Joseph_Bernardin
|
| 2636 |
+
Joseph_Keter
|
| 2637 |
+
Joseph_Nanven_Garba
|
| 2638 |
+
Joseph_Stalin
|
| 2639 |
+
Josh_Kronfeld
|
| 2640 |
+
José_Antonio_Escuredo
|
| 2641 |
+
José_Cóceres
|
| 2642 |
+
José_Emilio_Amavisca
|
| 2643 |
+
José_Hernández_(baseball)
|
| 2644 |
+
José_Herrera_(1990s_outfielder)
|
| 2645 |
+
José_Luis_Caminero
|
| 2646 |
+
José_Luís_Vidigal
|
| 2647 |
+
José_Maria_Cañizares
|
| 2648 |
+
José_María_Aznar
|
| 2649 |
+
José_María_Olazábal
|
| 2650 |
+
José_Miguel_Insulza
|
| 2651 |
+
José_Offerman
|
| 2652 |
+
José_Parra_(baseball)
|
| 2653 |
+
José_Ramos-Horta
|
| 2654 |
+
José_Rivero
|
| 2655 |
+
José_Rosado
|
| 2656 |
+
José_Taira
|
| 2657 |
+
José_Valentín
|
| 2658 |
+
João_Domingos_Pinto
|
| 2659 |
+
João_Havelange
|
| 2660 |
+
João_Vieira_Pinto
|
| 2661 |
+
Joël_Smets
|
| 2662 |
+
Juan_Antonio_Pizzi
|
| 2663 |
+
Juan_Curuchet
|
| 2664 |
+
Juan_Esnáider
|
| 2665 |
+
Juan_González_(baseball)
|
| 2666 |
+
Juan_Guzmán_(baseball)
|
| 2667 |
+
Juan_Perón
|
| 2668 |
+
Juan_Roque
|
| 2669 |
+
Juan_Somavía
|
| 2670 |
+
Judith_Arndt
|
| 2671 |
+
Judith_Wiesner
|
| 2672 |
+
Juha_Kankkunen
|
| 2673 |
+
Juha_Ylönen
|
| 2674 |
+
Julen_Lopetegui
|
| 2675 |
+
Jules_Maigret
|
| 2676 |
+
Julia_Carling
|
| 2677 |
+
Julia_Roberts
|
| 2678 |
+
Juliana_of_the_Netherlands
|
| 2679 |
+
Juliet_Cuthbert
|
| 2680 |
+
Julio_Dely_Valdés
|
| 2681 |
+
Julius_Nyerere
|
| 2682 |
+
Julián_Tavárez
|
| 2683 |
+
Jumet
|
| 2684 |
+
Junior_Murray
|
| 2685 |
+
Justin_Hobday
|
| 2686 |
+
Justin_Leonard
|
| 2687 |
+
Justin_Marshall
|
| 2688 |
+
Justin_Thompson
|
| 2689 |
+
Justin_Vaughan
|
| 2690 |
+
Juventus_F.C.
|
| 2691 |
+
Jyrki_Lumme
|
| 2692 |
+
Jyväskylä
|
| 2693 |
+
Ján_Krošlák
|
| 2694 |
+
Jörg_Heinrich
|
| 2695 |
+
Jürgen_Klinsmann
|
| 2696 |
+
Jürgen_Kohler
|
| 2697 |
+
Jürgen_Schult
|
| 2698 |
+
K.A.A._Gent
|
| 2699 |
+
K.F.C._Lommel_S.K.
|
| 2700 |
+
K.R.C._Genk
|
| 2701 |
+
K.R.C._Zuid-West-Vlaanderen
|
| 2702 |
+
K.S.C._Lokeren_Oost-Vlaanderen
|
| 2703 |
+
K._Sint-Truidense_V.V.
|
| 2704 |
+
KBC_Bank
|
| 2705 |
+
KIL_Toppfotball
|
| 2706 |
+
KK_Cibona
|
| 2707 |
+
KK_Crvena_zvezda
|
| 2708 |
+
KK_Partizan
|
| 2709 |
+
KK_Split
|
| 2710 |
+
KSE_100_Index
|
| 2711 |
+
KTM
|
| 2712 |
+
KV_Mechelen
|
| 2713 |
+
Ka_Wah_Bank
|
| 2714 |
+
Kabul
|
| 2715 |
+
Kader_Ferhaoui
|
| 2716 |
+
Kamiel_Maase
|
| 2717 |
+
Kampala
|
| 2718 |
+
Kandahar
|
| 2719 |
+
Kanpur
|
| 2720 |
+
Kansai_International_Airport
|
| 2721 |
+
Kansas
|
| 2722 |
+
Kansas_City,_Missouri
|
| 2723 |
+
Kansas_City_Chiefs
|
| 2724 |
+
Kansas_City_Royals
|
| 2725 |
+
Kaohsiung
|
| 2726 |
+
Kaolack
|
| 2727 |
+
Kapil_Dev
|
| 2728 |
+
Karachi
|
| 2729 |
+
Karachi_Stock_Exchange
|
| 2730 |
+
Karen_National_Union
|
| 2731 |
+
Karen_people
|
| 2732 |
+
Karim_Alami
|
| 2733 |
+
Karin_Janke
|
| 2734 |
+
Karin_Kschwendt
|
| 2735 |
+
Karina_Habšudová
|
| 2736 |
+
Karl-Heinz_Riedle
|
| 2737 |
+
Karl_Inderfurth
|
| 2738 |
+
Karl_Marx
|
| 2739 |
+
Karlsruher_SC
|
| 2740 |
+
Karol_Kučera
|
| 2741 |
+
Karsten_Bäron
|
| 2742 |
+
Kashmir
|
| 2743 |
+
Kassala
|
| 2744 |
+
Kassala_(state)
|
| 2745 |
+
Katarína_Studeníková
|
| 2746 |
+
Kate_Michelman
|
| 2747 |
+
Kate_Pace
|
| 2748 |
+
Katharina_Gutensohn
|
| 2749 |
+
Kathmandu
|
| 2750 |
+
Kathy_Rinaldi
|
| 2751 |
+
Katja_Seizinger
|
| 2752 |
+
Kawasaki_Heavy_Industries
|
| 2753 |
+
Kawasaki_Motors_Racing
|
| 2754 |
+
Kazakhstan
|
| 2755 |
+
Kazanlak
|
| 2756 |
+
Kazuyoshi_Funaki
|
| 2757 |
+
Kazuyoshi_Miura
|
| 2758 |
+
Keane_(company)
|
| 2759 |
+
Kecskemét
|
| 2760 |
+
Kehl
|
| 2761 |
+
Keirin
|
| 2762 |
+
Keith_Fletcher
|
| 2763 |
+
Keith_Wright_(footballer)
|
| 2764 |
+
Kelli_Kuehne
|
| 2765 |
+
Ken_Caminiti
|
| 2766 |
+
Ken_Green_(golfer)
|
| 2767 |
+
Ken_Griffey,_Jr.
|
| 2768 |
+
Ken_Hill_(baseball)
|
| 2769 |
+
Ken_Saro-Wiwa
|
| 2770 |
+
Kengo_Wa_Dondo
|
| 2771 |
+
Kenichi_Shimokawa
|
| 2772 |
+
Kennedy_Ochieng
|
| 2773 |
+
Kennedy_family
|
| 2774 |
+
Kennet_Andersson
|
| 2775 |
+
Kenneth_Benjamin
|
| 2776 |
+
Kenneth_Carlsen
|
| 2777 |
+
Kenneth_Clarke
|
| 2778 |
+
Kenneth_Eriksson
|
| 2779 |
+
Kenny_Cunningham
|
| 2780 |
+
Kenny_Dalglish
|
| 2781 |
+
Kenny_Harrison
|
| 2782 |
+
Kenny_Lofton
|
| 2783 |
+
Kenny_Rogers_(baseball)
|
| 2784 |
+
Kent_County_Cricket_Club
|
| 2785 |
+
Kentucky
|
| 2786 |
+
Kenya
|
| 2787 |
+
Kenya_national_cricket_team
|
| 2788 |
+
Kenya_national_football_team
|
| 2789 |
+
Kerwin_Bell
|
| 2790 |
+
Kevin_Brown_(right-handed_pitcher)
|
| 2791 |
+
Kevin_Foster_(baseball)
|
| 2792 |
+
Kevin_Keegan
|
| 2793 |
+
Kevin_Kim
|
| 2794 |
+
Kevin_Mitchell_(baseball)
|
| 2795 |
+
Kevin_Seitzer
|
| 2796 |
+
Kevin_Tapani
|
| 2797 |
+
KeyBank
|
| 2798 |
+
Khaled_Al_Zaher
|
| 2799 |
+
Khaleda_Zia
|
| 2800 |
+
Khalid_Boulami
|
| 2801 |
+
Khandwa
|
| 2802 |
+
Khartoum
|
| 2803 |
+
Khasavyurt
|
| 2804 |
+
Khmer_people
|
| 2805 |
+
Kia_Motors
|
| 2806 |
+
Kid_Brands
|
| 2807 |
+
Kiev
|
| 2808 |
+
Kigali
|
| 2809 |
+
Kilmarnock_F.C.
|
| 2810 |
+
Kim_Graham
|
| 2811 |
+
Kim_Yoon-man
|
| 2812 |
+
Kim_Young-sam
|
| 2813 |
+
Kimberley,_Northern_Cape
|
| 2814 |
+
Kimberly_Po
|
| 2815 |
+
Kimiko_Date_Krumm
|
| 2816 |
+
KinderCare_Learning_Centers
|
| 2817 |
+
Kindu
|
| 2818 |
+
King_Baudouin_Stadium
|
| 2819 |
+
Kingdom_of_England
|
| 2820 |
+
Kingdome
|
| 2821 |
+
Kingston_Technology
|
| 2822 |
+
Kinshasa
|
| 2823 |
+
Kirkcaldy
|
| 2824 |
+
Kirkland,_Washington
|
| 2825 |
+
Kisangani
|
| 2826 |
+
Kitty_Kiernan
|
| 2827 |
+
Kivu
|
| 2828 |
+
Klas_Eriksson
|
| 2829 |
+
Klaus_Kinkel
|
| 2830 |
+
Kleiner_Perkins_Caufield_&_Byers
|
| 2831 |
+
Knowsley_Road
|
| 2832 |
+
Kobus_Wiese
|
| 2833 |
+
Kofi_Annan
|
| 2834 |
+
Koha_Jonë
|
| 2835 |
+
Kol_Yisrael
|
| 2836 |
+
Kolkata
|
| 2837 |
+
Komerční_banka
|
| 2838 |
+
Kompas
|
| 2839 |
+
Konstantinos_Mitsotakis
|
| 2840 |
+
Konstantinos_Stephanopoulos
|
| 2841 |
+
Korea
|
| 2842 |
+
Korea_Republic_national_football_team
|
| 2843 |
+
Kosovo
|
| 2844 |
+
Kostas_Skandalidis
|
| 2845 |
+
Kragujevac
|
| 2846 |
+
Krasnoyarsk_Krai
|
| 2847 |
+
Krassimir_Balakov
|
| 2848 |
+
Kristian_Brenden
|
| 2849 |
+
Kristie_Boogert
|
| 2850 |
+
Kristina_Brandi
|
| 2851 |
+
Krzysztof_Piskuła
|
| 2852 |
+
Krzysztof_Warzycha
|
| 2853 |
+
Kuala_Lumpur
|
| 2854 |
+
Kubilay_Türkyilmaz
|
| 2855 |
+
Kumar_Dharmasena
|
| 2856 |
+
Kunar_River
|
| 2857 |
+
Kurdish_nationalism
|
| 2858 |
+
Kurdish_people
|
| 2859 |
+
Kurdistan
|
| 2860 |
+
Kurdistan_Democratic_Party
|
| 2861 |
+
Kurdistan_Workers'_Party
|
| 2862 |
+
Kurt_Abbott
|
| 2863 |
+
Kurt_Betschart
|
| 2864 |
+
Kurt_Schork
|
| 2865 |
+
Kuusamo
|
| 2866 |
+
Kuwait
|
| 2867 |
+
Kuwait_national_football_team
|
| 2868 |
+
KwaZulu-Natal
|
| 2869 |
+
Kyle_Abbott
|
| 2870 |
+
Kyran_Bracken
|
| 2871 |
+
Kyōko_Nagatsuka
|
| 2872 |
+
L-Orizzont
|
| 2873 |
+
LASK_Linz
|
| 2874 |
+
LG_Telecom
|
| 2875 |
+
LPGA_Championship
|
| 2876 |
+
LaMont_Smith
|
| 2877 |
+
La_Gazzetta_dello_Sport
|
| 2878 |
+
La_Jornada
|
| 2879 |
+
La_Nación
|
| 2880 |
+
La_Plagne
|
| 2881 |
+
La_Presse_(French_newspaper)
|
| 2882 |
+
La_Stampa
|
| 2883 |
+
La_création_du_monde
|
| 2884 |
+
Laban_Rotich
|
| 2885 |
+
Labor_Day
|
| 2886 |
+
Labour_Day
|
| 2887 |
+
Labour_Party_(Malta)
|
| 2888 |
+
Labour_Party_(UK)
|
| 2889 |
+
Lagos
|
| 2890 |
+
Lahore
|
| 2891 |
+
Lake_Maracaibo
|
| 2892 |
+
Lamberto_Dini
|
| 2893 |
+
Lamonts
|
| 2894 |
+
Lanarkshire
|
| 2895 |
+
Lancashire_County_Cricket_Club
|
| 2896 |
+
Lance_Armstrong
|
| 2897 |
+
Lance_Gibbs
|
| 2898 |
+
Land_Securities
|
| 2899 |
+
Landgraaf
|
| 2900 |
+
Landskrona
|
| 2901 |
+
Lansana_Conté
|
| 2902 |
+
Lantau_Peak
|
| 2903 |
+
Larisa_Neiland
|
| 2904 |
+
Larnaca
|
| 2905 |
+
Larry_Walker
|
| 2906 |
+
Lars_Bohinen
|
| 2907 |
+
Lars_Riedel
|
| 2908 |
+
Las_Cruces,_New_Mexico
|
| 2909 |
+
Las_Vegas,_Nevada
|
| 2910 |
+
Latin_America
|
| 2911 |
+
Latvia
|
| 2912 |
+
Latvia_national_football_team
|
| 2913 |
+
Laurence_Courtois
|
| 2914 |
+
Laurent-Désiré_Kabila
|
| 2915 |
+
Laurent_Blanc
|
| 2916 |
+
Laurent_Bénézech
|
| 2917 |
+
Laurent_Cabannes
|
| 2918 |
+
Laurent_Charvet
|
| 2919 |
+
Laurent_Gané
|
| 2920 |
+
Laurent_Jalabert
|
| 2921 |
+
Laurent_Ottoz
|
| 2922 |
+
Laurie_Brereton
|
| 2923 |
+
Laurie_Harper
|
| 2924 |
+
Lawrence_B._Lindsey
|
| 2925 |
+
Lawrence_of_Arabia_(film)
|
| 2926 |
+
Laxmi_Poruri
|
| 2927 |
+
Le_Canard_enchaîné
|
| 2928 |
+
Le_Figaro
|
| 2929 |
+
Le_Havre_AC
|
| 2930 |
+
Le_Jour
|
| 2931 |
+
Le_Matin_(France)
|
| 2932 |
+
Le_Monde
|
| 2933 |
+
Le_Temps
|
| 2934 |
+
League_of_Women_Voters
|
| 2935 |
+
Leah_Pells
|
| 2936 |
+
Leander_Paes
|
| 2937 |
+
Lebanon
|
| 2938 |
+
Lech_Poznań
|
| 2939 |
+
Lee's_Summit,_Missouri
|
| 2940 |
+
Lee_Bowyer
|
| 2941 |
+
Lee_Germon
|
| 2942 |
+
Lee_Sharpe
|
| 2943 |
+
Lee_Tinsley
|
| 2944 |
+
Lee_Wan_Wah
|
| 2945 |
+
Lee_Westwood
|
| 2946 |
+
Leeds
|
| 2947 |
+
Leeds_Rhinos
|
| 2948 |
+
Leeds_United_A.F.C.
|
| 2949 |
+
Lega_Nord
|
| 2950 |
+
Legal_Department
|
| 2951 |
+
Legia_Warszawa
|
| 2952 |
+
Lehman_Brothers
|
| 2953 |
+
Leicester
|
| 2954 |
+
Leicester_City_F.C.
|
| 2955 |
+
Leicester_Tigers
|
| 2956 |
+
Leicestershire_County_Cricket_Club
|
| 2957 |
+
Leipzig/Halle_Airport
|
| 2958 |
+
Lennart_Meri
|
| 2959 |
+
Lenzing_AG
|
| 2960 |
+
Leonid_Kuchma
|
| 2961 |
+
Leopold_III_of_Belgium
|
| 2962 |
+
Les_Ferdinand
|
| 2963 |
+
Les_Échos_(France)
|
| 2964 |
+
Letitia_Vriesde
|
| 2965 |
+
Levothyroxine
|
| 2966 |
+
Lewis_Gunn
|
| 2967 |
+
Leyton_Orient_F.C.
|
| 2968 |
+
Lhasa
|
| 2969 |
+
Li_Peng
|
| 2970 |
+
Liam_Botham
|
| 2971 |
+
Liam_Daish
|
| 2972 |
+
Liam_Fox
|
| 2973 |
+
Liam_Gallagher
|
| 2974 |
+
Liam_Neeson
|
| 2975 |
+
Liaoning
|
| 2976 |
+
Liberal_Democratic_Party_(Japan)
|
| 2977 |
+
Liberal_Party_(UK)
|
| 2978 |
+
Liberal_Party_of_Australia
|
| 2979 |
+
Liberation_Tigers_of_Tamil_Eelam
|
| 2980 |
+
Liberia
|
| 2981 |
+
Liberia_national_football_team
|
| 2982 |
+
Libya
|
| 2983 |
+
Lidl
|
| 2984 |
+
Liechtenstein
|
| 2985 |
+
Liechtenstein_national_football_team
|
| 2986 |
+
Lien_Chan
|
| 2987 |
+
Lierse_S.K.
|
| 2988 |
+
Lihir_Island
|
| 2989 |
+
Likud
|
| 2990 |
+
Lilian_Thuram
|
| 2991 |
+
Lille_OSC
|
| 2992 |
+
Lillehammer
|
| 2993 |
+
Lima
|
| 2994 |
+
Limerick
|
| 2995 |
+
Limited_company
|
| 2996 |
+
Lincoln,_Nebraska
|
| 2997 |
+
Lincoln_City_F.C.
|
| 2998 |
+
Linda_Kisabaka
|
| 2999 |
+
Linda_Wild
|
| 3000 |
+
Lindsay_Davenport
|
| 3001 |
+
Lindy_Remigino
|
| 3002 |
+
Linfield_F.C.
|
| 3003 |
+
Linford_Christie
|
| 3004 |
+
Linz
|
| 3005 |
+
Lisa_Raymond
|
| 3006 |
+
Lisbeth_Stuer-Lauridsen
|
| 3007 |
+
Lisbon
|
| 3008 |
+
Lithuania
|
| 3009 |
+
Lithuania_national_football_team
|
| 3010 |
+
Lithuania_national_under-21_football_team
|
| 3011 |
+
Little_Rock,_Arkansas
|
| 3012 |
+
Liverpool_F.C.
|
| 3013 |
+
Livingston_F.C.
|
| 3014 |
+
Liviu_Ciobotariu
|
| 3015 |
+
Lixion_Avila
|
| 3016 |
+
Liège
|
| 3017 |
+
Ljubljana
|
| 3018 |
+
Llanelli_RFC
|
| 3019 |
+
Lloyd_Axworthy
|
| 3020 |
+
Lloyd_Bentsen
|
| 3021 |
+
Lockerbie
|
| 3022 |
+
Loftus_Versfeld_Stadium
|
| 3023 |
+
Lombardi_Award
|
| 3024 |
+
Lomé
|
| 3025 |
+
London
|
| 3026 |
+
London_Heathrow_Airport
|
| 3027 |
+
London_Interbank_Offered_Rate
|
| 3028 |
+
London_Irish
|
| 3029 |
+
London_Metal_Exchange
|
| 3030 |
+
London_Stansted_Airport
|
| 3031 |
+
London_Stock_Exchange
|
| 3032 |
+
London_Wasps
|
| 3033 |
+
Long_Island
|
| 3034 |
+
Longchamp_Racecourse
|
| 3035 |
+
Longyearbyen
|
| 3036 |
+
Lonmin
|
| 3037 |
+
Loren_Roberts
|
| 3038 |
+
Lorenzo_Amoruso
|
| 3039 |
+
Lori_McNeil
|
| 3040 |
+
Los_Angeles
|
| 3041 |
+
Los_Angeles_Angels_of_Anaheim
|
| 3042 |
+
Los_Angeles_Clippers
|
| 3043 |
+
Los_Angeles_Dodgers
|
| 3044 |
+
Los_Angeles_Kings
|
| 3045 |
+
Los_Angeles_Lakers
|
| 3046 |
+
Lou_Gehrig
|
| 3047 |
+
Louis_Farrakhan
|
| 3048 |
+
Louis_Freeh
|
| 3049 |
+
Louise_Currey
|
| 3050 |
+
Loyola_de_Palacio
|
| 3051 |
+
Luanda
|
| 3052 |
+
Luc_Nilis
|
| 3053 |
+
Luca_Cadalora
|
| 3054 |
+
Lucas_Moreira_Neves
|
| 3055 |
+
Lucy_Tyler-Sharman
|
| 3056 |
+
Ludmila_Engquist
|
| 3057 |
+
Ludmila_Richterová
|
| 3058 |
+
Ludovic_Giuly
|
| 3059 |
+
Lufthansa
|
| 3060 |
+
Luis_Enrique_Martínez_García
|
| 3061 |
+
Luis_García_Postigo
|
| 3062 |
+
Luis_Milla
|
| 3063 |
+
Luis_Oliveira
|
| 3064 |
+
Luis_Polonia
|
| 3065 |
+
Luke_Jensen
|
| 3066 |
+
Luke_Kipkosgei
|
| 3067 |
+
Lukoil
|
| 3068 |
+
Lusaka_Protocol
|
| 3069 |
+
Luton_Town_F.C.
|
| 3070 |
+
Luxembourg
|
| 3071 |
+
Luxembourg_(city)
|
| 3072 |
+
Luís_Figo
|
| 3073 |
+
Lynda_Chalker,_Baroness_Chalker_of_Wallasey
|
| 3074 |
+
Lyngby_Boldklub
|
| 3075 |
+
M._Karunanidhi
|
| 3076 |
+
MBC_Dynamo_Moscow
|
| 3077 |
+
MCI_Communications
|
| 3078 |
+
MFK_Dubnica
|
| 3079 |
+
MFK_Košice
|
| 3080 |
+
MFK_Petržalka
|
| 3081 |
+
MMC_Norilsk_Nickel
|
| 3082 |
+
MSV_Duisburg
|
| 3083 |
+
MTK_Hungária_FC
|
| 3084 |
+
MYPA
|
| 3085 |
+
Maariv_(newspaper)
|
| 3086 |
+
Maarten_den_Bakker
|
| 3087 |
+
Maccabi_Haifa_F.C.
|
| 3088 |
+
Maccabi_Herzliya_F.C.
|
| 3089 |
+
Maccabi_Petah_Tikva_F.C.
|
| 3090 |
+
Maccabi_Tel_Aviv_B.C.
|
| 3091 |
+
Maccabi_Tel_Aviv_F.C.
|
| 3092 |
+
Macedonia_national_football_team
|
| 3093 |
+
Madagascar
|
| 3094 |
+
Madame_Bovary
|
| 3095 |
+
Madeleine_Albright
|
| 3096 |
+
Madhumalla
|
| 3097 |
+
Madrid
|
| 3098 |
+
Mae_Sot
|
| 3099 |
+
Mafikeng
|
| 3100 |
+
Magdalena_Grzybowska
|
| 3101 |
+
Magdalena_Maleeva
|
| 3102 |
+
Magna_International
|
| 3103 |
+
Magnus_Gustafsson
|
| 3104 |
+
Magnus_Larsson
|
| 3105 |
+
Mahala
|
| 3106 |
+
Mahmoud_Abbas
|
| 3107 |
+
Major_League_Baseball
|
| 3108 |
+
Major_League_Baseball_Most_Valuable_Player_Award
|
| 3109 |
+
Maksim_Tarasov
|
| 3110 |
+
Malawi
|
| 3111 |
+
Malawi_national_football_team
|
| 3112 |
+
Malaysia
|
| 3113 |
+
Malaysia_Open_(badminton)
|
| 3114 |
+
Malcolm_Marshall
|
| 3115 |
+
Malcolm_Rifkind
|
| 3116 |
+
Mali
|
| 3117 |
+
MaliVai_Washington
|
| 3118 |
+
Malta
|
| 3119 |
+
Malta_Freeport
|
| 3120 |
+
Malta_national_football_team
|
| 3121 |
+
Managua
|
| 3122 |
+
Manama
|
| 3123 |
+
Manchester
|
| 3124 |
+
Manchester_City_F.C.
|
| 3125 |
+
Manchester_United_F.C.
|
| 3126 |
+
Mandsaur
|
| 3127 |
+
Manfred_Kanther
|
| 3128 |
+
Manfred_Schwabl
|
| 3129 |
+
Mangosuthu_Buthelezi
|
| 3130 |
+
Manhattan
|
| 3131 |
+
Manhattan_Beach,_California
|
| 3132 |
+
Maniema
|
| 3133 |
+
Manly-Warringah_Sea_Eagles
|
| 3134 |
+
Mansfield_Town_F.C.
|
| 3135 |
+
Manuel_Medina_(boxer)
|
| 3136 |
+
Mao_Zedong
|
| 3137 |
+
Maputo
|
| 3138 |
+
Maracaibo
|
| 3139 |
+
Marc-Vivien_Foé
|
| 3140 |
+
Marc_Blume
|
| 3141 |
+
Marc_Degryse
|
| 3142 |
+
Marc_Dutroux
|
| 3143 |
+
Marc_Hottiger
|
| 3144 |
+
Marc_Keller
|
| 3145 |
+
Marc_Newfield
|
| 3146 |
+
Marc_Overmars
|
| 3147 |
+
Marc_Rosset
|
| 3148 |
+
Marc_Wilkins_(baseball)
|
| 3149 |
+
Marc_Wilmots
|
| 3150 |
+
Marcel_Desailly
|
| 3151 |
+
Marcello_Cuttitta
|
| 3152 |
+
Marcelo_Filippini
|
| 3153 |
+
Marcelo_Otero
|
| 3154 |
+
Marcelo_Ríos
|
| 3155 |
+
Marcelo_Salas
|
| 3156 |
+
Marcelo_Silva_Ramos
|
| 3157 |
+
Marcin_Mięciel
|
| 3158 |
+
Marco_Bode
|
| 3159 |
+
Marco_Delvecchio
|
| 3160 |
+
Marco_Lietti
|
| 3161 |
+
Marco_Pascolo
|
| 3162 |
+
Marco_Vaccari
|
| 3163 |
+
Marco_Villa
|
| 3164 |
+
Marcos_Ondruska
|
| 3165 |
+
Marcus_Gayle
|
| 3166 |
+
Marcus_Grönholm
|
| 3167 |
+
Marek_Citko
|
| 3168 |
+
Margaret_Crowley_(athlete)
|
| 3169 |
+
Margaret_Thatcher
|
| 3170 |
+
Maria_Mutola
|
| 3171 |
+
Mariaan_de_Swardt
|
| 3172 |
+
Marianne_Timmer
|
| 3173 |
+
Marianne_Werdel
|
| 3174 |
+
Mariano_Bombarda
|
| 3175 |
+
Mariano_Duncan
|
| 3176 |
+
Mariano_Juan
|
| 3177 |
+
Mariano_Rivera
|
| 3178 |
+
Maribor
|
| 3179 |
+
Marie-José_Pérec
|
| 3180 |
+
Marie_Lindgren
|
| 3181 |
+
Marina_Trandenkova
|
| 3182 |
+
Mario_Basler
|
| 3183 |
+
Mario_Silva
|
| 3184 |
+
Mario_Stanić
|
| 3185 |
+
Marion_Clignet
|
| 3186 |
+
Marius_Hurter
|
| 3187 |
+
Mark_Acre
|
| 3188 |
+
Mark_Andrews_(rugby_player)
|
| 3189 |
+
Mark_Brooks_(golfer)
|
| 3190 |
+
Mark_Butcher
|
| 3191 |
+
Mark_Cairns_(squash_player)
|
| 3192 |
+
Mark_Calcavecchia
|
| 3193 |
+
Mark_Chaloner
|
| 3194 |
+
Mark_Crear
|
| 3195 |
+
Mark_Davis_(golfer)
|
| 3196 |
+
Mark_Dekker
|
| 3197 |
+
Mark_Ealham
|
| 3198 |
+
Mark_Gleeson_(journalist)
|
| 3199 |
+
Mark_Hughes
|
| 3200 |
+
Mark_Hutton
|
| 3201 |
+
Mark_Ilott
|
| 3202 |
+
Mark_Kennedy_(footballer)
|
| 3203 |
+
Mark_Knowles
|
| 3204 |
+
Mark_Lawrence_Wolf
|
| 3205 |
+
Mark_McGwire
|
| 3206 |
+
Mark_McNulty
|
| 3207 |
+
Mark_Mouland
|
| 3208 |
+
Mark_Pembridge
|
| 3209 |
+
Mark_Petkovsek
|
| 3210 |
+
Mark_Philippoussis
|
| 3211 |
+
Mark_Prescott
|
| 3212 |
+
Mark_Richardson_(athlete)
|
| 3213 |
+
Mark_Roe
|
| 3214 |
+
Mark_Rutherford_(footballer)
|
| 3215 |
+
Mark_Spitz
|
| 3216 |
+
Mark_Taylor_(cricketer)
|
| 3217 |
+
Mark_Thompson_(baseball)
|
| 3218 |
+
Mark_Waugh
|
| 3219 |
+
Mark_Woodforde
|
| 3220 |
+
Markham,_Ontario
|
| 3221 |
+
Marko_Koers
|
| 3222 |
+
Markus_Babbel
|
| 3223 |
+
Markus_Feldhoff
|
| 3224 |
+
Markus_Schopp
|
| 3225 |
+
Marlene_Thomsen
|
| 3226 |
+
Maronite_Church
|
| 3227 |
+
Marseille
|
| 3228 |
+
Marshall_Faulk
|
| 3229 |
+
Martela
|
| 3230 |
+
Martin_Brundle
|
| 3231 |
+
Martin_Damm
|
| 3232 |
+
Martin_Driller
|
| 3233 |
+
Martin_Heath
|
| 3234 |
+
Martin_Max
|
| 3235 |
+
Martin_McCague
|
| 3236 |
+
Martina_Ertl-Renz
|
| 3237 |
+
Martina_Hingis
|
| 3238 |
+
Marty_Cordova
|
| 3239 |
+
Marty_Nothstein
|
| 3240 |
+
Marubeni
|
| 3241 |
+
Marvin_Benard
|
| 3242 |
+
Marvin_Harrison
|
| 3243 |
+
Marxism
|
| 3244 |
+
Mary_Joe_Fernandez
|
| 3245 |
+
Mary_Onyali-Omagbemi
|
| 3246 |
+
Mary_Pierce
|
| 3247 |
+
Marylebone_Cricket_Club
|
| 3248 |
+
Masakiyo_Maezono
|
| 3249 |
+
Masami_Ihara
|
| 3250 |
+
Masayoshi_Takemura
|
| 3251 |
+
Masayuki_Okano
|
| 3252 |
+
Massachusetts
|
| 3253 |
+
Massimo_Cuttitta
|
| 3254 |
+
Massoud_Barzani
|
| 3255 |
+
Massoud_Rajavi
|
| 3256 |
+
Matagalpa
|
| 3257 |
+
Mate_Granić
|
| 3258 |
+
Mathias_Jack
|
| 3259 |
+
Mathias_Ntawulikura
|
| 3260 |
+
Mats_Lanner
|
| 3261 |
+
Mats_Wilander
|
| 3262 |
+
Matt_Burke
|
| 3263 |
+
Matt_Lawton
|
| 3264 |
+
Matt_Stairs
|
| 3265 |
+
Matthew_Le_Tissier
|
| 3266 |
+
Matthew_Maynard
|
| 3267 |
+
Matthew_Pinsent
|
| 3268 |
+
Matthew_Windows
|
| 3269 |
+
Matthias_Hagner
|
| 3270 |
+
Matthias_Sammer
|
| 3271 |
+
Matuzići
|
| 3272 |
+
Maurice_Baril
|
| 3273 |
+
Maurice_Graef
|
| 3274 |
+
Mauricio_Hadad
|
| 3275 |
+
Mauritania
|
| 3276 |
+
Mauritania_national_football_team
|
| 3277 |
+
Mauritius
|
| 3278 |
+
Mauritius_national_football_team
|
| 3279 |
+
Maurizio_Fondriest
|
| 3280 |
+
Mauro_Silva
|
| 3281 |
+
Maurício_Gugelmin
|
| 3282 |
+
Max_Delbrück
|
| 3283 |
+
Max_Sciandri
|
| 3284 |
+
Max_van_Heeswijk
|
| 3285 |
+
Małgorzata_Rydz
|
| 3286 |
+
McLaren
|
| 3287 |
+
Mecca
|
| 3288 |
+
Medellín
|
| 3289 |
+
Media_Indonesia
|
| 3290 |
+
Mediaset
|
| 3291 |
+
Medicare_(United_States)
|
| 3292 |
+
Mediterranean_Sea
|
| 3293 |
+
Megawati_Sukarnoputri
|
| 3294 |
+
Meghann_Shaughnessy
|
| 3295 |
+
Mehmet_Scholl
|
| 3296 |
+
Melbourne
|
| 3297 |
+
Melbourne_Cricket_Ground
|
| 3298 |
+
Melbourne_Football_Club
|
| 3299 |
+
Melrose_RFC
|
| 3300 |
+
Meluawati
|
| 3301 |
+
Melvin_Nieves
|
| 3302 |
+
Memphis_Grizzlies
|
| 3303 |
+
Menlo_Park,_California
|
| 3304 |
+
Mercedes-Benz
|
| 3305 |
+
Meredith_McGrath
|
| 3306 |
+
Merlene_Ottey
|
| 3307 |
+
Merrill_Lynch
|
| 3308 |
+
Metro_AG
|
| 3309 |
+
Metro_Manila
|
| 3310 |
+
Metropolitan_Fiber_Systems
|
| 3311 |
+
Metropolitan_Museum_of_Art
|
| 3312 |
+
Mette_Bergmann
|
| 3313 |
+
Mexican_Army
|
| 3314 |
+
Mexico
|
| 3315 |
+
Mexico_City
|
| 3316 |
+
Mexico_national_football_team
|
| 3317 |
+
Mhow
|
| 3318 |
+
Mia_Audina
|
| 3319 |
+
Miami
|
| 3320 |
+
Miami_Dolphins
|
| 3321 |
+
Miami_Heat
|
| 3322 |
+
Michael_Andersson
|
| 3323 |
+
Michael_Andretti
|
| 3324 |
+
Michael_Bevan
|
| 3325 |
+
Michael_Branch
|
| 3326 |
+
Michael_Campbell
|
| 3327 |
+
Michael_Chang
|
| 3328 |
+
Michael_Collins_(Irish_leader)
|
| 3329 |
+
Michael_Collins_(film)
|
| 3330 |
+
Michael_Di_Venuto
|
| 3331 |
+
Michael_Doohan
|
| 3332 |
+
Michael_Green_(sprinter)
|
| 3333 |
+
Michael_Heseltine
|
| 3334 |
+
Michael_Hübner
|
| 3335 |
+
Michael_J._Astrue
|
| 3336 |
+
Michael_Jeffrey
|
| 3337 |
+
Michael_Johnson_(athlete)
|
| 3338 |
+
Michael_Jones_(rugby_union)
|
| 3339 |
+
Michael_Jonzon
|
| 3340 |
+
Michael_Joyce_(tennis)
|
| 3341 |
+
Michael_Konsel
|
| 3342 |
+
Michael_Lynagh
|
| 3343 |
+
Michael_Marsh_(athlete)
|
| 3344 |
+
Michael_Möllenbeck
|
| 3345 |
+
Michael_Reiziger
|
| 3346 |
+
Michael_Schumacher
|
| 3347 |
+
Michael_Slater
|
| 3348 |
+
Michael_Stich
|
| 3349 |
+
Michael_Tebbutt
|
| 3350 |
+
Michael_Tucker_(baseball)
|
| 3351 |
+
Michael_Zorc
|
| 3352 |
+
Michaela_Dorfmeister
|
| 3353 |
+
Michel_Hansenne
|
| 3354 |
+
Michele_Bartoli
|
| 3355 |
+
Michelle_Freeman
|
| 3356 |
+
Michigan
|
| 3357 |
+
Michigan_City,_Indiana
|
| 3358 |
+
Michigan_National_Bank
|
| 3359 |
+
Michoacán
|
| 3360 |
+
Mick_McCarthy
|
| 3361 |
+
Mickey_Cochrane
|
| 3362 |
+
Mickey_Kantor
|
| 3363 |
+
Mickey_Rivers
|
| 3364 |
+
Microsoft
|
| 3365 |
+
Microsoft_Windows
|
| 3366 |
+
Middle_East
|
| 3367 |
+
Middle_East_Economic_Survey
|
| 3368 |
+
Middle_Kingdom_of_Egypt
|
| 3369 |
+
Middlesbrough_F.C.
|
| 3370 |
+
Middlesex_County_Cricket_Club
|
| 3371 |
+
Midwestern_United_States
|
| 3372 |
+
Miguel_Ángel_Jiménez
|
| 3373 |
+
Miguel_Ángel_Martín_(golfer)
|
| 3374 |
+
Miguel_Ángel_Nadal
|
| 3375 |
+
Mihai_Tararache
|
| 3376 |
+
Mika_Häkkinen
|
| 3377 |
+
Mika_Salo
|
| 3378 |
+
Mikael_Tillström
|
| 3379 |
+
Mike_Atherton
|
| 3380 |
+
Mike_Conley,_Sr.
|
| 3381 |
+
Mike_Devereaux
|
| 3382 |
+
Mike_Fetters
|
| 3383 |
+
Mike_Gatting
|
| 3384 |
+
Mike_Harwood
|
| 3385 |
+
Mike_Hulbert
|
| 3386 |
+
Mike_McCurry_(press_secretary)
|
| 3387 |
+
Mike_Mordecai
|
| 3388 |
+
Mike_Oquist
|
| 3389 |
+
Mike_Piazza
|
| 3390 |
+
Mike_Stanley
|
| 3391 |
+
Mike_Sullivan_(golfer)
|
| 3392 |
+
Mike_Tyson
|
| 3393 |
+
Mike_Watkinson
|
| 3394 |
+
Mike_Williams_(baseball)
|
| 3395 |
+
Mikhail_Gorbachev
|
| 3396 |
+
Mikhail_Kutuzov
|
| 3397 |
+
Mil_Mi-17
|
| 3398 |
+
Miladin_Bečanović
|
| 3399 |
+
Milan
|
| 3400 |
+
Milan_Kučan
|
| 3401 |
+
Miles_Tunnicliff
|
| 3402 |
+
Milinko_Pantić
|
| 3403 |
+
Million_Man_March
|
| 3404 |
+
Millwall_F.C.
|
| 3405 |
+
Miltiadis_Evert
|
| 3406 |
+
Milwaukee
|
| 3407 |
+
Milwaukee_Brewers
|
| 3408 |
+
Milwaukee_Bucks
|
| 3409 |
+
Minardi
|
| 3410 |
+
Mindanao
|
| 3411 |
+
Ming_Pao
|
| 3412 |
+
Minister_for_Foreign_Affairs_(Australia)
|
| 3413 |
+
Minister_of_the_Interior_(France)
|
| 3414 |
+
Ministry_of_Finance_(Chile)
|
| 3415 |
+
Ministry_of_Finance_(Japan)
|
| 3416 |
+
Ministry_of_Foreign_Affairs_(Israel)
|
| 3417 |
+
Ministry_of_Foreign_Affairs_(Poland)
|
| 3418 |
+
Ministry_of_Foreign_Affairs_(Turkey)
|
| 3419 |
+
Ministry_of_Foreign_Affairs_of_the_People's_Republic_of_China
|
| 3420 |
+
Minneapolis
|
| 3421 |
+
Minnesota
|
| 3422 |
+
Minnesota_Timberwolves
|
| 3423 |
+
Minnesota_Twins
|
| 3424 |
+
Minnesota_Vikings
|
| 3425 |
+
Minnetonka,_Minnesota
|
| 3426 |
+
Minsk
|
| 3427 |
+
Miriam_Oremans
|
| 3428 |
+
Miriam_Vogt
|
| 3429 |
+
Miron_Cozma
|
| 3430 |
+
Miroslav_Votava
|
| 3431 |
+
Miss_Universe
|
| 3432 |
+
Missionaries_of_Charity
|
| 3433 |
+
Mississippi_River
|
| 3434 |
+
Missouri
|
| 3435 |
+
Mitsubishi_Lancer
|
| 3436 |
+
Mitsubishi_Motors
|
| 3437 |
+
Mitsui
|
| 3438 |
+
Mladá_fronta_DNES
|
| 3439 |
+
Mo_Vaughn
|
| 3440 |
+
Mobil
|
| 3441 |
+
Mobutu_Sese_Seko
|
| 3442 |
+
Moengo
|
| 3443 |
+
Mohali
|
| 3444 |
+
Mohammad_Akram
|
| 3445 |
+
Mohammad_Azharuddin
|
| 3446 |
+
Moin_Khan
|
| 3447 |
+
Molde_FK
|
| 3448 |
+
Moldova
|
| 3449 |
+
Moldova_national_football_team
|
| 3450 |
+
Mona_Eltahawy
|
| 3451 |
+
Monaco
|
| 3452 |
+
Monarcas_Morelia
|
| 3453 |
+
Mongolia
|
| 3454 |
+
Monica_Seles
|
| 3455 |
+
Monrovia
|
| 3456 |
+
Mons_Ivar_Mjelde
|
| 3457 |
+
Mont-sur-Marchienne
|
| 3458 |
+
Montana
|
| 3459 |
+
Monte_Carlo
|
| 3460 |
+
Montenegrins
|
| 3461 |
+
Montenegro
|
| 3462 |
+
Monterey,_California
|
| 3463 |
+
Montgomery,_Alabama
|
| 3464 |
+
Montpelier,_Vermont
|
| 3465 |
+
Montpellier_HSC
|
| 3466 |
+
Montreal
|
| 3467 |
+
Montreal_Canadiens
|
| 3468 |
+
Montreal_Expos
|
| 3469 |
+
Montrose_F.C.
|
| 3470 |
+
Montserrat
|
| 3471 |
+
Morelia
|
| 3472 |
+
Morgan_Stanley
|
| 3473 |
+
Morinville,_Alberta
|
| 3474 |
+
Moro_National_Liberation_Front
|
| 3475 |
+
Morocco
|
| 3476 |
+
Moscow
|
| 3477 |
+
Moscow_Kremlin
|
| 3478 |
+
Mosenergo
|
| 3479 |
+
Moses_Kiptanui
|
| 3480 |
+
Moss_FK
|
| 3481 |
+
Moss_Landing_Marine_Laboratories
|
| 3482 |
+
Mostostal
|
| 3483 |
+
Mother_Teresa
|
| 3484 |
+
Motherwell_F.C.
|
| 3485 |
+
Motohiro_Yamaguchi
|
| 3486 |
+
Mountain_View,_California
|
| 3487 |
+
Moustapha_Niasse
|
| 3488 |
+
Movement_of_Socialist_Democrats
|
| 3489 |
+
Movladi_Udugov
|
| 3490 |
+
Mozambique
|
| 3491 |
+
Mozambique_national_football_team
|
| 3492 |
+
Mr._Clean
|
| 3493 |
+
Muammar_al-Gaddafi
|
| 3494 |
+
Muhammad
|
| 3495 |
+
Mumbai
|
| 3496 |
+
Munich
|
| 3497 |
+
Munich_Airport
|
| 3498 |
+
Munich_Re
|
| 3499 |
+
Murat_Yakin
|
| 3500 |
+
Murphy_Jensen
|
| 3501 |
+
Murrayfield_Stadium
|
| 3502 |
+
Mushtaq_Ahmed
|
| 3503 |
+
Muslim_Commercial_Bank
|
| 3504 |
+
Mustapha_Hadji
|
| 3505 |
+
Muttahida_Qaumi_Movement
|
| 3506 |
+
Muttiah_Muralitharan
|
| 3507 |
+
Muzaffarabad
|
| 3508 |
+
My_Turn_(memoir)
|
| 3509 |
+
Márcio_Roberto_dos_Santos
|
| 3510 |
+
Mário_Covas
|
| 3511 |
+
Mário_Jardel
|
| 3512 |
+
Médecins_Sans_Frontières
|
| 3513 |
+
MŠK_Rimavská_Sobota
|
| 3514 |
+
MŠK_Žilina
|
| 3515 |
+
N.E.C._(football_club)
|
| 3516 |
+
NAC_Breda
|
| 3517 |
+
NARAL_Pro-Choice_America
|
| 3518 |
+
NASDAQ
|
| 3519 |
+
NATO
|
| 3520 |
+
NATO_intervention_in_Bosnia
|
| 3521 |
+
NBC
|
| 3522 |
+
NK_Olimpija_Ljubljana_(1911)
|
| 3523 |
+
NK_Rudar_Velenje
|
| 3524 |
+
NK_Varaždin
|
| 3525 |
+
NSDAP/AO
|
| 3526 |
+
NTV_(Russia)
|
| 3527 |
+
Nabih_Berri
|
| 3528 |
+
Nablus
|
| 3529 |
+
Nagorno-Karabakh_Republic
|
| 3530 |
+
Nagoum_Yamassoum
|
| 3531 |
+
Nagoya
|
| 3532 |
+
Nagyatád
|
| 3533 |
+
Nail_Beširović
|
| 3534 |
+
Naina_Yeltsina
|
| 3535 |
+
Nairobi
|
| 3536 |
+
Namibia
|
| 3537 |
+
Namibia_national_football_team
|
| 3538 |
+
Nana_Miyagi
|
| 3539 |
+
Nanabhoy_Palkhivala
|
| 3540 |
+
Nancy_Reagan
|
| 3541 |
+
Nandrin
|
| 3542 |
+
Naoki_Soma
|
| 3543 |
+
Naoko_Sawamatsu
|
| 3544 |
+
Naoto_Kan
|
| 3545 |
+
Naples
|
| 3546 |
+
Napoleon_I
|
| 3547 |
+
Napoleon_III
|
| 3548 |
+
Naqoura
|
| 3549 |
+
Narciso_dos_Santos
|
| 3550 |
+
Naseem_Hamed
|
| 3551 |
+
Nasrallah_Boutros_Sfeir
|
| 3552 |
+
Nasser_Hussain
|
| 3553 |
+
Natalya_Pomoshchnikova-Voronova
|
| 3554 |
+
Natalya_Sadova
|
| 3555 |
+
Natalya_Shikolenko
|
| 3556 |
+
Natalya_Torshina-Alimzhanova
|
| 3557 |
+
Natasha_Zvereva
|
| 3558 |
+
Nate_Miller
|
| 3559 |
+
Nathalie_Dechy
|
| 3560 |
+
Nathalie_Lancien
|
| 3561 |
+
Nathalie_Tauziat
|
| 3562 |
+
Nathan_Astle
|
| 3563 |
+
Nation_of_Islam
|
| 3564 |
+
National_Air_Traffic_Services
|
| 3565 |
+
National_Alliance_(Italy)
|
| 3566 |
+
National_Assembly_of_Angola
|
| 3567 |
+
National_Bank_(Bangladesh)
|
| 3568 |
+
National_Bank_of_Poland
|
| 3569 |
+
National_Basketball_Association
|
| 3570 |
+
National_Collegiate_Athletic_Association
|
| 3571 |
+
National_Congress_of_Brazil
|
| 3572 |
+
National_Democratic_Alliance_(Sudan)
|
| 3573 |
+
National_Football_League
|
| 3574 |
+
National_Guard_of_the_United_States
|
| 3575 |
+
National_Hockey_League
|
| 3576 |
+
National_Human_Rights_Commission_(Mexico)
|
| 3577 |
+
National_Hurricane_Center
|
| 3578 |
+
National_Iraqi_News_Agency
|
| 3579 |
+
National_Islamic_Front
|
| 3580 |
+
National_League
|
| 3581 |
+
National_League_Central
|
| 3582 |
+
National_League_East
|
| 3583 |
+
National_League_West
|
| 3584 |
+
National_League_for_Democracy
|
| 3585 |
+
National_Liberation_Front_of_Corsica
|
| 3586 |
+
National_Olympic_Committee
|
| 3587 |
+
National_Park_Service
|
| 3588 |
+
National_Party_(South_Africa)
|
| 3589 |
+
National_Rifle_Association
|
| 3590 |
+
National_Tennis_Centre_(United_Kingdom)
|
| 3591 |
+
National_Transportation_Safety_Board
|
| 3592 |
+
National_University_of_Singapore
|
| 3593 |
+
National_Weather_Service
|
| 3594 |
+
National_stadium
|
| 3595 |
+
NationsBank
|
| 3596 |
+
Native_Americans_in_the_United_States
|
| 3597 |
+
Natural_Law_Party_(United_States)
|
| 3598 |
+
Nature_(journal)
|
| 3599 |
+
Navjot_Singh_Sidhu
|
| 3600 |
+
Nawaz_Sharif
|
| 3601 |
+
Nayan_Mongia
|
| 3602 |
+
Nazi_Germany
|
| 3603 |
+
Nazi_Party
|
| 3604 |
+
Nazism
|
| 3605 |
+
Neal_Lancaster
|
| 3606 |
+
Neale_Fraser
|
| 3607 |
+
Neath_RFC
|
| 3608 |
+
Nebraska
|
| 3609 |
+
Nebraska_Cornhuskers_football
|
| 3610 |
+
Necmettin_Erbakan
|
| 3611 |
+
Neemuch
|
| 3612 |
+
Neil_Back
|
| 3613 |
+
Neil_Fairbrother
|
| 3614 |
+
Neil_Hodgson
|
| 3615 |
+
Neil_Jordan
|
| 3616 |
+
Neil_Williams_(cricketer)
|
| 3617 |
+
Nelson,_New_Zealand
|
| 3618 |
+
Nelson_A._Miles
|
| 3619 |
+
Nelson_Mandela
|
| 3620 |
+
Nelė_Žilinskienė
|
| 3621 |
+
Neo-Nazism
|
| 3622 |
+
Nepal
|
| 3623 |
+
Nepali_Congress
|
| 3624 |
+
Netherlands
|
| 3625 |
+
Netherlands_Fed_Cup_team
|
| 3626 |
+
Netherlands_national_football_team
|
| 3627 |
+
Neuchâtel
|
| 3628 |
+
Neuchâtel_Xamax
|
| 3629 |
+
Nevada
|
| 3630 |
+
Nevil_Dede
|
| 3631 |
+
Nevill_Ground
|
| 3632 |
+
Neville_Godwin
|
| 3633 |
+
NewYork–Presbyterian_Hospital
|
| 3634 |
+
New_Aspiration_Party
|
| 3635 |
+
New_Caledonia
|
| 3636 |
+
New_Delhi
|
| 3637 |
+
New_Democracy_(Greece)
|
| 3638 |
+
New_England
|
| 3639 |
+
New_England_Patriots
|
| 3640 |
+
New_Hampshire,_Ohio
|
| 3641 |
+
New_Haven,_Connecticut
|
| 3642 |
+
New_Jersey
|
| 3643 |
+
New_Jersey_Devils
|
| 3644 |
+
New_Jersey_Nets
|
| 3645 |
+
New_Mexico
|
| 3646 |
+
New_Mexico_Activities_Association
|
| 3647 |
+
New_Orleans_Hornets
|
| 3648 |
+
New_Orleans_Saints
|
| 3649 |
+
New_Party_Sakigake
|
| 3650 |
+
New_Scientist
|
| 3651 |
+
New_South_Wales_rugby_league_team
|
| 3652 |
+
New_Territories
|
| 3653 |
+
New_York
|
| 3654 |
+
New_York_City
|
| 3655 |
+
New_York_City_Department_of_Transportation
|
| 3656 |
+
New_York_Cotton_Exchange
|
| 3657 |
+
New_York_Giants
|
| 3658 |
+
New_York_Islanders
|
| 3659 |
+
New_York_Jets
|
| 3660 |
+
New_York_Knicks
|
| 3661 |
+
New_York_Mercantile_Exchange
|
| 3662 |
+
New_York_Mets
|
| 3663 |
+
New_York_Post
|
| 3664 |
+
New_York_Rangers
|
| 3665 |
+
New_York_Stock_Exchange
|
| 3666 |
+
New_York_Yankees
|
| 3667 |
+
New_Zealand
|
| 3668 |
+
New_Zealand_Barbarians
|
| 3669 |
+
New_Zealand_First
|
| 3670 |
+
New_Zealand_Labour_Party
|
| 3671 |
+
New_Zealand_National_Party
|
| 3672 |
+
New_Zealand_Press_Association
|
| 3673 |
+
New_Zealand_Warriors
|
| 3674 |
+
New_Zealand_dollar
|
| 3675 |
+
New_Zealand_national_cricket_team
|
| 3676 |
+
New_Zealand_national_rugby_union_team
|
| 3677 |
+
New_Zealanders
|
| 3678 |
+
New_media
|
| 3679 |
+
Newark,_New_Jersey
|
| 3680 |
+
Newbridge_RFC
|
| 3681 |
+
Newbury,_Berkshire
|
| 3682 |
+
Newcastle_Knights
|
| 3683 |
+
Newcastle_United_F.C.
|
| 3684 |
+
Newcastle_upon_Tyne
|
| 3685 |
+
Newcrest_Mining
|
| 3686 |
+
Newfoundland_(island)
|
| 3687 |
+
Newmarket,_Suffolk
|
| 3688 |
+
Newmont_Mining_Corporation
|
| 3689 |
+
Newport_Gwent_Dragons
|
| 3690 |
+
Newport_RFC
|
| 3691 |
+
News_Corporation
|
| 3692 |
+
Newsnight
|
| 3693 |
+
Newt_Gingrich
|
| 3694 |
+
Niall_Quinn
|
| 3695 |
+
Nicaragua
|
| 3696 |
+
Nicaraguans
|
| 3697 |
+
Nice
|
| 3698 |
+
Nick_Faldo
|
| 3699 |
+
Nick_Farr-Jones
|
| 3700 |
+
Nick_Knight
|
| 3701 |
+
Nick_Nieland
|
| 3702 |
+
Nick_Popplewell
|
| 3703 |
+
Nick_Price
|
| 3704 |
+
Nicklas_Kulti
|
| 3705 |
+
Nicky_Boje
|
| 3706 |
+
Niclas_Fasth
|
| 3707 |
+
Nico-Jan_Hoogma
|
| 3708 |
+
Nico_Motchebon
|
| 3709 |
+
Nico_van_Kerckhoven
|
| 3710 |
+
Nicola_Mazzucato
|
| 3711 |
+
Nicolas_Ouédec
|
| 3712 |
+
Nicole_Arendt
|
| 3713 |
+
Nicole_Bradtke
|
| 3714 |
+
Nicole_Brown_Simpson
|
| 3715 |
+
Nicoleta_Grasu
|
| 3716 |
+
Nicolás_Lapentti
|
| 3717 |
+
Nicolás_Pereira
|
| 3718 |
+
Nicosia
|
| 3719 |
+
Nigel_Mobbs
|
| 3720 |
+
Nigel_Walker
|
| 3721 |
+
Niger
|
| 3722 |
+
Nigeria
|
| 3723 |
+
Nihon_Keizai_Shimbun
|
| 3724 |
+
Nikkei_225
|
| 3725 |
+
Nir_Sivilia
|
| 3726 |
+
Nixon_McLean
|
| 3727 |
+
Nobel_Peace_Prize
|
| 3728 |
+
Nobel_Prize
|
| 3729 |
+
Nobina_Sverige
|
| 3730 |
+
Noel_Gallagher
|
| 3731 |
+
Noel_Whelan
|
| 3732 |
+
Nolan_Henke
|
| 3733 |
+
Nolan_Ryan
|
| 3734 |
+
Noranda_(mining_company)
|
| 3735 |
+
Norberto_Téllez
|
| 3736 |
+
Nordegg,_Alberta
|
| 3737 |
+
Noriaki_Kasai
|
| 3738 |
+
Norifumi_Abe
|
| 3739 |
+
Norio_Omura
|
| 3740 |
+
Noriyuki_Haga
|
| 3741 |
+
Norm_Charlton
|
| 3742 |
+
Norm_Hewitt
|
| 3743 |
+
Norodom_Ranariddh
|
| 3744 |
+
Norodom_Sihanouk
|
| 3745 |
+
North_America
|
| 3746 |
+
North_Battleford
|
| 3747 |
+
North_Caucasus
|
| 3748 |
+
North_Dakota
|
| 3749 |
+
North_Island
|
| 3750 |
+
North_Kivu
|
| 3751 |
+
North_Korea
|
| 3752 |
+
North_Melbourne_Football_Club
|
| 3753 |
+
North_Queensland_Cowboys
|
| 3754 |
+
North_Shore_City
|
| 3755 |
+
North_Sydney_Bears
|
| 3756 |
+
North_West_(South_African_province)
|
| 3757 |
+
North_Yemen
|
| 3758 |
+
Northampton
|
| 3759 |
+
Northampton_Saints
|
| 3760 |
+
Northampton_Town_F.C.
|
| 3761 |
+
Northamptonshire_County_Cricket_Club
|
| 3762 |
+
Northern_Cape
|
| 3763 |
+
Northern_Ireland
|
| 3764 |
+
Northern_Ireland_national_football_team
|
| 3765 |
+
Northerns_cricket_team
|
| 3766 |
+
Norway
|
| 3767 |
+
Norwest
|
| 3768 |
+
Norwich_City_F.C.
|
| 3769 |
+
Notting_Hill_Carnival
|
| 3770 |
+
Nottingham
|
| 3771 |
+
Nottingham_Forest_F.C.
|
| 3772 |
+
Nottinghamshire_County_Cricket_Club
|
| 3773 |
+
Notts_County_F.C.
|
| 3774 |
+
Nouakchott
|
| 3775 |
+
Noureddine_Morceli
|
| 3776 |
+
Novye_Atagi
|
| 3777 |
+
Numico
|
| 3778 |
+
Nunthorpe_Stakes
|
| 3779 |
+
Nuremberg
|
| 3780 |
+
Nuremberg_Airport
|
| 3781 |
+
O._J._Simpson
|
| 3782 |
+
OFK_Beograd
|
| 3783 |
+
OGC_Nice
|
| 3784 |
+
OKD
|
| 3785 |
+
OKS_1945_Olsztyn
|
| 3786 |
+
OPEC
|
| 3787 |
+
OSCE_Minsk_Group
|
| 3788 |
+
O_Globo
|
| 3789 |
+
Oakland,_California
|
| 3790 |
+
Oakland,_New_Jersey
|
| 3791 |
+
Oakland_Athletics
|
| 3792 |
+
Oakland_Raiders
|
| 3793 |
+
Oasis_(band)
|
| 3794 |
+
Oaxaca
|
| 3795 |
+
Oceano_da_Cruz
|
| 3796 |
+
Odra_Wodzisław
|
| 3797 |
+
Oerlikon_(Zürich)
|
| 3798 |
+
Office_of_Fair_Trading
|
| 3799 |
+
Ogün_Temizkanoğlu
|
| 3800 |
+
Ohio
|
| 3801 |
+
Ohio_State_Buckeyes_football
|
| 3802 |
+
Okinawa_Prefecture
|
| 3803 |
+
Oklahoma
|
| 3804 |
+
Oklahoma_Panhandle
|
| 3805 |
+
Oklahoma_State_University–Stillwater
|
| 3806 |
+
Okocim
|
| 3807 |
+
Oksana_Grishina
|
| 3808 |
+
Olabisi_Afolabi
|
| 3809 |
+
Olaf_Ludwig
|
| 3810 |
+
Olaf_Thon
|
| 3811 |
+
Old_City_(Jerusalem)
|
| 3812 |
+
Old_Testament
|
| 3813 |
+
Old_Trafford
|
| 3814 |
+
Old_Trafford_Cricket_Ground
|
| 3815 |
+
Oldham_Athletic_A.F.C.
|
| 3816 |
+
Oldham_Roughyeds
|
| 3817 |
+
Ole_Einar_Bjørndalen
|
| 3818 |
+
Ole_Gunnar_Solskjær
|
| 3819 |
+
Olga_Chernyavskaya
|
| 3820 |
+
Olga_Melnik
|
| 3821 |
+
Olga_Slyusareva
|
| 3822 |
+
Olin_Browne
|
| 3823 |
+
Oliver_Bierhoff
|
| 3824 |
+
Oliver_Kahn
|
| 3825 |
+
Oliver_McCall
|
| 3826 |
+
Oliver_Reck
|
| 3827 |
+
Olivier_Grouillard
|
| 3828 |
+
Olivier_Panis
|
| 3829 |
+
Olo_Brown
|
| 3830 |
+
Olympiacos_F.C.
|
| 3831 |
+
Olympiad
|
| 3832 |
+
Olympic_Airlines
|
| 3833 |
+
Olympic_sports
|
| 3834 |
+
Olympique_Khouribga
|
| 3835 |
+
Olympique_Lyonnais
|
| 3836 |
+
Olympique_de_Marseille
|
| 3837 |
+
Omaha,_Nebraska
|
| 3838 |
+
Oman
|
| 3839 |
+
Omar_Bongo
|
| 3840 |
+
Omar_Karami
|
| 3841 |
+
On_the_Waterfront
|
| 3842 |
+
Ong_Ewe_Hock
|
| 3843 |
+
Opel
|
| 3844 |
+
Operation_Provide_Comfort
|
| 3845 |
+
Oppenheimer_Holdings
|
| 3846 |
+
Oradea_International_Airport
|
| 3847 |
+
Oran
|
| 3848 |
+
Orel_Hershiser
|
| 3849 |
+
Organisation_of_the_Islamic_Conference
|
| 3850 |
+
Orhan_Çıkırıkçı
|
| 3851 |
+
Orlando_Magic
|
| 3852 |
+
Orlando_Miller
|
| 3853 |
+
Orlando_Pace
|
| 3854 |
+
Orlando_Pirates_FC
|
| 3855 |
+
Orrell_R.U.F.C.
|
| 3856 |
+
Orvieto
|
| 3857 |
+
Osaka
|
| 3858 |
+
Osaka_International_Airport
|
| 3859 |
+
Oscar_Luigi_Scalfaro
|
| 3860 |
+
Oslo
|
| 3861 |
+
Oslobođenje
|
| 3862 |
+
Osmond_Ezinwa
|
| 3863 |
+
Otis_Nixon
|
| 3864 |
+
Ottawa
|
| 3865 |
+
Ottawa_67's
|
| 3866 |
+
Ottawa_Senators
|
| 3867 |
+
Ottoman_Empire
|
| 3868 |
+
Ove_Sellberg
|
| 3869 |
+
Ovidiu_Stângă
|
| 3870 |
+
Owen_Finegan
|
| 3871 |
+
Oxford
|
| 3872 |
+
Oxford_United_F.C.
|
| 3873 |
+
Ozzie_Guillén
|
| 3874 |
+
Oğuz_Çetin
|
| 3875 |
+
P._W._Botha
|
| 3876 |
+
PBC_CSKA_Moscow
|
| 3877 |
+
PFC_CSKA_Moscow
|
| 3878 |
+
PFC_Levski_Sofia
|
| 3879 |
+
PFC_Nyva_Vinnytsia
|
| 3880 |
+
PGA_European_Tour
|
| 3881 |
+
PGA_Tour
|
| 3882 |
+
PMC-Sierra
|
| 3883 |
+
PSINet
|
| 3884 |
+
PSV_Eindhoven
|
| 3885 |
+
Pablo_Sánchez
|
| 3886 |
+
Pacific_Division_(NBA)
|
| 3887 |
+
Pacific_Division_(NHL)
|
| 3888 |
+
Pacific_Exchange
|
| 3889 |
+
Pacific_Rim
|
| 3890 |
+
Pacific_coast
|
| 3891 |
+
Paine_Webber
|
| 3892 |
+
Pakistan
|
| 3893 |
+
Pakistan_Muslim_League_(N)
|
| 3894 |
+
Pakistan_national_cricket_team
|
| 3895 |
+
Palestine
|
| 3896 |
+
Palestinian_Legislative_Council
|
| 3897 |
+
Palestinian_National_Authority
|
| 3898 |
+
Palestinian_territories
|
| 3899 |
+
Palk_Strait
|
| 3900 |
+
Pallacanestro_Treviso
|
| 3901 |
+
Pam_Shriver
|
| 3902 |
+
Pamir_Mountains
|
| 3903 |
+
Pamplona
|
| 3904 |
+
Pan-Turkism
|
| 3905 |
+
Pan_Am_Flight_103
|
| 3906 |
+
Pan_American_World_Airways
|
| 3907 |
+
Panama
|
| 3908 |
+
Panama_City
|
| 3909 |
+
Panama_national_football_team
|
| 3910 |
+
Panathinaikos_BC
|
| 3911 |
+
Panathinaikos_F.C.
|
| 3912 |
+
Panhellenic_Socialist_Movement
|
| 3913 |
+
Panionios_B.C.
|
| 3914 |
+
Paola_Suárez
|
| 3915 |
+
Paolo_Di_Canio
|
| 3916 |
+
Paolo_Negro
|
| 3917 |
+
Paolo_Vaccari
|
| 3918 |
+
Papendrecht
|
| 3919 |
+
Papua_New_Guinea
|
| 3920 |
+
Paraguay
|
| 3921 |
+
Paralympic_Games
|
| 3922 |
+
Paramaribo
|
| 3923 |
+
Paramount,_California
|
| 3924 |
+
Paramount_Pictures
|
| 3925 |
+
Paraná_Clube
|
| 3926 |
+
Parc_des_Princes
|
| 3927 |
+
Paris
|
| 3928 |
+
Paris,_Arkansas
|
| 3929 |
+
Paris-Charles_de_Gaulle_Airport
|
| 3930 |
+
Paris_Saint-Germain_F.C.
|
| 3931 |
+
Paris_Saint_Germain_(rugby_league_team)
|
| 3932 |
+
Park_Sung-hee
|
| 3933 |
+
Parma_F.C.
|
| 3934 |
+
Parramatta_Eels
|
| 3935 |
+
Partick_Thistle_F.C.
|
| 3936 |
+
Partition_of_India
|
| 3937 |
+
Party_of_Democratic_Action
|
| 3938 |
+
Party_of_Democratic_Socialism_(Germany)
|
| 3939 |
+
Pará
|
| 3940 |
+
Pascal_Renier
|
| 3941 |
+
Pascal_Zuberbühler
|
| 3942 |
+
Pat_Cash
|
| 3943 |
+
Pat_Hentgen
|
| 3944 |
+
Pat_Howard
|
| 3945 |
+
Pat_Hurst
|
| 3946 |
+
Pat_Manson
|
| 3947 |
+
Pat_McGinlay
|
| 3948 |
+
Pat_Symcox
|
| 3949 |
+
Patrice_Loko
|
| 3950 |
+
Patricia_Girard
|
| 3951 |
+
Patrick_Colleter
|
| 3952 |
+
Patrick_Kluivert
|
| 3953 |
+
Patrick_Rafter
|
| 3954 |
+
Patrick_Sang
|
| 3955 |
+
Patrick_Seale
|
| 3956 |
+
Patrick_Stevens
|
| 3957 |
+
Patrick_Sylvestre
|
| 3958 |
+
Patrick_Vieira
|
| 3959 |
+
Patrik_Andersson
|
| 3960 |
+
Patrik_Sjöberg
|
| 3961 |
+
Patriotic_Salvation_Movement
|
| 3962 |
+
Patriotic_Union_of_Kurdistan
|
| 3963 |
+
Patsy_Kensit
|
| 3964 |
+
Pattaya
|
| 3965 |
+
Paul_Adams_(cricketer)
|
| 3966 |
+
Paul_Affleck
|
| 3967 |
+
Paul_Belmondo
|
| 3968 |
+
Paul_Broadhurst
|
| 3969 |
+
Paul_Curry_(golfer)
|
| 3970 |
+
Paul_Eales
|
| 3971 |
+
Paul_Gascoigne
|
| 3972 |
+
Paul_Goydos
|
| 3973 |
+
Paul_Haarhuis
|
| 3974 |
+
Paul_Ince
|
| 3975 |
+
Paul_Johnson_(cricketer)
|
| 3976 |
+
Paul_Johnson_(squash_player)
|
| 3977 |
+
Paul_Justin
|
| 3978 |
+
Paul_Keating
|
| 3979 |
+
Paul_Koech
|
| 3980 |
+
Paul_Lawrie
|
| 3981 |
+
Paul_McGinley
|
| 3982 |
+
Paul_McGrath_(footballer)
|
| 3983 |
+
Paul_Newlove
|
| 3984 |
+
Paul_Peschisolido
|
| 3985 |
+
Paul_Prichard
|
| 3986 |
+
Paul_Reiffel
|
| 3987 |
+
Paul_Sorrento
|
| 3988 |
+
Paul_Stankowski
|
| 3989 |
+
Paul_Strang
|
| 3990 |
+
Paul_Tergat
|
| 3991 |
+
Paul_Tracy
|
| 3992 |
+
Paul_Van_Himst
|
| 3993 |
+
Paul_Warhurst
|
| 3994 |
+
Paul_Wright_(footballer)
|
| 3995 |
+
Paula_Radcliffe
|
| 3996 |
+
Pauline_Davis-Thompson
|
| 3997 |
+
Pauline_Konga
|
| 3998 |
+
Paulinho_Santos
|
| 3999 |
+
Paulo_Alves
|
| 4000 |
+
Paulo_Bento
|
| 4001 |
+
Paulo_Roberto_do_Carmo
|
| 4002 |
+
Paulo_Sousa
|
| 4003 |
+
Paulo_Sérgio_Silvestre_do_Nascimento
|
| 4004 |
+
Pavel_Buran
|
| 4005 |
+
Pavel_Bure
|
| 4006 |
+
Pavel_Muslimov
|
| 4007 |
+
Pavel_Nedvěd
|
| 4008 |
+
Pavel_Polomský
|
| 4009 |
+
Payne_Stewart
|
| 4010 |
+
Peace_River_(Canada)
|
| 4011 |
+
Pedro_Diniz
|
| 4012 |
+
Pedro_I_of_Brazil
|
| 4013 |
+
Pedro_Lamy
|
| 4014 |
+
Pedro_Linhart
|
| 4015 |
+
Pedro_Martínez
|
| 4016 |
+
Peer_Gynt
|
| 4017 |
+
Pemberton,_British_Columbia
|
| 4018 |
+
Pembroke,_Massachusetts
|
| 4019 |
+
Pembroke_Pines,_Florida
|
| 4020 |
+
Pendleton,_Oregon
|
| 4021 |
+
Pennsylvania
|
| 4022 |
+
Penrith_Panthers
|
| 4023 |
+
People's_Party_(Spain)
|
| 4024 |
+
People's_Party_–_Movement_for_a_Democratic_Slovakia
|
| 4025 |
+
People's_Republic_of_China
|
| 4026 |
+
People_of_the_United_States
|
| 4027 |
+
Per_Nyman
|
| 4028 |
+
Perm
|
| 4029 |
+
Pernilla_Wiberg
|
| 4030 |
+
Peronism
|
| 4031 |
+
Persian_Gulf
|
| 4032 |
+
Perth,_Western_Australia
|
| 4033 |
+
Peru
|
| 4034 |
+
Perugia_Calcio
|
| 4035 |
+
Pesalai
|
| 4036 |
+
Pete_Harnisch
|
| 4037 |
+
Pete_Incaviglia
|
| 4038 |
+
Pete_Sampras
|
| 4039 |
+
Pete_Wilson
|
| 4040 |
+
Peter_Atherton
|
| 4041 |
+
Peter_Baker_(golfer)
|
| 4042 |
+
Peter_Beardsley
|
| 4043 |
+
Peter_Blank
|
| 4044 |
+
Peter_Dubovský
|
| 4045 |
+
Peter_Hedblom
|
| 4046 |
+
Peter_Johansson_(motorcyclist)
|
| 4047 |
+
Peter_Kox
|
| 4048 |
+
Peter_Martin_(cricketer)
|
| 4049 |
+
Peter_Mitchell_(golfer)
|
| 4050 |
+
Peter_Munk
|
| 4051 |
+
Peter_Nicol
|
| 4052 |
+
Peter_Schöttel
|
| 4053 |
+
Peter_Such
|
| 4054 |
+
Peter_Tramacchi
|
| 4055 |
+
Peter_van_Vossen
|
| 4056 |
+
Peterborough_United_F.C.
|
| 4057 |
+
Petersburg,_Virginia
|
| 4058 |
+
Petr_Gabriel
|
| 4059 |
+
Petr_Korda
|
| 4060 |
+
Petra_Behle
|
| 4061 |
+
Petra_Langrová
|
| 4062 |
+
Petra_News_Agency
|
| 4063 |
+
Petre_Roman
|
| 4064 |
+
Phil_Babb
|
| 4065 |
+
Phil_Gray
|
| 4066 |
+
Phil_Mickelson
|
| 4067 |
+
Phil_Regan_(baseball)
|
| 4068 |
+
Phil_Simmons
|
| 4069 |
+
Philadelphia
|
| 4070 |
+
Philadelphia_76ers
|
| 4071 |
+
Philadelphia_Eagles
|
| 4072 |
+
Philadelphia_Flyers
|
| 4073 |
+
Philadelphia_Phillies
|
| 4074 |
+
Philip_Morris_International
|
| 4075 |
+
Philip_Walton
|
| 4076 |
+
Philippe_Ermenault
|
| 4077 |
+
Philippe_Sella
|
| 4078 |
+
Philippe_Séguin
|
| 4079 |
+
Philippine_Basketball_Association
|
| 4080 |
+
Philippines
|
| 4081 |
+
Phillip_Cocu
|
| 4082 |
+
Phillip_DeFreitas
|
| 4083 |
+
Phillip_Price
|
| 4084 |
+
Phnom_Penh
|
| 4085 |
+
Phoenix,_Arizona
|
| 4086 |
+
Phoenix_Coyotes
|
| 4087 |
+
Phoenix_Suns
|
| 4088 |
+
Phylis_Smith
|
| 4089 |
+
Piacenza_Calcio
|
| 4090 |
+
Picabo_Street
|
| 4091 |
+
Pierluigi_Casiraghi
|
| 4092 |
+
Pierre-Henri_Raphanel
|
| 4093 |
+
Pierre_Buyoya
|
| 4094 |
+
Pierre_Fulke
|
| 4095 |
+
Pierre_Laigle
|
| 4096 |
+
Pierre_Lueders
|
| 4097 |
+
Pierre_van_Hooijdonk
|
| 4098 |
+
Pilot_Pen_Tennis
|
| 4099 |
+
Piper_Jaffray
|
| 4100 |
+
Pirelli
|
| 4101 |
+
Pittsburgh
|
| 4102 |
+
Pittsburgh_Penguins
|
| 4103 |
+
Pittsburgh_Pirates
|
| 4104 |
+
Pittsburgh_Steelers
|
| 4105 |
+
Place_Beauvau
|
| 4106 |
+
Plymouth,_Montserrat
|
| 4107 |
+
Plymouth_Argyle_F.C.
|
| 4108 |
+
Podujevo
|
| 4109 |
+
Pohang_Steelers
|
| 4110 |
+
Pol_Pot
|
| 4111 |
+
Poland
|
| 4112 |
+
Poland_national_football_team
|
| 4113 |
+
Poles
|
| 4114 |
+
Polish_Press_Agency
|
| 4115 |
+
Polonia_Warszawa
|
| 4116 |
+
Pontefract
|
| 4117 |
+
Pontiac,_Michigan
|
| 4118 |
+
Pontypridd
|
| 4119 |
+
Pontypridd_RFC
|
| 4120 |
+
Pope_John_Paul_II
|
| 4121 |
+
Popular_Revolutionary_Army
|
| 4122 |
+
Porsche
|
| 4123 |
+
Port_Arthur,_Tasmania
|
| 4124 |
+
Port_Louis
|
| 4125 |
+
Port_Vale_F.C.
|
| 4126 |
+
Portadown_F.C.
|
| 4127 |
+
Portland,_Oregon
|
| 4128 |
+
Portland_Trail_Blazers
|
| 4129 |
+
Portsmouth
|
| 4130 |
+
Portsmouth_F.C.
|
| 4131 |
+
Portugal
|
| 4132 |
+
Portugal_national_football_team
|
| 4133 |
+
Portuguese_Empire
|
| 4134 |
+
Portuguese_Liga
|
| 4135 |
+
Post-Communism
|
| 4136 |
+
Post-Soviet_states
|
| 4137 |
+
Potsdam
|
| 4138 |
+
Poul-Erik_Høyer_Larsen
|
| 4139 |
+
Prague
|
| 4140 |
+
Prague_Stock_Exchange
|
| 4141 |
+
Prakash_Chandra_Lohani
|
| 4142 |
+
Predrag_Mijatović
|
| 4143 |
+
Premier_League
|
| 4144 |
+
Prensa_Latina
|
| 4145 |
+
Press_Trust_of_India
|
| 4146 |
+
Preston
|
| 4147 |
+
Preston_North_End_F.C.
|
| 4148 |
+
Prestwick
|
| 4149 |
+
Pretoria
|
| 4150 |
+
Primož_Peterka
|
| 4151 |
+
Prince_Eugene_of_Savoy
|
| 4152 |
+
Prince_Rupert,_British_Columbia
|
| 4153 |
+
Prince_William_Sound
|
| 4154 |
+
Princeton_N._Lyman
|
| 4155 |
+
Pro_Bowl
|
| 4156 |
+
Pro_Football_Hall_of_Fame
|
| 4157 |
+
Professional_Squash_Association
|
| 4158 |
+
Progressive_Field
|
| 4159 |
+
Province_of_Mantua
|
| 4160 |
+
Provisional_Irish_Republican_Army
|
| 4161 |
+
Prudential_plc
|
| 4162 |
+
Public_Transport_Corporation
|
| 4163 |
+
Public_utilities_commission
|
| 4164 |
+
Pudong
|
| 4165 |
+
Puebla_F.C.
|
| 4166 |
+
Puerto_Rico
|
| 4167 |
+
Puertollano
|
| 4168 |
+
Punjab,_Pakistan
|
| 4169 |
+
Pyramiden
|
| 4170 |
+
Pádraig_Harrington
|
| 4171 |
+
Pável_Pardo
|
| 4172 |
+
Qasr-e_Shirin
|
| 4173 |
+
Qian_Qichen
|
| 4174 |
+
Qing_Dynasty
|
| 4175 |
+
Queen's_Park,_Chesterfield
|
| 4176 |
+
Queen_of_the_South_F.C.
|
| 4177 |
+
Queens_Park_Rangers_F.C.
|
| 4178 |
+
Queensland
|
| 4179 |
+
Quentin_Coryatt
|
| 4180 |
+
Quetta
|
| 4181 |
+
Quintana_Roo
|
| 4182 |
+
Quito
|
| 4183 |
+
Qur'an
|
| 4184 |
+
R.E._Mouscron
|
| 4185 |
+
R.S.C._Anderlecht
|
| 4186 |
+
R.W.D._Molenbeek
|
| 4187 |
+
R._Charleroi_S.C.
|
| 4188 |
+
R._Nicholas_Burns
|
| 4189 |
+
RAI
|
| 4190 |
+
RAO_UES
|
| 4191 |
+
RCD_Espanyol
|
| 4192 |
+
RC_Lens
|
| 4193 |
+
RC_Strasbourg
|
| 4194 |
+
RKC_Waalwijk
|
| 4195 |
+
RMS_Titanic
|
| 4196 |
+
RSA_Security
|
| 4197 |
+
Rabat
|
| 4198 |
+
Rabobank
|
| 4199 |
+
Rabobank_(cycling_team)
|
| 4200 |
+
Racing_Club_de_Avellaneda
|
| 4201 |
+
Racing_de_Santander
|
| 4202 |
+
Radek_Bonk
|
| 4203 |
+
Radical_Cause
|
| 4204 |
+
Radio_Kabul
|
| 4205 |
+
Radio_New_Zealand
|
| 4206 |
+
Radiotelevision_of_Bosnia-Herzegovina
|
| 4207 |
+
Radka_Zrubáková
|
| 4208 |
+
Rafael_Alkorta
|
| 4209 |
+
Rafael_Palmeiro
|
| 4210 |
+
Rafic_Hariri
|
| 4211 |
+
Rahul_Dravid
|
| 4212 |
+
Rainier_III,_Prince_of_Monaco
|
| 4213 |
+
Raith_Rovers_F.C.
|
| 4214 |
+
Raja_Casablanca
|
| 4215 |
+
Raków_Częstochowa
|
| 4216 |
+
Ralf_Kelleners
|
| 4217 |
+
Rama
|
| 4218 |
+
Ramallah
|
| 4219 |
+
Rambo_(film_series)
|
| 4220 |
+
Rameswaram
|
| 4221 |
+
Ramla
|
| 4222 |
+
Ramon_Vega
|
| 4223 |
+
Ramón_Delgado
|
| 4224 |
+
Ramón_Ramírez
|
| 4225 |
+
Randall_Cunningham
|
| 4226 |
+
Randy_Johnson
|
| 4227 |
+
Randy_Jones_(bobsleigh)
|
| 4228 |
+
Randy_Velarde
|
| 4229 |
+
Rangers_F.C.
|
| 4230 |
+
Ranji_Trophy
|
| 4231 |
+
Ransart,_Belgium
|
| 4232 |
+
Raphaël_Wicky
|
| 4233 |
+
Ras_Tanura
|
| 4234 |
+
Rashid_Latif
|
| 4235 |
+
Rashid_Sidek
|
| 4236 |
+
Ratlam
|
| 4237 |
+
Ravenna_Calcio
|
| 4238 |
+
Ravi_River
|
| 4239 |
+
Ravindra_Pushpakumara
|
| 4240 |
+
Ray_Buchanan
|
| 4241 |
+
Ray_Durham
|
| 4242 |
+
Ray_Houghton
|
| 4243 |
+
Ray_Knight
|
| 4244 |
+
Ray_Lankford
|
| 4245 |
+
Raymond_Atteveld
|
| 4246 |
+
Raymond_James
|
| 4247 |
+
Raymond_Russell
|
| 4248 |
+
Rayo_Vallecano
|
| 4249 |
+
Raúl_González
|
| 4250 |
+
Reading_F.C.
|
| 4251 |
+
Reading_R.F.C.
|
| 4252 |
+
Real_Betis
|
| 4253 |
+
Real_Madrid_C.F.
|
| 4254 |
+
Real_Oviedo
|
| 4255 |
+
Real_Sociedad
|
| 4256 |
+
Real_Valladolid
|
| 4257 |
+
Real_Zaragoza
|
| 4258 |
+
Recep_Çetin
|
| 4259 |
+
Red_Brigades
|
| 4260 |
+
Red_River_of_the_North
|
| 4261 |
+
Red_Sea
|
| 4262 |
+
Red_Star_Belgrade
|
| 4263 |
+
Rede_Globo
|
| 4264 |
+
Redmond,_Washington
|
| 4265 |
+
Reform_Party_of_the_United_States_of_America
|
| 4266 |
+
Regi_Blinker
|
| 4267 |
+
Regina_Jacobs
|
| 4268 |
+
Reinhard_Schwarzenberger
|
| 4269 |
+
Remington_Model_8
|
| 4270 |
+
Renate_Götschl
|
| 4271 |
+
Rennae_Stubbs
|
| 4272 |
+
Rennes
|
| 4273 |
+
Renzo_Furlan
|
| 4274 |
+
René_(novella)
|
| 4275 |
+
René_Eijkelkamp
|
| 4276 |
+
René_Schneider_(footballer)
|
| 4277 |
+
René_Tretschok
|
| 4278 |
+
Repsol_YPF
|
| 4279 |
+
Republic_of_China
|
| 4280 |
+
Republic_of_Ireland
|
| 4281 |
+
Republic_of_Ireland_national_football_team
|
| 4282 |
+
Republic_of_Macedonia
|
| 4283 |
+
Republic_of_Serbian_Krajina
|
| 4284 |
+
Republic_of_the_Congo
|
| 4285 |
+
Republican_National_Convention
|
| 4286 |
+
Republican_Party_(United_States)
|
| 4287 |
+
Republican_Rally_for_Democracy_in_Rwanda
|
| 4288 |
+
Republika_(Indonesian_newspaper)
|
| 4289 |
+
Republika_Srpska
|
| 4290 |
+
Resalat_(newspaper)
|
| 4291 |
+
Reserve_Bank_of_Australia
|
| 4292 |
+
Reserve_Bank_of_India
|
| 4293 |
+
Resistance_movement
|
| 4294 |
+
Retief_Goosen
|
| 4295 |
+
Reto_Götschi
|
| 4296 |
+
Reuters
|
| 4297 |
+
Revolutionary_Armed_Forces_of_Colombia
|
| 4298 |
+
Revolutionary_United_Front
|
| 4299 |
+
Reynald_Pedros
|
| 4300 |
+
Rheinpark_Stadion
|
| 4301 |
+
Ricardo_Peláez
|
| 4302 |
+
Ricardo_Rosset
|
| 4303 |
+
Ricardo_Sá_Pinto
|
| 4304 |
+
Ricco_Groß
|
| 4305 |
+
Richard_Hadlee
|
| 4306 |
+
Richard_Hannon
|
| 4307 |
+
Richard_Kettleborough
|
| 4308 |
+
Richard_Krajicek
|
| 4309 |
+
Richard_Lamm
|
| 4310 |
+
Richard_Roelofsen
|
| 4311 |
+
Richard_Witschge
|
| 4312 |
+
Richey_Reneberg
|
| 4313 |
+
Richmond,_Virginia
|
| 4314 |
+
Richmond_Football_Club
|
| 4315 |
+
Richter_magnitude_scale
|
| 4316 |
+
Rick_Huisman
|
| 4317 |
+
Rickey_Henderson
|
| 4318 |
+
Ricky_Ponting
|
| 4319 |
+
Ricky_Watters
|
| 4320 |
+
Riga
|
| 4321 |
+
Rika_Hiraki
|
| 4322 |
+
Rio_Tinto_Alcan
|
| 4323 |
+
Rio_de_Janeiro
|
| 4324 |
+
Riverside_Ground
|
| 4325 |
+
Riyadh
|
| 4326 |
+
Rob_Andrew
|
| 4327 |
+
Rob_Enderle
|
| 4328 |
+
Rob_Howley
|
| 4329 |
+
Robbie_Earle
|
| 4330 |
+
Robbie_Fowler
|
| 4331 |
+
Robbie_McEwen
|
| 4332 |
+
Robbie_Winters
|
| 4333 |
+
Robert_Allenby
|
| 4334 |
+
Robert_Coles_(golfer)
|
| 4335 |
+
Robert_Croft
|
| 4336 |
+
Robert_Karlsson
|
| 4337 |
+
Robert_Mugabe
|
| 4338 |
+
Robert_P._Casey
|
| 4339 |
+
Robert_Pelletreau
|
| 4340 |
+
Robert_Pirès
|
| 4341 |
+
Robert_Reichel
|
| 4342 |
+
Robert_Rubin
|
| 4343 |
+
Robert_Samuels
|
| 4344 |
+
Robert_Schuman
|
| 4345 |
+
Robert_W._Baird
|
| 4346 |
+
Roberta_Brunet
|
| 4347 |
+
Roberto_Alomar
|
| 4348 |
+
Roberto_Ayala
|
| 4349 |
+
Roberto_Baggio
|
| 4350 |
+
Roberto_Benigni
|
| 4351 |
+
Roberto_Bisconti
|
| 4352 |
+
Roberto_Carlos_(Spanish_footballer)
|
| 4353 |
+
Roberto_Carlos_(footballer)
|
| 4354 |
+
Roberto_Carretero
|
| 4355 |
+
Roberto_Chiappa
|
| 4356 |
+
Roberto_Durán
|
| 4357 |
+
Roberto_M._Levingston
|
| 4358 |
+
Roberto_Mancini
|
| 4359 |
+
Robin_Brooke
|
| 4360 |
+
Robin_Ventura
|
| 4361 |
+
Rochdale_A.F.C.
|
| 4362 |
+
Rochester,_New_Hampshire
|
| 4363 |
+
Rocky
|
| 4364 |
+
Rocky_Coppinger
|
| 4365 |
+
Rod_Beck
|
| 4366 |
+
Roda_JC
|
| 4367 |
+
Rodney_Eyles
|
| 4368 |
+
Roermond
|
| 4369 |
+
Rogel_Nachum
|
| 4370 |
+
Roger_Black
|
| 4371 |
+
Roger_Chapman_(golfer)
|
| 4372 |
+
Roger_Clemens
|
| 4373 |
+
Roger_García_Junyent
|
| 4374 |
+
Roger_Kingdom
|
| 4375 |
+
Roger_Pavlik
|
| 4376 |
+
Rogers_Cup_(tennis)
|
| 4377 |
+
Rohan_Robinson
|
| 4378 |
+
Roland_Holder
|
| 4379 |
+
Rolf_Ekéus
|
| 4380 |
+
Rolf_Fringer
|
| 4381 |
+
Rolf_Sørensen
|
| 4382 |
+
Roman_Empire
|
| 4383 |
+
Romania
|
| 4384 |
+
Romania_national_football_team
|
| 4385 |
+
Romania_national_under-21_football_team
|
| 4386 |
+
Romanian_National_Unity_Party
|
| 4387 |
+
Romanians
|
| 4388 |
+
Romano_Prodi
|
| 4389 |
+
Rome
|
| 4390 |
+
Romesh_Kaluwitharana
|
| 4391 |
+
Ron_Wright_(baseball)
|
| 4392 |
+
Ronald_Brunmayr
|
| 4393 |
+
Ronald_Goldman
|
| 4394 |
+
Ronald_Hamming
|
| 4395 |
+
Ronald_Reagan
|
| 4396 |
+
Ronald_Waterreus
|
| 4397 |
+
Ronald_de_Boer
|
| 4398 |
+
Ronaldo
|
| 4399 |
+
Ronan_Rafferty
|
| 4400 |
+
Ronde_van_Nederland
|
| 4401 |
+
Ronnie_Irani
|
| 4402 |
+
Roosevelt_family
|
| 4403 |
+
Rory_Underwood
|
| 4404 |
+
Rosario,_Santa_Fe
|
| 4405 |
+
Rosario_Central
|
| 4406 |
+
Rose_Bowl_(stadium)
|
| 4407 |
+
Rose_Cheruiyot
|
| 4408 |
+
Rosenborg_BK
|
| 4409 |
+
Roshan_Mahanama
|
| 4410 |
+
Ross_County_F.C.
|
| 4411 |
+
Ross_McFarlane
|
| 4412 |
+
Ross_Perot
|
| 4413 |
+
Rostelecom
|
| 4414 |
+
Rotary_International
|
| 4415 |
+
Rotherham_United_F.C.
|
| 4416 |
+
Rotterdam
|
| 4417 |
+
Rottweiler
|
| 4418 |
+
Rovereto
|
| 4419 |
+
Rowanduz
|
| 4420 |
+
Roxbury,_Vermont
|
| 4421 |
+
Roy_Aitken
|
| 4422 |
+
Roy_Keane
|
| 4423 |
+
Royal_Antwerp_FC
|
| 4424 |
+
Royal_Boskalis_Westminster
|
| 4425 |
+
Royal_Clipper
|
| 4426 |
+
Royal_Free_Hospital
|
| 4427 |
+
Royal_Meteorological_Institute
|
| 4428 |
+
Royal_Tunbridge_Wells
|
| 4429 |
+
Royce_Clayton
|
| 4430 |
+
Rubber_Board
|
| 4431 |
+
Ruben_Kruger
|
| 4432 |
+
Rubens_Barrichello
|
| 4433 |
+
Rubén_Sierra
|
| 4434 |
+
Ruch_Chorzów
|
| 4435 |
+
Rudi_Vata
|
| 4436 |
+
Rudyard,_Montana
|
| 4437 |
+
Rugby_Football_Union
|
| 4438 |
+
Rugby_World_Cup
|
| 4439 |
+
Rugby_football
|
| 4440 |
+
Rugby_league
|
| 4441 |
+
Rugby_union
|
| 4442 |
+
Ruggiero_Rizzitelli
|
| 4443 |
+
Rui_Barros
|
| 4444 |
+
Rui_Correia
|
| 4445 |
+
Rui_Costa
|
| 4446 |
+
Rui_Madeira
|
| 4447 |
+
Rumbek
|
| 4448 |
+
Run_(baseball)
|
| 4449 |
+
Rupert_Murdoch
|
| 4450 |
+
Ruse,_Bulgaria
|
| 4451 |
+
Russ_Cochran
|
| 4452 |
+
Russell_Claydon
|
| 4453 |
+
Russia
|
| 4454 |
+
Russia_national_football_team
|
| 4455 |
+
Russian_Empire
|
| 4456 |
+
Russian_Trading_System
|
| 4457 |
+
Rusty_Greer
|
| 4458 |
+
Ruth_Perry
|
| 4459 |
+
Ruxandra_Dragomir
|
| 4460 |
+
Rwanda
|
| 4461 |
+
Ryder_Cup
|
| 4462 |
+
Ryne_Sandberg
|
| 4463 |
+
Ryszard_Wieczorek
|
| 4464 |
+
Ryutaro_Hashimoto
|
| 4465 |
+
Régine_Cavagnoud
|
| 4466 |
+
S&P_500
|
| 4467 |
+
S.C._Braga
|
| 4468 |
+
S.C._Espinho
|
| 4469 |
+
S.L._Benfica
|
| 4470 |
+
S.S.C._Napoli
|
| 4471 |
+
S.S._Lazio
|
| 4472 |
+
SBC_Communications
|
| 4473 |
+
SBM_Offshore
|
| 4474 |
+
SC_Bastia
|
| 4475 |
+
SC_Freiburg
|
| 4476 |
+
SC_Heerenveen
|
| 4477 |
+
SC_Tavriya_Simferopol
|
| 4478 |
+
SD_Compostela
|
| 4479 |
+
SEGRO
|
| 4480 |
+
SFC_Opava
|
| 4481 |
+
SIDOR
|
| 4482 |
+
SK_Brann
|
| 4483 |
+
SK_Dynamo_České_Budějovice
|
| 4484 |
+
SK_Rapid_Wien
|
| 4485 |
+
SK_Sigma_Olomouc
|
| 4486 |
+
SK_Sturm_Graz
|
| 4487 |
+
SNCF
|
| 4488 |
+
SPAL_1907
|
| 4489 |
+
SV_Ried
|
| 4490 |
+
SV_Werder_Bremen
|
| 4491 |
+
Sabina_Panzanini
|
| 4492 |
+
Sabine_Appelmans
|
| 4493 |
+
Sabine_Hack
|
| 4494 |
+
Sabri_Lamouchi
|
| 4495 |
+
Sachin_Tendulkar
|
| 4496 |
+
Sacramento_Kings
|
| 4497 |
+
Saddam_Hussein
|
| 4498 |
+
Saeb_Erekat
|
| 4499 |
+
Saeed_Anwar
|
| 4500 |
+
Saffet_Sancaklı
|
| 4501 |
+
Saint_Croix,_U.S._Virgin_Islands
|
| 4502 |
+
Saint_Nicholas
|
| 4503 |
+
Sakai,_Osaka
|
| 4504 |
+
Salah_Hissou
|
| 4505 |
+
Salang,_Afghanistan
|
| 4506 |
+
Sale_Grammar_School
|
| 4507 |
+
Sale_Sharks
|
| 4508 |
+
Saleem_Malik
|
| 4509 |
+
Sali_Berisha
|
| 4510 |
+
Sally_Barsosio
|
| 4511 |
+
Sally_Boyden_(cyclist)
|
| 4512 |
+
Salomon_Brothers
|
| 4513 |
+
Salzburg
|
| 4514 |
+
Sammy_Sosa
|
| 4515 |
+
Samson_Kitur
|
| 4516 |
+
Samsung_Heavy_Industries
|
| 4517 |
+
Samuel_Matete
|
| 4518 |
+
San_Antonio_Spurs
|
| 4519 |
+
San_Diego
|
| 4520 |
+
San_Diego_Chargers
|
| 4521 |
+
San_Diego_Padres
|
| 4522 |
+
San_Francisco
|
| 4523 |
+
San_Francisco_49ers
|
| 4524 |
+
San_Francisco_Giants
|
| 4525 |
+
San_Jose,_California
|
| 4526 |
+
San_Jose_Sharks
|
| 4527 |
+
San_José,_Costa_Rica
|
| 4528 |
+
San_Lorenzo_de_Almagro
|
| 4529 |
+
San_Marino
|
| 4530 |
+
San_Marino_national_football_team
|
| 4531 |
+
San_Mateo,_California
|
| 4532 |
+
Sanath_Jayasuriya
|
| 4533 |
+
Sandon_Stolle
|
| 4534 |
+
Sandra_Cacic
|
| 4535 |
+
Sandra_Cecchini
|
| 4536 |
+
Sandra_Kleinová
|
| 4537 |
+
Sandrine_Testud
|
| 4538 |
+
Sandusky,_Ohio
|
| 4539 |
+
Santa_Barbara,_California
|
| 4540 |
+
Santa_Claus
|
| 4541 |
+
Santiago,_Chile
|
| 4542 |
+
Santiago_Bernabéu_Stadium
|
| 4543 |
+
Santiago_de_Cuba
|
| 4544 |
+
Santos_FC
|
| 4545 |
+
Saqlain_Mushtaq
|
| 4546 |
+
Saracens_F.C.
|
| 4547 |
+
Sarah_Brady
|
| 4548 |
+
Sarah_Pitkowski-Malcor
|
| 4549 |
+
Sarah_Thorsett
|
| 4550 |
+
Sarajevo
|
| 4551 |
+
Sardinia
|
| 4552 |
+
Saskatchewan
|
| 4553 |
+
Saskatchewan_Wheat_Pool
|
| 4554 |
+
Satoshi_Higashi
|
| 4555 |
+
Sauber
|
| 4556 |
+
Saudi_Arabia
|
| 4557 |
+
Saudi_Press_Agency
|
| 4558 |
+
Saxony
|
| 4559 |
+
Scarborough_F.C.
|
| 4560 |
+
Schering_AG
|
| 4561 |
+
Scotland
|
| 4562 |
+
Scotland_national_football_team
|
| 4563 |
+
Scotland_national_rugby_union_team
|
| 4564 |
+
Scotland_national_under-21_football_team
|
| 4565 |
+
Scott_Brosius
|
| 4566 |
+
Scott_Draper
|
| 4567 |
+
Scott_Erickson
|
| 4568 |
+
Scott_Hoch
|
| 4569 |
+
Scott_Humphries
|
| 4570 |
+
Scott_McCarron
|
| 4571 |
+
Scott_McGrory
|
| 4572 |
+
Scott_Quinnell
|
| 4573 |
+
Scott_Russell_(motorcyclist)
|
| 4574 |
+
Scott_Sanders_(baseball)
|
| 4575 |
+
Scott_Young_(footballer)
|
| 4576 |
+
Scottish_Cup
|
| 4577 |
+
Scottish_Highlands
|
| 4578 |
+
Scottish_Labour_Party
|
| 4579 |
+
Scottish_League_Cup
|
| 4580 |
+
Scottish_National_Party
|
| 4581 |
+
Scottish_Premier_League
|
| 4582 |
+
Scuderia_Ferrari
|
| 4583 |
+
Scunthorpe_United_F.C.
|
| 4584 |
+
Sean_Berry
|
| 4585 |
+
Sean_Dundee
|
| 4586 |
+
Sean_Fitzpatrick
|
| 4587 |
+
Sean_Olsson
|
| 4588 |
+
Seattle
|
| 4589 |
+
Seattle_Mariners
|
| 4590 |
+
Seattle_Seahawks
|
| 4591 |
+
Seattle_SuperSonics
|
| 4592 |
+
Sebastian_Lindholm
|
| 4593 |
+
Sebastien_Tortelli
|
| 4594 |
+
Second_French_Empire
|
| 4595 |
+
Security_Council_of_Russia
|
| 4596 |
+
Senegal
|
| 4597 |
+
Seoul
|
| 4598 |
+
Sepp_Dostthaler
|
| 4599 |
+
Serbia
|
| 4600 |
+
Serbs
|
| 4601 |
+
Sergey_Alexandrovich_Makarov
|
| 4602 |
+
Sergey_Klevchenya
|
| 4603 |
+
Sergey_Yastrzhembsky
|
| 4604 |
+
Sergi_Barjuán
|
| 4605 |
+
Sergi_Bruguera
|
| 4606 |
+
Sergiyev_Posad
|
| 4607 |
+
Serhiy_Rebrov
|
| 4608 |
+
Serie_A
|
| 4609 |
+
Servais_Knaven
|
| 4610 |
+
Servet_Pëllumbi
|
| 4611 |
+
Servette_FC
|
| 4612 |
+
Severiano_Ballesteros
|
| 4613 |
+
Sevilla_FC
|
| 4614 |
+
Seville
|
| 4615 |
+
Seychelles
|
| 4616 |
+
Seychelles_national_football_team
|
| 4617 |
+
Shadab_Kabir
|
| 4618 |
+
Shahid_Afridi
|
| 4619 |
+
Shane_Kelly
|
| 4620 |
+
Shane_Reynolds
|
| 4621 |
+
Shane_Warne
|
| 4622 |
+
Shanghai
|
| 4623 |
+
Shannon_Airport
|
| 4624 |
+
Sharjah_(city)
|
| 4625 |
+
Sharjah_(emirate)
|
| 4626 |
+
Shatoy
|
| 4627 |
+
Shaun_Pollock
|
| 4628 |
+
Shaun_Young
|
| 4629 |
+
Shawn_Estes
|
| 4630 |
+
Shay_Given
|
| 4631 |
+
Shayne_King
|
| 4632 |
+
Sheffield
|
| 4633 |
+
Sheffield_Eagles
|
| 4634 |
+
Sheffield_Shield
|
| 4635 |
+
Sheffield_United_F.C.
|
| 4636 |
+
Sheffield_Wednesday_F.C.
|
| 4637 |
+
Sheikh_Hasina
|
| 4638 |
+
Shelbourne_F.C.
|
| 4639 |
+
Shell_Oil_Company
|
| 4640 |
+
Shell_Turbo_Chargers
|
| 4641 |
+
Shem_Kororia
|
| 4642 |
+
Sherwin_Campbell
|
| 4643 |
+
Shigeki_Maruyama
|
| 4644 |
+
Shimon_Peres
|
| 4645 |
+
Shinichi_Itoh
|
| 4646 |
+
Shining_Path
|
| 4647 |
+
Shiraz
|
| 4648 |
+
Shivnarine_Chanderpaul
|
| 4649 |
+
Shrewsbury_Town_F.C.
|
| 4650 |
+
Shu_Kamo
|
| 4651 |
+
Shuzo_Matsuoka
|
| 4652 |
+
Shwedagon_Pagoda
|
| 4653 |
+
Sialkot
|
| 4654 |
+
Siam_Commercial_Bank
|
| 4655 |
+
Sibiu_International_Airport
|
| 4656 |
+
Sicily
|
| 4657 |
+
Sidwell_Friends_School
|
| 4658 |
+
Sidya_Touré
|
| 4659 |
+
Sierakowice,_Pomeranian_Voivodeship
|
| 4660 |
+
Sierra_Leone
|
| 4661 |
+
Sierra_Leone_national_football_team
|
| 4662 |
+
Sierra_Nevada_(U.S.)
|
| 4663 |
+
Sigurd_Njerve
|
| 4664 |
+
Silicon_Valley
|
| 4665 |
+
Silke_Renk
|
| 4666 |
+
Silvia_Farina_Elia
|
| 4667 |
+
Silvio_Berlusconi
|
| 4668 |
+
Simon_Brown_(cricketer)
|
| 4669 |
+
Simon_Crafar
|
| 4670 |
+
Simon_Culhane
|
| 4671 |
+
Simon_Doull
|
| 4672 |
+
Simon_Parke
|
| 4673 |
+
Simone_Greiner-Petter-Memm
|
| 4674 |
+
Sinaloa
|
| 4675 |
+
Sindh_High_Court
|
| 4676 |
+
Singapore
|
| 4677 |
+
Singapore_International_Monetary_Exchange
|
| 4678 |
+
Singer_World_Series
|
| 4679 |
+
Sisters_of_Loreto
|
| 4680 |
+
Sivas
|
| 4681 |
+
Six_Nations_Championship
|
| 4682 |
+
Sjeng_Schalken
|
| 4683 |
+
Skeid_Fotball
|
| 4684 |
+
Skeleton_Canyon
|
| 4685 |
+
Skhirat
|
| 4686 |
+
Skopje
|
| 4687 |
+
Sky_Digital_(UK_&_Ireland)
|
| 4688 |
+
Slavia_Prague
|
| 4689 |
+
Sliema
|
| 4690 |
+
Slobodan_Milošević
|
| 4691 |
+
Slovakia
|
| 4692 |
+
Slovakia_national_football_team
|
| 4693 |
+
Slovenia
|
| 4694 |
+
Small_Is_Beautiful
|
| 4695 |
+
Social_Democratic_Party_(Japan)
|
| 4696 |
+
Social_Democratic_Party_(Romania)
|
| 4697 |
+
Social_Democratic_Party_of_Germany
|
| 4698 |
+
Socialist_Federal_Republic_of_Yugoslavia
|
| 4699 |
+
Socialist_Party_of_Albania
|
| 4700 |
+
Socialist_Party_of_Serbia
|
| 4701 |
+
Sociedade_Esportiva_Palmeiras
|
| 4702 |
+
Sofia
|
| 4703 |
+
SoftBank
|
| 4704 |
+
Sokoto
|
| 4705 |
+
Solidere
|
| 4706 |
+
Somalia
|
| 4707 |
+
Somerset_County_Cricket_Club
|
| 4708 |
+
Son_Sen
|
| 4709 |
+
Sonora
|
| 4710 |
+
Sophia_Loren
|
| 4711 |
+
Sourav_Ganguly
|
| 4712 |
+
South_Africa
|
| 4713 |
+
South_Africa_national_cricket_team
|
| 4714 |
+
South_Africa_national_field_hockey_team
|
| 4715 |
+
South_Africa_national_rugby_union_team
|
| 4716 |
+
South_African_Breweries
|
| 4717 |
+
South_America
|
| 4718 |
+
South_China_Morning_Post
|
| 4719 |
+
South_Dakota
|
| 4720 |
+
South_Island
|
| 4721 |
+
South_Kivu
|
| 4722 |
+
South_Korea
|
| 4723 |
+
South_Lebanon_Army
|
| 4724 |
+
South_Queensland_Crushers
|
| 4725 |
+
South_Sydney_Rabbitohs
|
| 4726 |
+
South_Yemen
|
| 4727 |
+
Southampton
|
| 4728 |
+
Southampton_F.C.
|
| 4729 |
+
Southeast_Asia
|
| 4730 |
+
Southend_United_F.C.
|
| 4731 |
+
Southern_California_Open
|
| 4732 |
+
Southern_Illinois_University_Carbondale
|
| 4733 |
+
Southern_New_England_Telecommunications
|
| 4734 |
+
Soviet_Union
|
| 4735 |
+
Spain
|
| 4736 |
+
Spain_Fed_Cup_team
|
| 4737 |
+
Spanish_language
|
| 4738 |
+
Spanish_people
|
| 4739 |
+
Sparta_Prague
|
| 4740 |
+
Sparta_Rotterdam
|
| 4741 |
+
Speed_Skating_World_Cup
|
| 4742 |
+
Spetses
|
| 4743 |
+
Spirou_Charleroi
|
| 4744 |
+
Split_(city)
|
| 4745 |
+
Sport_Club_Corinthians_Paulista
|
| 4746 |
+
Sport_Club_Internacional
|
| 4747 |
+
Sport_Club_do_Recife
|
| 4748 |
+
Sporting_Clube_de_Portugal
|
| 4749 |
+
Sporting_de_Gijón
|
| 4750 |
+
Sprague,_Manitoba
|
| 4751 |
+
Springfield,_Massachusetts
|
| 4752 |
+
Srebrenica
|
| 4753 |
+
Sri_Lanka
|
| 4754 |
+
Sri_Lanka_national_cricket_team
|
| 4755 |
+
Sri_Lankan_Tamil_people
|
| 4756 |
+
Srinagar
|
| 4757 |
+
St._Albans_(city),_Vermont
|
| 4758 |
+
St._Gallen
|
| 4759 |
+
St._George_Dragons
|
| 4760 |
+
St._George_Illawarra_Dragons
|
| 4761 |
+
St._Johnstone_F.C.
|
| 4762 |
+
St._Leger_Stakes
|
| 4763 |
+
St._Louis,_Missouri
|
| 4764 |
+
St._Louis_Blues_(ice_hockey)
|
| 4765 |
+
St._Louis_Cardinals
|
| 4766 |
+
St._Mirren_F.C.
|
| 4767 |
+
St._Petersburg,_Florida
|
| 4768 |
+
St_Albans_City_F.C.
|
| 4769 |
+
St_Helens,_Merseyside
|
| 4770 |
+
St_Helens_RLFC
|
| 4771 |
+
St_Kilda_Football_Club
|
| 4772 |
+
Stabæk_Fotball
|
| 4773 |
+
Stade_Malherbe_Caen
|
| 4774 |
+
Stade_Rennais_F.C.
|
| 4775 |
+
Stagecoach_Group
|
| 4776 |
+
Standard_&_Poor's
|
| 4777 |
+
Standard_Liège
|
| 4778 |
+
Stansted_Mountfitchet
|
| 4779 |
+
Staouéli
|
| 4780 |
+
State_Council_of_the_People's_Republic_of_China
|
| 4781 |
+
State_of_Palestine
|
| 4782 |
+
Statistics_Canada
|
| 4783 |
+
Statoil
|
| 4784 |
+
Stefaan_De_Clerck
|
| 4785 |
+
Stefan_Edberg
|
| 4786 |
+
Stefan_Johansson
|
| 4787 |
+
Stefan_Kuntz
|
| 4788 |
+
Stefan_Reuter
|
| 4789 |
+
Stefan_Schwarz
|
| 4790 |
+
Stefano_Pescosolido
|
| 4791 |
+
Stefano_Tilli
|
| 4792 |
+
Stefano_Zanini
|
| 4793 |
+
Steffen_Freund
|
| 4794 |
+
Steffi_Graf
|
| 4795 |
+
Stefka_Kostadinova
|
| 4796 |
+
Stenhousemuir_F.C.
|
| 4797 |
+
Stephan_Marasek
|
| 4798 |
+
Stephanie_Storp
|
| 4799 |
+
Stephen_Ames
|
| 4800 |
+
Stephen_Brown_(athlete)
|
| 4801 |
+
Stephen_McAllister
|
| 4802 |
+
Stephen_Pate
|
| 4803 |
+
Stephenville_International_Airport
|
| 4804 |
+
Steptoe_&_Johnson
|
| 4805 |
+
Sterling_Hitchcock
|
| 4806 |
+
Steve_Backley
|
| 4807 |
+
Steve_Finley
|
| 4808 |
+
Steve_Howey_(footballer)
|
| 4809 |
+
Steve_Jones_(golfer)
|
| 4810 |
+
Steve_McManaman
|
| 4811 |
+
Steve_Redgrave
|
| 4812 |
+
Steve_Staunton
|
| 4813 |
+
Steve_Stricker
|
| 4814 |
+
Steve_Waugh
|
| 4815 |
+
Steve_Webster
|
| 4816 |
+
Steve_van_Vuuren
|
| 4817 |
+
Stevenage_F.C.
|
| 4818 |
+
Stewart_Ginn
|
| 4819 |
+
Steyr
|
| 4820 |
+
Stirling
|
| 4821 |
+
Stirling_Albion_F.C.
|
| 4822 |
+
Stockholm
|
| 4823 |
+
Stockport_County_F.C.
|
| 4824 |
+
Stoke_City_F.C.
|
| 4825 |
+
Straits_of_Florida
|
| 4826 |
+
Stranraer
|
| 4827 |
+
Stranraer_F.C.
|
| 4828 |
+
Strasbourg
|
| 4829 |
+
Strobe_Talbott
|
| 4830 |
+
Stuart_Appleby
|
| 4831 |
+
Stuart_Cage
|
| 4832 |
+
Stuart_Law
|
| 4833 |
+
Stuart_McCall
|
| 4834 |
+
Stung_Treng
|
| 4835 |
+
Stuttgart
|
| 4836 |
+
Stuttgart_Airport
|
| 4837 |
+
Stéphane_Chapuisat
|
| 4838 |
+
Stéphane_Guivarc'h
|
| 4839 |
+
Stéphane_Henchoz
|
| 4840 |
+
Stéphane_Ortelli
|
| 4841 |
+
Stéphane_Simian
|
| 4842 |
+
Subaru
|
| 4843 |
+
Subaru_Impreza
|
| 4844 |
+
Subaru_Impreza_WRX_STI
|
| 4845 |
+
Subaru_World_Rally_Team
|
| 4846 |
+
Sud-PTT
|
| 4847 |
+
Sudan
|
| 4848 |
+
Sudan_Airways
|
| 4849 |
+
Sudan_national_football_team
|
| 4850 |
+
Sudbury_Town_F.C.
|
| 4851 |
+
Suharto
|
| 4852 |
+
Sui_Southern_Gas_Company
|
| 4853 |
+
Sulaymaniyah
|
| 4854 |
+
Sultan,_Crown_Prince_of_Saudi_Arabia
|
| 4855 |
+
Summer_Olympic_Games
|
| 4856 |
+
SunGard
|
| 4857 |
+
Sun_Jun_(badminton)
|
| 4858 |
+
Sun_Microsystems
|
| 4859 |
+
Sunday_Bada
|
| 4860 |
+
Sunderland_A.F.C.
|
| 4861 |
+
Super_League
|
| 4862 |
+
Supercopa_de_España
|
| 4863 |
+
Supercoppa_Italiana
|
| 4864 |
+
Superman_(film)
|
| 4865 |
+
Supreme_Court_of_Florida
|
| 4866 |
+
Supreme_Court_of_New_South_Wales
|
| 4867 |
+
Supreme_Court_of_the_Republic_of_China
|
| 4868 |
+
Supreme_Court_of_the_United_States
|
| 4869 |
+
Supreme_Federal_Court
|
| 4870 |
+
Surabaya
|
| 4871 |
+
Suraj_Bhan
|
| 4872 |
+
Suriname
|
| 4873 |
+
Surrey
|
| 4874 |
+
Surrey_County_Cricket_Club
|
| 4875 |
+
Surčin
|
| 4876 |
+
Susan_Roosevelt_Weld
|
| 4877 |
+
Susi_Susanti
|
| 4878 |
+
Sussex_County_Cricket_Club
|
| 4879 |
+
Suwon_Samsung_Bluewings
|
| 4880 |
+
Suzuka_Circuit
|
| 4881 |
+
Suzuki
|
| 4882 |
+
Sven_Fischer
|
| 4883 |
+
Sven_Nylander
|
| 4884 |
+
Sven_Pieters
|
| 4885 |
+
Sven_Strüver
|
| 4886 |
+
Svetlana_Masterkova
|
| 4887 |
+
Svetlana_Paramygina
|
| 4888 |
+
Svetlana_Zalevskaya
|
| 4889 |
+
Swansea_City_A.F.C.
|
| 4890 |
+
Swansea_RFC
|
| 4891 |
+
Sweden
|
| 4892 |
+
Sweden_men's_national_ice_hockey_team
|
| 4893 |
+
Sweden_national_football_team
|
| 4894 |
+
Swerford
|
| 4895 |
+
Swindon_Town_F.C.
|
| 4896 |
+
Swiss_Bank_Corporation
|
| 4897 |
+
Switzerland
|
| 4898 |
+
Switzerland_national_football_team
|
| 4899 |
+
Sydney
|
| 4900 |
+
Sydney_Cricket_Ground
|
| 4901 |
+
Sydney_Roosters
|
| 4902 |
+
Sydney_Swans
|
| 4903 |
+
Sylvain_Bouchard
|
| 4904 |
+
Sylvester_Stallone
|
| 4905 |
+
Syria
|
| 4906 |
+
Syria_national_football_team
|
| 4907 |
+
São_Paulo
|
| 4908 |
+
São_Paulo_(state)
|
| 4909 |
+
São_Paulo_FC
|
| 4910 |
+
Sébastien_Foucras
|
| 4911 |
+
Sébastien_Fournier
|
| 4912 |
+
Sébastien_Lareau
|
| 4913 |
+
Sérgio_Conceição
|
| 4914 |
+
Sören_Lausberg
|
| 4915 |
+
Søren_Jessen-Petersen
|
| 4916 |
+
Süddeutsche_Zeitung
|
| 4917 |
+
Süleyman_Demirel
|
| 4918 |
+
Sławomir_Wojciechowski
|
| 4919 |
+
T-72
|
| 4920 |
+
TSV_1860_München
|
| 4921 |
+
TVM_(cycling_team)
|
| 4922 |
+
TV_Guide
|
| 4923 |
+
Ta_Mok
|
| 4924 |
+
Tadayuki_Okada
|
| 4925 |
+
Tae_Satoya
|
| 4926 |
+
Taibe,_Galilee
|
| 4927 |
+
Taipei
|
| 4928 |
+
Taiwan
|
| 4929 |
+
Taiwan_Strait
|
| 4930 |
+
Tajikistan
|
| 4931 |
+
Takanobu_Okabe
|
| 4932 |
+
Takuma_Aoki
|
| 4933 |
+
Takuya_Takagi
|
| 4934 |
+
Taliban
|
| 4935 |
+
Tallahassee,_Florida
|
| 4936 |
+
Tallinn
|
| 4937 |
+
Tamaulipas
|
| 4938 |
+
Tami_Whitlinger
|
| 4939 |
+
Tamil_Eelam_Liberation_Organization
|
| 4940 |
+
Tamil_Nadu
|
| 4941 |
+
Tamil_people
|
| 4942 |
+
Tampa_Bay_Buccaneers
|
| 4943 |
+
Tampa_Bay_Lightning
|
| 4944 |
+
Tampere
|
| 4945 |
+
Tampico,_Tamaulipas
|
| 4946 |
+
Tando_Allahyar
|
| 4947 |
+
Tang_Jiaxuan
|
| 4948 |
+
Tanja_Damaske
|
| 4949 |
+
Tanjug
|
| 4950 |
+
Tanjung_Priok
|
| 4951 |
+
Tansu_Çiller
|
| 4952 |
+
Tanya_Dubnicoff
|
| 4953 |
+
Tanzania
|
| 4954 |
+
Tanzania_national_football_team
|
| 4955 |
+
Tarek_Jabban
|
| 4956 |
+
Tariq_Aziz
|
| 4957 |
+
Tarmac_(company)
|
| 4958 |
+
Tarpon_Springs,_Florida
|
| 4959 |
+
Tartus
|
| 4960 |
+
Tasmania
|
| 4961 |
+
Tasmanian_Tigers
|
| 4962 |
+
Tatarstan
|
| 4963 |
+
Tatiana_Stiajkina
|
| 4964 |
+
Tatjana_Mittermayer
|
| 4965 |
+
Tatyana_Babashkina
|
| 4966 |
+
Tauranga
|
| 4967 |
+
Tavildara
|
| 4968 |
+
Tayfun_Korkut
|
| 4969 |
+
Tea_Vikstedt-Nyman
|
| 4970 |
+
Team_Polti
|
| 4971 |
+
Teddy_Sheringham
|
| 4972 |
+
Teemu_Selänne
|
| 4973 |
+
Tegla_Loroupe
|
| 4974 |
+
Tegucigalpa
|
| 4975 |
+
Tehran
|
| 4976 |
+
Tel_Aviv
|
| 4977 |
+
Telegraph_Agency_of_the_Soviet_Union
|
| 4978 |
+
Televisa
|
| 4979 |
+
Television_New_Zealand
|
| 4980 |
+
Telfer_Mine
|
| 4981 |
+
Telkom_Indonesia
|
| 4982 |
+
Telmex
|
| 4983 |
+
Telstra
|
| 4984 |
+
Tempe,_Arizona
|
| 4985 |
+
Ten_Commandments
|
| 4986 |
+
Tennessee
|
| 4987 |
+
Tennessee_Titans
|
| 4988 |
+
Teresa
|
| 4989 |
+
Terry_Kennedy
|
| 4990 |
+
Terry_Mulholland
|
| 4991 |
+
Terry_Pendleton
|
| 4992 |
+
Terry_Phelan
|
| 4993 |
+
Terry_Price_(golfer)
|
| 4994 |
+
Terry_Steinbach
|
| 4995 |
+
Texas
|
| 4996 |
+
Texas_Panhandle
|
| 4997 |
+
Texas_Rangers_(baseball)
|
| 4998 |
+
Thabo_Mbeki
|
| 4999 |
+
Thai_Nation_Party
|
| 5000 |
+
Thailand
|
| 5001 |
+
The_Ashes
|
| 5002 |
+
The_Bahamas
|
| 5003 |
+
The_Bank_of_Tokyo-Mitsubishi_UFJ
|
| 5004 |
+
The_Conference_Board
|
| 5005 |
+
The_Crying_Game
|
| 5006 |
+
The_Daily_Telegraph_(Australia)
|
| 5007 |
+
The_Hague
|
| 5008 |
+
The_Holocaust
|
| 5009 |
+
The_Irish_Times
|
| 5010 |
+
The_Jakarta_Post
|
| 5011 |
+
The_Jerusalem_Post
|
| 5012 |
+
The_Jordan_Times
|
| 5013 |
+
The_Lancet
|
| 5014 |
+
The_Land_is_Ours
|
| 5015 |
+
The_Miami_Herald
|
| 5016 |
+
The_Nation
|
| 5017 |
+
The_New_Saints_F.C.
|
| 5018 |
+
The_New_York_Times
|
| 5019 |
+
The_Open_Championship
|
| 5020 |
+
The_Oval
|
| 5021 |
+
The_Pentagon
|
| 5022 |
+
The_Statesman
|
| 5023 |
+
The_Sumitomo_Bank
|
| 5024 |
+
The_Sun_(United_Kingdom)
|
| 5025 |
+
The_Sunday_Telegraph
|
| 5026 |
+
The_Times
|
| 5027 |
+
The_Vancouver_Sun
|
| 5028 |
+
The_Wall_Street_Journal
|
| 5029 |
+
The_Walt_Disney_Company
|
| 5030 |
+
The_Washington_Post
|
| 5031 |
+
Theodore_Roosevelt
|
| 5032 |
+
Theodoros_Pangalos
|
| 5033 |
+
Thessaloniki
|
| 5034 |
+
Thierry_Henry
|
| 5035 |
+
Thomas_Bjørn
|
| 5036 |
+
Thomas_Bscher
|
| 5037 |
+
Thomas_Enqvist
|
| 5038 |
+
Thomas_Helmer
|
| 5039 |
+
Thomas_Häßler
|
| 5040 |
+
Thomas_Johansson
|
| 5041 |
+
Thomas_Muster
|
| 5042 |
+
Thomas_Rådström
|
| 5043 |
+
Thomas_Seeliger
|
| 5044 |
+
Thomas_Sobotzik
|
| 5045 |
+
Thomas_Stickroth
|
| 5046 |
+
Thomas_Strunz
|
| 5047 |
+
Thomas_Stuer-Lauridsen
|
| 5048 |
+
Thunder_Bay
|
| 5049 |
+
Tiananmen_Square
|
| 5050 |
+
Tianjin
|
| 5051 |
+
Tibet
|
| 5052 |
+
Tiburones_Rojos_de_Veracruz
|
| 5053 |
+
Tiger_Woods
|
| 5054 |
+
Tignes
|
| 5055 |
+
Tijani_Babangida
|
| 5056 |
+
Tijuana
|
| 5057 |
+
Tim_Belcher
|
| 5058 |
+
Tim_Forsyth
|
| 5059 |
+
Tim_Hancock
|
| 5060 |
+
Tim_Henman
|
| 5061 |
+
Tim_Herron
|
| 5062 |
+
Tim_Horan
|
| 5063 |
+
Tim_Lobinger
|
| 5064 |
+
Tim_Munton
|
| 5065 |
+
Tim_Simpson
|
| 5066 |
+
Tim_Stimpson
|
| 5067 |
+
Tim_Wakefield
|
| 5068 |
+
Timişoara
|
| 5069 |
+
Tina_Križan
|
| 5070 |
+
Tino_Martinez
|
| 5071 |
+
Tirana
|
| 5072 |
+
Todd_Hollandsworth
|
| 5073 |
+
Todd_Martin
|
| 5074 |
+
Todd_Stottlemyre
|
| 5075 |
+
Todd_Van_Poppel
|
| 5076 |
+
Todd_Woodbridge
|
| 5077 |
+
Todd_Worrell
|
| 5078 |
+
Todor_Zhivkov
|
| 5079 |
+
Toftir
|
| 5080 |
+
Togo
|
| 5081 |
+
Togo_national_football_team
|
| 5082 |
+
Tokyo
|
| 5083 |
+
Tokyo_Stock_Exchange
|
| 5084 |
+
Toledo,_Ohio
|
| 5085 |
+
Tolunay_Kafkas
|
| 5086 |
+
Tom_Boyd_(footballer)
|
| 5087 |
+
Tom_Candiotti
|
| 5088 |
+
Tom_Cruise
|
| 5089 |
+
Tom_Daschle
|
| 5090 |
+
Tom_Glavine
|
| 5091 |
+
Tom_Ikimi
|
| 5092 |
+
Tom_Johnson_(boxer)
|
| 5093 |
+
Tom_Kiernan
|
| 5094 |
+
Tom_Lehman
|
| 5095 |
+
Tom_Moody
|
| 5096 |
+
Tom_Nyariki
|
| 5097 |
+
Tom_Pagnozzi
|
| 5098 |
+
Tom_Pukstys
|
| 5099 |
+
Tom_Steels
|
| 5100 |
+
Tom_Watson_(golfer)
|
| 5101 |
+
Tomasz_Moskal
|
| 5102 |
+
Tommy_Haas
|
| 5103 |
+
Tommy_Martyn
|
| 5104 |
+
Tommy_Thompson
|
| 5105 |
+
Tomás_Carbonell
|
| 5106 |
+
Tonga
|
| 5107 |
+
Toni_Polster
|
| 5108 |
+
Tony_Adams_(footballer)
|
| 5109 |
+
Tony_Blair
|
| 5110 |
+
Tony_Cascarino
|
| 5111 |
+
Tony_Clark
|
| 5112 |
+
Tony_Eusebio
|
| 5113 |
+
Tony_Greig
|
| 5114 |
+
Tony_Jarrett
|
| 5115 |
+
Tony_Johnstone
|
| 5116 |
+
Tony_P._Hall
|
| 5117 |
+
Tony_Roche
|
| 5118 |
+
Tony_Siragusa
|
| 5119 |
+
Tony_Underwood
|
| 5120 |
+
Tony_Vairelles
|
| 5121 |
+
Toomas_Savi
|
| 5122 |
+
Topoľčany
|
| 5123 |
+
Tops_Markets_LLC
|
| 5124 |
+
Torino_F.C.
|
| 5125 |
+
Toronto
|
| 5126 |
+
Toronto_Blue_Jays
|
| 5127 |
+
Toronto_Maple_Leafs
|
| 5128 |
+
Toronto_Raptors
|
| 5129 |
+
Toros_Neza
|
| 5130 |
+
Torquay_United_F.C.
|
| 5131 |
+
Torrance_Zellner
|
| 5132 |
+
Tottenham_Hotspur_F.C.
|
| 5133 |
+
Tour_de_France
|
| 5134 |
+
Tour_de_Suisse
|
| 5135 |
+
Towers_Perrin
|
| 5136 |
+
Toyota
|
| 5137 |
+
Toyota_Australia
|
| 5138 |
+
Toyota_Celica
|
| 5139 |
+
Tranmere_Rovers_F.C.
|
| 5140 |
+
Trans_World_Airlines
|
| 5141 |
+
Transcendental_Meditation
|
| 5142 |
+
Transvaal_Province
|
| 5143 |
+
Transylvania
|
| 5144 |
+
Travis_Fryman
|
| 5145 |
+
Treaty_of_Baden
|
| 5146 |
+
Trenidad_Hubbard
|
| 5147 |
+
Trent_Bridge
|
| 5148 |
+
Treorchy_RFC
|
| 5149 |
+
Trevor_Dodds
|
| 5150 |
+
Trincomalee
|
| 5151 |
+
Trinidad
|
| 5152 |
+
Tripoli,_Lebanon
|
| 5153 |
+
Tristan_Hoffman
|
| 5154 |
+
Troy,_Tennessee
|
| 5155 |
+
Troy_Corser
|
| 5156 |
+
Troy_Vincent
|
| 5157 |
+
Tubmanburg
|
| 5158 |
+
Tunceli_Province
|
| 5159 |
+
Tunis
|
| 5160 |
+
Tunisia
|
| 5161 |
+
Tunisia_national_football_team
|
| 5162 |
+
Turin
|
| 5163 |
+
Turkey_national_football_team
|
| 5164 |
+
Turkish_Armed_Forces
|
| 5165 |
+
Turkish_Cypriots
|
| 5166 |
+
Turnhout
|
| 5167 |
+
Tuscany
|
| 5168 |
+
Tutsi
|
| 5169 |
+
Tuzla
|
| 5170 |
+
Twickenham_Stadium
|
| 5171 |
+
Twyford_Down
|
| 5172 |
+
Ty_Detmer
|
| 5173 |
+
Tychy
|
| 5174 |
+
Tyler_Houston
|
| 5175 |
+
Tyrrell_Racing
|
| 5176 |
+
Tórshavn
|
| 5177 |
+
Túlio_Costa
|
| 5178 |
+
U.C._Sampdoria
|
| 5179 |
+
U.S._Bank_Championship_in_Milwaukee
|
| 5180 |
+
U.S._Città_di_Palermo
|
| 5181 |
+
U.S._Cremonese
|
| 5182 |
+
U.S._Lecce
|
| 5183 |
+
U.S._Open_(golf)
|
| 5184 |
+
U._Chandana
|
| 5185 |
+
UBS
|
| 5186 |
+
UCI_Road_World_Cup
|
| 5187 |
+
UD_Salamanca
|
| 5188 |
+
UEFA
|
| 5189 |
+
UEFA_Champions_League
|
| 5190 |
+
UEFA_Cup_Winners'_Cup
|
| 5191 |
+
UEFA_Euro_1992
|
| 5192 |
+
UEFA_Euro_1996
|
| 5193 |
+
UEFA_Europa_League
|
| 5194 |
+
UEFA_European_Football_Championship
|
| 5195 |
+
UEFA_Intertoto_Cup
|
| 5196 |
+
UNITA
|
| 5197 |
+
USS_Carl_Vinson_(CVN-70)
|
| 5198 |
+
USS_Enterprise_(CVN-65)
|
| 5199 |
+
USTA_Billie_Jean_King_National_Tennis_Center
|
| 5200 |
+
US_Airways
|
| 5201 |
+
US_Open_(tennis)
|
| 5202 |
+
Udinese_Calcio
|
| 5203 |
+
Uganda
|
| 5204 |
+
Uganda_national_football_team
|
| 5205 |
+
Ujjain
|
| 5206 |
+
Ukraine
|
| 5207 |
+
Ukraine_national_football_team
|
| 5208 |
+
Ukyo_Katayama
|
| 5209 |
+
Ulan_Bator
|
| 5210 |
+
Ulf_Kirsten
|
| 5211 |
+
Ulsan
|
| 5212 |
+
Ulsan_Hyundai_FC
|
| 5213 |
+
Ulysses_S._Grant
|
| 5214 |
+
Umberto_Bossi
|
| 5215 |
+
Umbria
|
| 5216 |
+
Umkomaas
|
| 5217 |
+
Umm_Qasr
|
| 5218 |
+
Unified_Communist_Party_of_Nepal_(Maoist)
|
| 5219 |
+
Union_Bank_of_Switzerland
|
| 5220 |
+
Union_Luxembourg
|
| 5221 |
+
United_Arab_Emirates
|
| 5222 |
+
United_Arab_Emirates_national_football_team
|
| 5223 |
+
United_Daughters_of_the_Confederacy
|
| 5224 |
+
United_Kingdom
|
| 5225 |
+
United_Liberation_Movement_of_Liberia_for_Democracy_–_Johnson_faction
|
| 5226 |
+
United_National_Party
|
| 5227 |
+
United_Nations
|
| 5228 |
+
United_Nations_Commission_on_Human_Rights
|
| 5229 |
+
United_Nations_High_Commissioner_for_Refugees
|
| 5230 |
+
United_Nations_Interim_Force_in_Lebanon
|
| 5231 |
+
United_Nations_Security_Council
|
| 5232 |
+
United_Nations_Special_Commission
|
| 5233 |
+
United_News_of_India
|
| 5234 |
+
United_States
|
| 5235 |
+
United_States_Air_Force
|
| 5236 |
+
United_States_Amateur_Championship_(golf)
|
| 5237 |
+
United_States_Army
|
| 5238 |
+
United_States_Congress
|
| 5239 |
+
United_States_Court_of_Appeals_for_the_Fourth_Circuit
|
| 5240 |
+
United_States_Department_of_Agriculture
|
| 5241 |
+
United_States_Department_of_Commerce
|
| 5242 |
+
United_States_Department_of_Defense
|
| 5243 |
+
United_States_Department_of_State
|
| 5244 |
+
United_States_Department_of_the_Treasury
|
| 5245 |
+
United_States_Fed_Cup_team
|
| 5246 |
+
United_States_Marine_Corps
|
| 5247 |
+
United_States_Navy
|
| 5248 |
+
United_States_Senate_Committee_on_Armed_Services
|
| 5249 |
+
United_States_Senate_Select_Committee_on_Intelligence
|
| 5250 |
+
United_States_Tennis_Association
|
| 5251 |
+
United_States_Treasury_security
|
| 5252 |
+
United_States_courts_of_appeals
|
| 5253 |
+
United_States_district_court
|
| 5254 |
+
United_States_dollar
|
| 5255 |
+
United_States_men's_national_soccer_team
|
| 5256 |
+
University_of_Michigan
|
| 5257 |
+
University_of_Oklahoma
|
| 5258 |
+
University_of_Oxford
|
| 5259 |
+
University_of_Pennsylvania
|
| 5260 |
+
University_of_Yangon
|
| 5261 |
+
University_of_the_Witwatersrand
|
| 5262 |
+
Unión_de_Santa_Fe
|
| 5263 |
+
Uppsala
|
| 5264 |
+
Uppsala_University_Hospital
|
| 5265 |
+
Upul_Chandana
|
| 5266 |
+
Ural_Mountains
|
| 5267 |
+
Uruguay
|
| 5268 |
+
Urus-Martan
|
| 5269 |
+
Utah
|
| 5270 |
+
Utah_Jazz
|
| 5271 |
+
Uttar_Pradesh
|
| 5272 |
+
Uyo
|
| 5273 |
+
Uzbekistan
|
| 5274 |
+
Uzbekistan_national_football_team
|
| 5275 |
+
Uzi
|
| 5276 |
+
V.C._Eendracht_Aalst_2002
|
| 5277 |
+
Vadim_Sashurin
|
| 5278 |
+
Vaduz
|
| 5279 |
+
Vail,_Colorado
|
| 5280 |
+
Valdo_Filho
|
| 5281 |
+
Vale_(mining_company)
|
| 5282 |
+
Valencia,_Spain
|
| 5283 |
+
Valencia_CF
|
| 5284 |
+
Valentina_Fedyushina
|
| 5285 |
+
Valero_Energy_Corporation
|
| 5286 |
+
Valero_Texas_Open
|
| 5287 |
+
Valletta
|
| 5288 |
+
Valletta_F.C.
|
| 5289 |
+
Vampeta
|
| 5290 |
+
Van,_Turkey
|
| 5291 |
+
Vancouver
|
| 5292 |
+
Vancouver_Canucks
|
| 5293 |
+
Vanderbijlpark
|
| 5294 |
+
Variety_(magazine)
|
| 5295 |
+
Vasas_SC
|
| 5296 |
+
Vatican_City
|
| 5297 |
+
Vatican_Library
|
| 5298 |
+
Vavuniya
|
| 5299 |
+
Veliko_Tarnovo
|
| 5300 |
+
Velten
|
| 5301 |
+
Venezuela
|
| 5302 |
+
Venice
|
| 5303 |
+
Venice_Film_Festival
|
| 5304 |
+
Venkatesh_Prasad
|
| 5305 |
+
Venray
|
| 5306 |
+
Ventura,_California
|
| 5307 |
+
VeriSign
|
| 5308 |
+
Verona
|
| 5309 |
+
Veronica_Brenner
|
| 5310 |
+
VfB_Stuttgart
|
| 5311 |
+
VfL_Bochum
|
| 5312 |
+
Viacom_(1971–2005)
|
| 5313 |
+
Viatcheslav_Ekimov
|
| 5314 |
+
Vicente_Solano_Lima
|
| 5315 |
+
Vicenza_Calcio
|
| 5316 |
+
Victor_Babeş
|
| 5317 |
+
Victoria_(Australia)
|
| 5318 |
+
Victoria_Falls,_Zimbabwe
|
| 5319 |
+
Victorian_Bushrangers
|
| 5320 |
+
Vidadi_Rzayev
|
| 5321 |
+
Videoton_FC
|
| 5322 |
+
Vienna
|
| 5323 |
+
Vietnam
|
| 5324 |
+
Vietnam_War
|
| 5325 |
+
Viking_FK
|
| 5326 |
+
Viktor_Chernomyrdin
|
| 5327 |
+
Viktor_Paço
|
| 5328 |
+
Ville_Peltonen
|
| 5329 |
+
Vince_Lombardi
|
| 5330 |
+
Vince_Spadea
|
| 5331 |
+
Vince_Wells
|
| 5332 |
+
Vinko_Marinović
|
| 5333 |
+
Vinny_Castilla
|
| 5334 |
+
Vinnytsia
|
| 5335 |
+
Vinod_Kambli
|
| 5336 |
+
Violeta_Chamorro
|
| 5337 |
+
Viorel_Ion
|
| 5338 |
+
Viorel_Moldovan
|
| 5339 |
+
Virakesari
|
| 5340 |
+
Virgilijus_Alekna
|
| 5341 |
+
Virginia
|
| 5342 |
+
Virginia_Ruano_Pascual
|
| 5343 |
+
Virginia_Tech_Hokies_football
|
| 5344 |
+
Virtus_Bologna
|
| 5345 |
+
Vitali_Smirnov
|
| 5346 |
+
Vitesse
|
| 5347 |
+
Vitória_S.C.
|
| 5348 |
+
Viva_Zapata!
|
| 5349 |
+
Vladimir_Dubrovshchik
|
| 5350 |
+
Vladimir_Zhirinovsky
|
| 5351 |
+
Vladimír_Mečiar
|
| 5352 |
+
Vladimír_Šmicer
|
| 5353 |
+
Vogue_(magazine)
|
| 5354 |
+
Volker_Rühe
|
| 5355 |
+
Volkswagen
|
| 5356 |
+
Volkswagen_Group
|
| 5357 |
+
Volkswagen_Passat
|
| 5358 |
+
Vtm
|
| 5359 |
+
Václav_Havel
|
| 5360 |
+
Václav_Klaus
|
| 5361 |
+
Vålerenga_Fotball
|
| 5362 |
+
Vénuste_Niyongabo
|
| 5363 |
+
Víctor_Sánchez
|
| 5364 |
+
Vítor_Baía
|
| 5365 |
+
WA_Reds
|
| 5366 |
+
WBUR
|
| 5367 |
+
WGC-Bridgestone_Invitational
|
| 5368 |
+
WSC_World_XI
|
| 5369 |
+
Waiau,_Canterbury
|
| 5370 |
+
Waitrose
|
| 5371 |
+
Wales
|
| 5372 |
+
Wales_national_football_team
|
| 5373 |
+
Wales_national_rugby_union_team
|
| 5374 |
+
Wales_national_under-21_football_team
|
| 5375 |
+
Walikale
|
| 5376 |
+
Wall_Street
|
| 5377 |
+
Wally_Joyner
|
| 5378 |
+
Wally_Whitehurst
|
| 5379 |
+
Walsall_F.C.
|
| 5380 |
+
Walter_Little_(rugby_player)
|
| 5381 |
+
Walter_Mondale
|
| 5382 |
+
Wang_Chen_(badminton)
|
| 5383 |
+
Wang_Shi-ting
|
| 5384 |
+
Waqar_Younis
|
| 5385 |
+
War_of_the_Spanish_Succession
|
| 5386 |
+
Warner_Bros.
|
| 5387 |
+
Warren_Buffett
|
| 5388 |
+
Warrington_Wolves
|
| 5389 |
+
Warsaw
|
| 5390 |
+
Warsaw_Pact
|
| 5391 |
+
Warwickshire_County_Cricket_Club
|
| 5392 |
+
Washington,_D.C.
|
| 5393 |
+
Washington_(U.S._state)
|
| 5394 |
+
Washington_Capitals
|
| 5395 |
+
Washington_Redskins
|
| 5396 |
+
Washington_Wizards
|
| 5397 |
+
Wasim_Akram
|
| 5398 |
+
Wataru_Yoshikawa
|
| 5399 |
+
Waterville,_Washington
|
| 5400 |
+
Watford_F.C.
|
| 5401 |
+
Watsonians_RFC
|
| 5402 |
+
Wayne_Ferreira
|
| 5403 |
+
Wayne_Riley
|
| 5404 |
+
Wayne_Westner
|
| 5405 |
+
Wednesday
|
| 5406 |
+
Wellington
|
| 5407 |
+
Wembley_Arena
|
| 5408 |
+
Wembley_Stadium
|
| 5409 |
+
Wen_Hui_Bao
|
| 5410 |
+
Wen_Wei_Po
|
| 5411 |
+
Wenatchee,_Washington
|
| 5412 |
+
Wenchang
|
| 5413 |
+
Wendy_Everson
|
| 5414 |
+
West_Azarbaijan_province
|
| 5415 |
+
West_Bengal
|
| 5416 |
+
West_Bromwich_Albion_F.C.
|
| 5417 |
+
West_Coast_Eagles
|
| 5418 |
+
West_Ham_United_F.C.
|
| 5419 |
+
West_Hartlepool_R.F.C.
|
| 5420 |
+
West_Indies_cricket_team
|
| 5421 |
+
West_South_Central_States
|
| 5422 |
+
West_Virginia
|
| 5423 |
+
Western_Australia
|
| 5424 |
+
Western_Bulldogs
|
| 5425 |
+
Western_Hemisphere
|
| 5426 |
+
Western_Province_cricket_team
|
| 5427 |
+
Western_Suburbs_Magpies
|
| 5428 |
+
Western_world
|
| 5429 |
+
Weston-super-Mare
|
| 5430 |
+
Whistler,_British_Columbia
|
| 5431 |
+
Whistler_Mountain
|
| 5432 |
+
White_House
|
| 5433 |
+
Whitehill_Welfare_F.C.
|
| 5434 |
+
Whitewater_controversy
|
| 5435 |
+
Whittier,_Alaska
|
| 5436 |
+
Widnes_Vikings
|
| 5437 |
+
Widzew_Łódź
|
| 5438 |
+
Wigan
|
| 5439 |
+
Wigan_Athletic_F.C.
|
| 5440 |
+
Wigan_Warriors
|
| 5441 |
+
Wilfried_Peeters
|
| 5442 |
+
Wilfried_Van_Moer
|
| 5443 |
+
Wilhelmina_of_the_Netherlands
|
| 5444 |
+
Will_Carling
|
| 5445 |
+
Willem_II_(football_club)
|
| 5446 |
+
William_Goldman
|
| 5447 |
+
William_Hill_(bookmaker)
|
| 5448 |
+
William_Jordan,_Baron_Jordan
|
| 5449 |
+
William_Perry
|
| 5450 |
+
William_Tanui
|
| 5451 |
+
William_Weld
|
| 5452 |
+
WilliamsF1
|
| 5453 |
+
Willie_Wood_(golfer)
|
| 5454 |
+
Wilson_Kipketer
|
| 5455 |
+
Wiltshire
|
| 5456 |
+
Wim_Jonk
|
| 5457 |
+
Wimbledon_Championships
|
| 5458 |
+
Wimbledon_F.C.
|
| 5459 |
+
Wincanton_Classic
|
| 5460 |
+
Windhoek
|
| 5461 |
+
Windows_95
|
| 5462 |
+
Windows_NT
|
| 5463 |
+
Windows_NT_4.0
|
| 5464 |
+
Winnipeg
|
| 5465 |
+
Winston_Bogarde
|
| 5466 |
+
Winston_Peters
|
| 5467 |
+
Wisconsin
|
| 5468 |
+
Wisła_Kraków
|
| 5469 |
+
Woking_F.C.
|
| 5470 |
+
Wolf_Point,_Montana
|
| 5471 |
+
Wolfgang_Feiersinger
|
| 5472 |
+
Wolfgang_Ischinger
|
| 5473 |
+
Wolverhampton_Wanderers_F.C.
|
| 5474 |
+
Woodridge,_Illinois
|
| 5475 |
+
Worcester
|
| 5476 |
+
Worcestershire_County_Cricket_Club
|
| 5477 |
+
Workington_Town
|
| 5478 |
+
World_Badminton_Grand_Prix
|
| 5479 |
+
World_Boxing_Organization
|
| 5480 |
+
World_Cup_of_Hockey
|
| 5481 |
+
World_Open
|
| 5482 |
+
World_Series
|
| 5483 |
+
World_Series_Cricket
|
| 5484 |
+
World_Series_of_Golf
|
| 5485 |
+
World_Trade_Organization
|
| 5486 |
+
World_War_II
|
| 5487 |
+
World_Wide_Web
|
| 5488 |
+
World_championship
|
| 5489 |
+
Worthing
|
| 5490 |
+
Wrexham_F.C.
|
| 5491 |
+
Wrocław
|
| 5492 |
+
Wuhan
|
| 5493 |
+
Wuxi
|
| 5494 |
+
Wyche_Fowler
|
| 5495 |
+
Wycombe_Wanderers_F.C.
|
| 5496 |
+
Wydad_Casablanca
|
| 5497 |
+
Xavier_Gravelaine
|
| 5498 |
+
Xhosa
|
| 5499 |
+
Xiao_Qiang
|
| 5500 |
+
Xinhua_News_Agency
|
| 5501 |
+
Xiomara_Rivero
|
| 5502 |
+
Xu_Nannan
|
| 5503 |
+
YMCA
|
| 5504 |
+
Yakoma_people
|
| 5505 |
+
Yamaha_Motor_Company
|
| 5506 |
+
Yangon
|
| 5507 |
+
Yangon_Technological_University
|
| 5508 |
+
Yap_Kim_Hock
|
| 5509 |
+
Yasser_Arafat
|
| 5510 |
+
Yassine_Abdellaoui
|
| 5511 |
+
Yasushi_Akashi
|
| 5512 |
+
Yasuto_Honda
|
| 5513 |
+
Yayuk_Basuki
|
| 5514 |
+
Ye_Zhaoying
|
| 5515 |
+
Yedioth_Ahronoth
|
| 5516 |
+
Yegor_Stroyev
|
| 5517 |
+
Yekaterina_Podkopayeva
|
| 5518 |
+
Yelena_Gulyayeva
|
| 5519 |
+
Yemen
|
| 5520 |
+
Yeosu
|
| 5521 |
+
Yerevan
|
| 5522 |
+
Yevgeny_Kafelnikov
|
| 5523 |
+
Yevgeny_Primakov
|
| 5524 |
+
Yingkou
|
| 5525 |
+
Yitzhak_Mordechai
|
| 5526 |
+
Yitzhak_Shamir
|
| 5527 |
+
Yoelbi_Quesada
|
| 5528 |
+
Yonhap
|
| 5529 |
+
Yonsei_University
|
| 5530 |
+
York
|
| 5531 |
+
York_City_F.C.
|
| 5532 |
+
Yorkshire
|
| 5533 |
+
Yorkshire_County_Cricket_Club
|
| 5534 |
+
Younes_El_Aynaoui
|
| 5535 |
+
Youri_Djorkaeff
|
| 5536 |
+
Youri_Mulder
|
| 5537 |
+
Yugoslavia
|
| 5538 |
+
Yukio_Hatoyama
|
| 5539 |
+
Yunnan
|
| 5540 |
+
Yuriy_Nikiforov
|
| 5541 |
+
Yvan_Quentin
|
| 5542 |
+
Yvonne_McGregor
|
| 5543 |
+
ZDF
|
| 5544 |
+
Zaandam
|
| 5545 |
+
Zabrze
|
| 5546 |
+
Zadar
|
| 5547 |
+
Zagreb
|
| 5548 |
+
Zagłębie_Lubin
|
| 5549 |
+
Zahoor_Elahi
|
| 5550 |
+
Zalaegerszegi_TE
|
| 5551 |
+
Zambia
|
| 5552 |
+
Zambia_national_football_team
|
| 5553 |
+
Zapatista_Army_of_National_Liberation
|
| 5554 |
+
Zastava_Arms
|
| 5555 |
+
Zbigniew_Siemiątkowski
|
| 5556 |
+
Zdeněk_Svoboda
|
| 5557 |
+
Zelimkhan_Yandarbiyev
|
| 5558 |
+
Zenith_Electronics
|
| 5559 |
+
Zevenaar
|
| 5560 |
+
Zhang_Ning
|
| 5561 |
+
Zhanna_Pintusevich-Block
|
| 5562 |
+
Zhejiang
|
| 5563 |
+
Zimbabwe
|
| 5564 |
+
Zimbabwe_Open
|
| 5565 |
+
Zimbabwe_national_cricket_team
|
| 5566 |
+
Zimbabwe_national_football_team
|
| 5567 |
+
Zina_Garrison
|
| 5568 |
+
Zine_El_Abidine_Ben_Ali
|
| 5569 |
+
Zinedine_Zidane
|
| 5570 |
+
Zinzan_Brooke
|
| 5571 |
+
Zionism
|
| 5572 |
+
Zoran_Savić
|
| 5573 |
+
Zulu_Kingdom
|
| 5574 |
+
Zvornik
|
| 5575 |
+
Zygmunt_Solorz-Żak
|
| 5576 |
+
Zëri_i_Popullit
|
| 5577 |
+
Zürich
|
| 5578 |
+
Àlex_Corretja
|
| 5579 |
+
Àlex_Crivillé
|
| 5580 |
+
Álvaro_Espinoza
|
| 5581 |
+
Ángeles_Montolio
|
| 5582 |
+
Åsa_Svensson
|
| 5583 |
+
Écu
|
| 5584 |
+
Élan_Béarnais_Pau-Orthez
|
| 5585 |
+
Éric_Bernard
|
| 5586 |
+
Óscar_Tabárez
|
| 5587 |
+
Östersund
|
| 5588 |
+
Újpest_FC
|
| 5589 |
+
Čelopek
|
| 5590 |
+
Ľubomír_Moravčík
|
| 5591 |
+
ŁKS_Łódź
|
| 5592 |
+
Śląsk_Wrocław
|
| 5593 |
+
Şırnak_Province
|
| 5594 |
+
ŠK_Slovan_Bratislava
|
| 5595 |
+
Šiauliai
|
| 5596 |
+
Šárka_Kašpárková
|
| 5597 |
+
Życie_Warszawy
|
| 5598 |
+
Željko_Petrović
|
resources/vocab/enwiki_20230827.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
resources/vocab/out_of_domain.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
span_annotation.py
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Data structure classes required and used for multiple levels of granularity in spans.
|
| 3 |
+
"""
|
| 4 |
+
from data_loader import dl_sa
|
| 5 |
+
from mosestokenizer import MosesDetokenizer
|
| 6 |
+
detokenize = MosesDetokenizer('en')
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
class PhraseAnnotation:
|
| 10 |
+
def __init__(self, initial_word):
|
| 11 |
+
self.words = [initial_word]
|
| 12 |
+
self._resolved_annotation = initial_word.resolved_annotation
|
| 13 |
+
self.ppr_for_ned_candidates = initial_word.ppr_for_ned_candidates
|
| 14 |
+
|
| 15 |
+
@property
|
| 16 |
+
def has_valid_bioes_labels(self):
|
| 17 |
+
# B = 0, I = 1, O = 2, E = 3, S = 4
|
| 18 |
+
return all([x.has_valid_bioes_labels and x.bioes_labels is not None for x in self.words])
|
| 19 |
+
|
| 20 |
+
def add(self, word):
|
| 21 |
+
self.words.append(word)
|
| 22 |
+
# There are some phrases that are annotated as O but have PPRforNED candidates, those will be ignored!
|
| 23 |
+
if self._resolved_annotation > 0 and self.ppr_for_ned_candidates != word.ppr_for_ned_candidates:
|
| 24 |
+
self.ppr_for_ned_candidates = list(set(self.ppr_for_ned_candidates) & set(word.ppr_for_ned_candidates))
|
| 25 |
+
|
| 26 |
+
def all_possible_annotations(self):
|
| 27 |
+
all_common_ids = set.intersection(*[set([y[0] for y in x.candidates]) for x in self.words])
|
| 28 |
+
all_common_ids_average_confidence = map(lambda x: sum(x)/len(x), [
|
| 29 |
+
[sum(y[1])/len(y[1]) for x in self.words for y in x.candidates if y[0] == k] for k in all_common_ids])
|
| 30 |
+
return sorted(zip(all_common_ids, all_common_ids_average_confidence), key=lambda x: x[1], reverse=True)
|
| 31 |
+
|
| 32 |
+
def set_alternative_as_resolved_annotation(self, alternative):
|
| 33 |
+
self._resolved_annotation = alternative
|
| 34 |
+
|
| 35 |
+
@property
|
| 36 |
+
def resolved_annotation(self):
|
| 37 |
+
return self._resolved_annotation
|
| 38 |
+
|
| 39 |
+
@property
|
| 40 |
+
def subword_annotations(self):
|
| 41 |
+
return [x for w in self.words for x in w.annotations]
|
| 42 |
+
|
| 43 |
+
@property
|
| 44 |
+
def word_string(self):
|
| 45 |
+
return detokenize([x.word_string.replace("\n", "\u010a").replace("£", "£").replace("âĦ¢", '™')
|
| 46 |
+
.replace('ü','ü').replace('é', 'é').replace('ÃŃ', 'í') for x in self.words])
|
| 47 |
+
|
| 48 |
+
@property
|
| 49 |
+
def begin_character(self):
|
| 50 |
+
return self.words[0].token_offsets[0][1][0]
|
| 51 |
+
|
| 52 |
+
@property
|
| 53 |
+
def end_character(self):
|
| 54 |
+
return self.words[-1].token_offsets[-1][1][-1]
|
| 55 |
+
|
| 56 |
+
@property
|
| 57 |
+
def average_annotation_confidence(self):
|
| 58 |
+
ac = [x.resolved_annotation_confidence for x in self.words]
|
| 59 |
+
return sum(ac) / len(ac)
|
| 60 |
+
|
| 61 |
+
def __str__(self):
|
| 62 |
+
return f"{self.word_string} ({self.begin_character}, {self.end_character}) | annotation: " \
|
| 63 |
+
f"{self.words[0].annotations[0].idx2tag[self.resolved_annotation]}"
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
class WordAnnotation:
|
| 67 |
+
def __init__(self, subword_annotations, token_offsets, ppr_for_ned_candidates=None):
|
| 68 |
+
if ppr_for_ned_candidates is None:
|
| 69 |
+
ppr_for_ned_candidates = []
|
| 70 |
+
self.annotations = subword_annotations
|
| 71 |
+
self.token_offsets = token_offsets
|
| 72 |
+
self.ppr_for_ned_candidates = ppr_for_ned_candidates
|
| 73 |
+
self.is_valid_annotation = False if not subword_annotations else True
|
| 74 |
+
self.word_string = ''.join([x[0].replace('\u0120', '') for x in token_offsets])
|
| 75 |
+
# even if self.is_valid_annotation is True we could still have the candidates to be empty
|
| 76 |
+
# since there could be no consensus among the subword predictions.
|
| 77 |
+
self.candidates = sorted([] if not self.is_valid_annotation else [
|
| 78 |
+
(cid, self._get_assigned_probabilities(cid)) for cid in set.intersection(*[set(y.top_k_i_list)
|
| 79 |
+
for y in self.annotations])],
|
| 80 |
+
key=lambda x: sum(x[1])/len(x[1]), reverse=True)
|
| 81 |
+
self.resolved_annotation = self._resolve_annotation()
|
| 82 |
+
rc = self._get_assigned_probabilities(self.resolved_annotation)
|
| 83 |
+
self.resolved_annotation_confidence = sum(rc) / len(rc)
|
| 84 |
+
if not self.candidates:
|
| 85 |
+
self.candidates = [(self.resolved_annotation, rc)]
|
| 86 |
+
assert self.resolved_annotation in [x[0] for x in self.candidates]
|
| 87 |
+
self.has_valid_bioes_labels = all([x.has_valid_bioes_label for x in self.annotations])
|
| 88 |
+
self.bioes_labels = None if not self.has_valid_bioes_labels else [x.bioes_label for x in self.annotations]
|
| 89 |
+
|
| 90 |
+
def _resolve_annotation(self):
|
| 91 |
+
if not self.is_valid_annotation:
|
| 92 |
+
return 0
|
| 93 |
+
r = [x.item() for x in self.annotations]
|
| 94 |
+
if r.count(r[0]) == len(r):
|
| 95 |
+
annotation = r[0]
|
| 96 |
+
elif self.candidates:
|
| 97 |
+
# here we return the annotation with the highest average probability prediction over all the subwords
|
| 98 |
+
annotation = self.candidates[0][0]
|
| 99 |
+
else:
|
| 100 |
+
# here we return the annotation which the model has predicted as highest probability for
|
| 101 |
+
# the majority of the subwords
|
| 102 |
+
most_frequent = max(set(r), key=r.count)
|
| 103 |
+
if r.count(most_frequent) == 1:
|
| 104 |
+
annotation = r[0]
|
| 105 |
+
else:
|
| 106 |
+
annotation = most_frequent
|
| 107 |
+
return annotation
|
| 108 |
+
|
| 109 |
+
def _get_assigned_probabilities(self, cid):
|
| 110 |
+
assigned_probabilities = []
|
| 111 |
+
for a in self.annotations:
|
| 112 |
+
found = False
|
| 113 |
+
for i, p in zip(a.top_k_i_list, a.top_k_p_list):
|
| 114 |
+
if i == cid:
|
| 115 |
+
assigned_probabilities.append(p)
|
| 116 |
+
found = True
|
| 117 |
+
break
|
| 118 |
+
if not found:
|
| 119 |
+
assigned_probabilities.append(0.0)
|
| 120 |
+
assert len(assigned_probabilities) == len(self.annotations)
|
| 121 |
+
return assigned_probabilities
|
| 122 |
+
|
| 123 |
+
def __str__(self):
|
| 124 |
+
ann = self.annotations[0].idx2tag[self.resolved_annotation]
|
| 125 |
+
cdns = ','.join([f'({self.annotations[0].idx2tag[x[0]]}: {sum(x[1])/len(x[1])})' for x in self.candidates])
|
| 126 |
+
return f"{self.word_string} | annotation: {ann} | candidates: [{cdns}]"
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
class SubwordAnnotation:
|
| 130 |
+
"""
|
| 131 |
+
The value of his class will be equal to the value of its "self.top_k_i_list[0]", the rest of the information will be
|
| 132 |
+
carried over for future decision-making and evaluation.
|
| 133 |
+
"""
|
| 134 |
+
def __init__(self, top_k_p_list, top_k_i_list, subword_string):
|
| 135 |
+
self.top_k_p_list = top_k_p_list
|
| 136 |
+
self.top_k_i_list = top_k_i_list
|
| 137 |
+
subword_string = "UNDEF_STR" if not subword_string else subword_string
|
| 138 |
+
self.subword_string = subword_string.replace('\u0120', '')
|
| 139 |
+
self.bioes_label = 2
|
| 140 |
+
self.has_valid_bioes_label = False
|
| 141 |
+
self.bioes_probabilities = None
|
| 142 |
+
|
| 143 |
+
def __eq__(self, other):
|
| 144 |
+
if isinstance(other, int):
|
| 145 |
+
return self.top_k_i_list[0] == other
|
| 146 |
+
elif isinstance(other, SubwordAnnotation):
|
| 147 |
+
return self.top_k_i_list[0] == other.top_k_i_list[0]
|
| 148 |
+
else:
|
| 149 |
+
raise ValueError
|
| 150 |
+
|
| 151 |
+
def __str__(self):
|
| 152 |
+
return f"({self.subword_string}, <<" \
|
| 153 |
+
f"{'>> <<'.join([f'{dl_sa.mentions_itos[i]}: {p:.3f}' for i, p in zip(self.top_k_i_list, self.top_k_p_list)])}>>)"
|
| 154 |
+
|
| 155 |
+
def item(self):
|
| 156 |
+
return self.top_k_i_list[0]
|
| 157 |
+
|
| 158 |
+
def item_probability(self):
|
| 159 |
+
return self.top_k_p_list[0]
|
| 160 |
+
|
| 161 |
+
def set_bioes_label(self, label: int, probs: list):
|
| 162 |
+
assert 0 <= label <= 5
|
| 163 |
+
assert len(probs) == 5
|
| 164 |
+
self.has_valid_bioes_label = True
|
| 165 |
+
self.bioes_label = label
|
| 166 |
+
self.bioes_probabilities = probs
|
utils.py
ADDED
|
@@ -0,0 +1,545 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
This file provides many functionalities that can be shared among different components.
|
| 3 |
+
The most important function in this file is `chunk_annotate_and_merge_to_phrase` which recieves a model and a raw text,
|
| 4 |
+
annotates the text, and returns the annotation spans.
|
| 5 |
+
"""
|
| 6 |
+
import os
|
| 7 |
+
import json
|
| 8 |
+
import pickle
|
| 9 |
+
import string
|
| 10 |
+
from enum import Enum
|
| 11 |
+
from tqdm import tqdm
|
| 12 |
+
|
| 13 |
+
from data_loader import get_dataset, tokenizer, dl_sa
|
| 14 |
+
from span_annotation import SubwordAnnotation, WordAnnotation, PhraseAnnotation
|
| 15 |
+
from aida import AIDADataset
|
| 16 |
+
from configuration import get_resources_dir
|
| 17 |
+
from mosestokenizer import MosesTokenizer, MosesPunctuationNormalizer
|
| 18 |
+
moses_tokenize = MosesTokenizer('en', old_version=True)
|
| 19 |
+
normalize = MosesPunctuationNormalizer('en')
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def get_punc_tokenized_words_list(word_list: list, labels_list: list = None):
|
| 23 |
+
tokens = []
|
| 24 |
+
labels = []
|
| 25 |
+
for w_ind, o_token in enumerate(word_list):
|
| 26 |
+
if o_token[0] not in string.punctuation and o_token[-1] not in string.punctuation:
|
| 27 |
+
tokens.append(o_token)
|
| 28 |
+
if labels_list:
|
| 29 |
+
labels.append(labels_list[w_ind])
|
| 30 |
+
if o_token.endswith("\'s") or o_token.endswith("\'S"):
|
| 31 |
+
tokens[-1] = tokens[-1][:-2]
|
| 32 |
+
tokens.append(o_token[-2:])
|
| 33 |
+
if labels_list:
|
| 34 |
+
labels.append(labels_list[w_ind])
|
| 35 |
+
continue
|
| 36 |
+
# cases where the tokens start or end with punctuation
|
| 37 |
+
before_tokens = []
|
| 38 |
+
after_tokens = []
|
| 39 |
+
while o_token and o_token[0] in string.punctuation:
|
| 40 |
+
before_tokens.append(o_token[0])
|
| 41 |
+
o_token = o_token[1:]
|
| 42 |
+
while o_token and o_token[-1] in string.punctuation:
|
| 43 |
+
after_tokens.append(o_token[-1])
|
| 44 |
+
o_token = o_token[:-1]
|
| 45 |
+
if before_tokens:
|
| 46 |
+
tokens.append("".join(before_tokens))
|
| 47 |
+
if labels_list:
|
| 48 |
+
labels.append(labels_list[w_ind])
|
| 49 |
+
if o_token:
|
| 50 |
+
tokens.append(o_token)
|
| 51 |
+
if labels_list:
|
| 52 |
+
labels.append(labels_list[w_ind])
|
| 53 |
+
if after_tokens:
|
| 54 |
+
tokens.append("".join(after_tokens[::-1]))
|
| 55 |
+
if labels_list:
|
| 56 |
+
labels.append(labels_list[w_ind])
|
| 57 |
+
if labels_list:
|
| 58 |
+
return tokens, labels
|
| 59 |
+
return tokens
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def save_predictions_result(logdir, epoch, precision, recall, f1, num_proposed, num_correct, num_gold,
|
| 63 |
+
all_words, all_tags, all_y_hat, all_predicted):
|
| 64 |
+
final = logdir + "/%s.P%.2f_R%.2f_F%.2f" % ("{}".format(str(epoch)), precision, recall, f1,)
|
| 65 |
+
with open(final, "w") as fout:
|
| 66 |
+
for words, tags, y_hat, preds in zip(all_words, all_tags, all_y_hat, all_predicted):
|
| 67 |
+
assert len(preds) == len(words) == len(tags)
|
| 68 |
+
for w, t, p in zip(words, tags, preds):
|
| 69 |
+
if w == '<s>' or t == '<pad>':
|
| 70 |
+
continue
|
| 71 |
+
fout.write(f"{w}\t{t}\t{p}\n")
|
| 72 |
+
fout.write("\n")
|
| 73 |
+
fout.write(f"num_proposed={num_proposed}\n")
|
| 74 |
+
fout.write(f"num_correct={num_correct}\n")
|
| 75 |
+
fout.write(f"num_gold={num_gold}\n")
|
| 76 |
+
fout.write(f"precision={precision}\n")
|
| 77 |
+
fout.write(f"recall={recall}\n")
|
| 78 |
+
fout.write(f"f1={f1}\n")
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def get_subword_to_word_mapping(subword_tokens, original_string, sequence_starts_and_ends_with_bos_eos=True):
|
| 82 |
+
# subword_tokens starts with <s> and ends with </s>
|
| 83 |
+
if sequence_starts_and_ends_with_bos_eos:
|
| 84 |
+
subword_tokens = subword_tokens[1:-1]
|
| 85 |
+
subword_to_word_mapping = []
|
| 86 |
+
start_subword_index = 0
|
| 87 |
+
end_subword_index = 0
|
| 88 |
+
original_tokens = get_punc_tokenized_words_list(original_string.split())
|
| 89 |
+
|
| 90 |
+
original_pointer = 0
|
| 91 |
+
while len(subword_to_word_mapping) != len(original_tokens):
|
| 92 |
+
next_t = tokenizer.convert_tokens_to_string(subword_tokens[start_subword_index:end_subword_index])
|
| 93 |
+
next_t = next_t.strip()
|
| 94 |
+
if next_t == original_tokens[original_pointer]:
|
| 95 |
+
subword_to_word_mapping.append((start_subword_index, end_subword_index))
|
| 96 |
+
original_pointer += 1
|
| 97 |
+
start_subword_index = end_subword_index
|
| 98 |
+
else:
|
| 99 |
+
end_subword_index += 1
|
| 100 |
+
if end_subword_index - start_subword_index > 1000:
|
| 101 |
+
for i in [0, 1, 2, 3, 4]:
|
| 102 |
+
n = tokenizer.convert_tokens_to_string(subword_tokens[start_subword_index:start_subword_index + 2 + i]).strip()
|
| 103 |
+
o = "".join(original_tokens[original_pointer: original_pointer + 2]).replace("`", "\'")
|
| 104 |
+
if n == o or n.replace(" ", "") == o.replace(" ", ""):
|
| 105 |
+
subword_to_word_mapping.append((start_subword_index, start_subword_index + 1))
|
| 106 |
+
original_pointer += 1
|
| 107 |
+
start_subword_index = start_subword_index + 1
|
| 108 |
+
subword_to_word_mapping.append((start_subword_index, start_subword_index + 1 + i))
|
| 109 |
+
original_pointer += 1
|
| 110 |
+
start_subword_index = start_subword_index + 1 + i
|
| 111 |
+
end_subword_index = start_subword_index
|
| 112 |
+
break
|
| 113 |
+
return subword_to_word_mapping
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
def store_validation_data_wiki(checkpoints_root, batch_size, label_size, is_training, use_retokenized_wikipedia_data):
|
| 117 |
+
dataset_name = f"validation_data_cache_b_{batch_size}_l_{label_size}_" \
|
| 118 |
+
f"{('rt_wiki' if use_retokenized_wikipedia_data else 'wiki') if is_training else 'conll'}/"
|
| 119 |
+
if not os.path.exists(os.path.join(checkpoints_root, dataset_name)):
|
| 120 |
+
os.mkdir(os.path.join(checkpoints_root, dataset_name))
|
| 121 |
+
else:
|
| 122 |
+
print("Retrieving the validation data ...")
|
| 123 |
+
return dataset_name
|
| 124 |
+
print("Caching the validation data ...")
|
| 125 |
+
if is_training:
|
| 126 |
+
valid_iter = tqdm(get_dataset(
|
| 127 |
+
dataset_name='enwiki', split='valid', batch_size=batch_size, label_size=label_size,
|
| 128 |
+
use_retokenized_wikipedia_data=use_retokenized_wikipedia_data))
|
| 129 |
+
else:
|
| 130 |
+
valid_iter = tqdm(get_dataset(dataset_name='aida', split='valid', batch_size=batch_size, label_size=label_size))
|
| 131 |
+
for ind, (inputs, subword_mentions) in enumerate(valid_iter):
|
| 132 |
+
with open(os.path.join(checkpoints_root, dataset_name, f"{ind}"), "wb") as store_file:
|
| 133 |
+
pickle.dump((inputs.token_ids.cpu(), subword_mentions.ids.cpu(), subword_mentions.probs.cpu(),
|
| 134 |
+
inputs.eval_mask.cpu(), subword_mentions.dictionary, inputs.raw_mentions,
|
| 135 |
+
inputs.is_in_mention.cpu(), inputs.bioes.cpu()), store_file,
|
| 136 |
+
protocol=pickle.HIGHEST_PROTOCOL)
|
| 137 |
+
return dataset_name
|
| 138 |
+
|
| 139 |
+
|
| 140 |
+
def postprocess_annotations(annotations, sentence):
|
| 141 |
+
res = []
|
| 142 |
+
for ann in annotations:
|
| 143 |
+
begin_index = ann[0]
|
| 144 |
+
end_index = ann[1]
|
| 145 |
+
annotation = ann[2]
|
| 146 |
+
requires_check = True
|
| 147 |
+
while requires_check and end_index > begin_index:
|
| 148 |
+
mention = sentence[begin_index:end_index]
|
| 149 |
+
if mention.lower().endswith("\'s") and all([any([m in c for c in annotation[0].lower().split("_")])
|
| 150 |
+
for m in mention[:-2].lower().split()]) and not \
|
| 151 |
+
all([any([m in c for c in annotation[0].lower().split("_")]) for m in mention.lower().split()]):
|
| 152 |
+
end_index -= 2
|
| 153 |
+
elif mention[0] in string.punctuation or mention[0] == ' ':
|
| 154 |
+
begin_index += 1
|
| 155 |
+
elif mention[-1] in string.punctuation and mention.lower()[-4:] not in ["u.s.", "u.n."]:
|
| 156 |
+
end_index -= 1
|
| 157 |
+
elif mention[-1] == ' ':
|
| 158 |
+
end_index -= 1
|
| 159 |
+
elif mention.lower()[-3:] in ["u.s", "u.n"] and end_index < len(sentence) and sentence[end_index] == '.':
|
| 160 |
+
end_index += 1
|
| 161 |
+
elif mention.lower() in ["a", "the", "in", "out", "to", "of", "for", "at", "by", "rd", "th", "and",
|
| 162 |
+
"or", "but", "on", "none", "is", "were", "was", "he", "she", "if", "as",
|
| 163 |
+
"have", "had", "has", "who", "when", "where", "a lot", "a little", "here",
|
| 164 |
+
"there", "\'s"]:
|
| 165 |
+
end_index = begin_index
|
| 166 |
+
requires_check = False
|
| 167 |
+
else:
|
| 168 |
+
requires_check = False
|
| 169 |
+
if begin_index < end_index:
|
| 170 |
+
res.append((begin_index, end_index, annotation))
|
| 171 |
+
return res
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
def get_aida_set_phrase_splitted_documents(dataset_name):
|
| 175 |
+
d_iter = AIDADataset().dataset[dataset_name]
|
| 176 |
+
|
| 177 |
+
phrase_documents = []
|
| 178 |
+
|
| 179 |
+
for document in d_iter:
|
| 180 |
+
document_words = []
|
| 181 |
+
document_labels = []
|
| 182 |
+
document_candidates = []
|
| 183 |
+
|
| 184 |
+
for annotation in document.annotations:
|
| 185 |
+
for a in annotation:
|
| 186 |
+
document_words.append(a.token)
|
| 187 |
+
document_candidates.append([x.url.replace('http://en.wikipedia.org/wiki/', '')
|
| 188 |
+
for x in a.candidates.candidates] if a.candidates else [])
|
| 189 |
+
if a.yago_entity and a.yago_entity != "--NME--":
|
| 190 |
+
document_labels.append(a.yago_entity.encode('ascii').decode('unicode-escape'))
|
| 191 |
+
else:
|
| 192 |
+
document_labels.append('|||O|||')
|
| 193 |
+
original_string = " ".join(document_words)
|
| 194 |
+
tokenized_mention = tokenizer(original_string)
|
| 195 |
+
tokens_offsets = list(zip(tokenized_mention.tokens(), tokenized_mention.encodings[0].offsets))[1:-1]
|
| 196 |
+
mapping = get_subword_to_word_mapping(tokenized_mention.tokens(), original_string)
|
| 197 |
+
subword_tokens = tokenized_mention.tokens()[1:-1]
|
| 198 |
+
w_ind = 0
|
| 199 |
+
subword_annotations = []
|
| 200 |
+
word_annotations = []
|
| 201 |
+
for w, l, cnds in zip(document_words, document_labels, document_candidates):
|
| 202 |
+
converted_to_words = "".join([x[1:] if x.startswith("\u0120")
|
| 203 |
+
else x for x in subword_tokens[mapping[w_ind][0]:mapping[w_ind][1]]])
|
| 204 |
+
if w == converted_to_words:
|
| 205 |
+
for sub_w in subword_tokens[mapping[w_ind][0]:mapping[w_ind][1]]:
|
| 206 |
+
subword_annotations.append(SubwordAnnotation([1.0], [dl_sa.mentions_vocab[l]], sub_w))
|
| 207 |
+
word_annotations.append(WordAnnotation(subword_annotations[mapping[w_ind][0]:mapping[w_ind][1]],
|
| 208 |
+
tokens_offsets[mapping[w_ind][0]:mapping[w_ind][1]], cnds))
|
| 209 |
+
w_ind += 1
|
| 210 |
+
elif len(mapping) > w_ind + 1 and w == "".join([x[1:] if x.startswith("\u0120")
|
| 211 |
+
else x for x in subword_tokens[
|
| 212 |
+
mapping[w_ind][0]:mapping[w_ind+1][1]]]):
|
| 213 |
+
for sub_w in subword_tokens[mapping[w_ind][0]:mapping[w_ind+1][1]]:
|
| 214 |
+
subword_annotations.append(SubwordAnnotation([1.0], [dl_sa.mentions_vocab[l]], sub_w))
|
| 215 |
+
word_annotations.append(WordAnnotation(subword_annotations[mapping[w_ind][0]:mapping[w_ind+1][1]],
|
| 216 |
+
tokens_offsets[mapping[w_ind][0]:mapping[w_ind+1][1]], cnds))
|
| 217 |
+
w_ind += 2
|
| 218 |
+
else:
|
| 219 |
+
raise ValueError("This should not happen")
|
| 220 |
+
phrase_annotations = []
|
| 221 |
+
for w in word_annotations:
|
| 222 |
+
if phrase_annotations and phrase_annotations[-1].resolved_annotation == w.resolved_annotation:
|
| 223 |
+
phrase_annotations[-1].add(w)
|
| 224 |
+
else:
|
| 225 |
+
phrase_annotations.append(PhraseAnnotation(w))
|
| 226 |
+
phrase_documents.append(phrase_annotations)
|
| 227 |
+
return phrase_documents
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
def _process_last_overlap(text_chunk_overlap, _overlap, l):
|
| 231 |
+
"""
|
| 232 |
+
Function intended to merge the predictions in the text chunk overlaps.
|
| 233 |
+
Implemented to be used in chunk_annotate_and_merge_to_phrase function.
|
| 234 |
+
"""
|
| 235 |
+
if not l:
|
| 236 |
+
l = _overlap
|
| 237 |
+
if len(l) < len(_overlap):
|
| 238 |
+
o = [x for x in _overlap]
|
| 239 |
+
o[-len(l):] = l
|
| 240 |
+
l = o
|
| 241 |
+
_r = []
|
| 242 |
+
if len(_overlap) < text_chunk_overlap:
|
| 243 |
+
text_chunk_overlap = len(_overlap)
|
| 244 |
+
for i in range(text_chunk_overlap):
|
| 245 |
+
if _overlap[i] == 0:
|
| 246 |
+
_r.append((l[i],))
|
| 247 |
+
elif l[i] == 0 or _overlap[i] == l[i]:
|
| 248 |
+
_r.append((_overlap[i],))
|
| 249 |
+
else: # keeping both for prediction resolution
|
| 250 |
+
_r.append((l[i], _overlap[i]))
|
| 251 |
+
return _r
|
| 252 |
+
|
| 253 |
+
|
| 254 |
+
def normalize_sentence_for_moses_alignment(sentence, normalize_for_chinese_characters=False):
|
| 255 |
+
for k, v in [('\u2018', '\''), ('\u2019', '\''), ('\u201d', '\"'), ('\u201c', '\"'), ('\u2013', '-'),
|
| 256 |
+
('\u2014', '-'), ('\u2026', '.'), ('\u2022', '.'), ('\u00f6', 'o'),('\u00e1', 'a'), ('\u00e8', 'e'),
|
| 257 |
+
('\u00c9', 'E'), ('\u014d', 'o'), ('\u0219', 's'), ('\n', '\u010a'), ('\u00a0', ' '), ('\u694a', ' '),
|
| 258 |
+
('\u9234', ' '), ('\u6797', ' '), ('\u6636', ' '), ('\u4f50', ' '), ('\u738b', ' '), ('\u5b9c', ' '),
|
| 259 |
+
('\u6b63', ' '), ('\u5168', ' '), ('\u52dd', ' '), ('\u80e1', ' '), ('\u5fd7', ' '), ('\u535a', ' '),
|
| 260 |
+
('\u9673', ' '), ('\u7f8e', ' '), ('\u20ac', 'E'), ('\u201e', '\"'), ('\u0107', 'c'), ('\ufeff', ' '),
|
| 261 |
+
('\u017e', 'z'), ('\u010d', 'c')]:
|
| 262 |
+
if k in sentence:
|
| 263 |
+
sentence = sentence.replace(k, v)
|
| 264 |
+
if normalize_for_chinese_characters:
|
| 265 |
+
for k, v in [('\u5e7c', ' '), ('\u5049', ' '), ('\u5b8f', ' '), ('\u9054', ' '), ('\u5bb9', ' '),
|
| 266 |
+
('\u96fb', ' '), ('\u590f', ' '), ('\u5b63', ' '), ('\u660c', ' '), ('\u90b1', ' '),
|
| 267 |
+
('\u4fca', ' '), ('\u6587', ' '), ('\u56b4', ' '), ('\u5b87', ' '), ('\u67cf', ' '),
|
| 268 |
+
('\u8b5a', ' '), ('\u9f0e', ' '), ('\u6176', ' '), ('\u99ac', ' '), ('\u82f1', ' '),
|
| 269 |
+
('\u4e5d', ' '), ('\u6797', ' '), ('\u7537', ' '), ('\u9996', ' '), ('\u60e0', ' '),
|
| 270 |
+
('\u7d00', ' '), ('\u5143', ' '), ('\u8f1d', ' '), ('\u5289', ' '), ('\u4fd0', ' '),
|
| 271 |
+
('\u8208', ' '), ('\u4e2d', ' '), ('\u8b1d', ' '), ('\u5922', ' '), ('\u9e9f', ' '),
|
| 272 |
+
('\u6e38', ' '), ('\u570b', ' '), ('\u7167', ' '), ('\u658c', ' '), ('\u54f2', ' '),
|
| 273 |
+
('\u9ec3', ' '), ('\u5433', ' '), ('\u53cb', ' '), ('\u6e05', ' '), ('\u856d', ' '),
|
| 274 |
+
('\u8000', ' '), ('\u5eb7', ' '), ('\u6dd1', ' '), ('\u83ef', ' ')]:
|
| 275 |
+
if k in sentence:
|
| 276 |
+
sentence = sentence.replace(k, v)
|
| 277 |
+
return sentence
|
| 278 |
+
|
| 279 |
+
|
| 280 |
+
def chunk_annotate_and_merge_to_phrase(model, sentence, k_for_top_k_to_keep=5, normalize_for_chinese_characters=False):
|
| 281 |
+
sentence = sentence.rstrip()
|
| 282 |
+
sentence = normalize_sentence_for_moses_alignment(sentence, normalize_for_chinese_characters)
|
| 283 |
+
simple_split_words = moses_tokenize(sentence)
|
| 284 |
+
sentence = sentence.replace('\u010a', '\n')
|
| 285 |
+
tokenized_mention = tokenizer(sentence)
|
| 286 |
+
tokens_offsets = list(zip(tokenized_mention.tokens(), tokenized_mention.encodings[0].offsets))
|
| 287 |
+
subword_to_word_mapping = get_subword_to_word_mapping(tokenized_mention.tokens(), sentence)
|
| 288 |
+
chunks = [tokens_offsets[i: i + model.text_chunk_length] for i in range(
|
| 289 |
+
0, len(tokens_offsets), model.text_chunk_length - model.text_chunk_overlap)]
|
| 290 |
+
result = []
|
| 291 |
+
last_overlap = []
|
| 292 |
+
logits = []
|
| 293 |
+
# ########################################################################################################
|
| 294 |
+
# Covert each chunk to tensors, predict the labels, and merge the overlaps (keep conflicting predictions).
|
| 295 |
+
# ########################################################################################################
|
| 296 |
+
for chunk in chunks:
|
| 297 |
+
subword_ids = [tokenizer.convert_tokens_to_ids([x[0] for x in chunk])]
|
| 298 |
+
logits = model.annotate_subword_ids(
|
| 299 |
+
subword_ids, k_for_top_k_to_keep, chunk)
|
| 300 |
+
if last_overlap:
|
| 301 |
+
result.extend(_process_last_overlap(model.text_chunk_overlap, last_overlap, logits))
|
| 302 |
+
else:
|
| 303 |
+
result.extend([(x,) for x in logits[:model.text_chunk_overlap]])
|
| 304 |
+
if len(logits) > 2 * model.text_chunk_overlap:
|
| 305 |
+
result.extend([(x,) for x in logits[model.text_chunk_overlap:-model.text_chunk_overlap]])
|
| 306 |
+
last_overlap = logits[-model.text_chunk_overlap:]
|
| 307 |
+
else:
|
| 308 |
+
result.extend([(x,) for x in logits[model.text_chunk_overlap:]])
|
| 309 |
+
last_overlap = []
|
| 310 |
+
logits = []
|
| 311 |
+
result.extend(_process_last_overlap(model.text_chunk_overlap, last_overlap, logits))
|
| 312 |
+
# ########################################################################################################
|
| 313 |
+
# Resolve the overlap merge conflicts using the model prediction probability
|
| 314 |
+
# ########################################################################################################
|
| 315 |
+
final_result = []
|
| 316 |
+
for p_ind, prediction in enumerate(result):
|
| 317 |
+
if len(prediction) == 1:
|
| 318 |
+
final_result.append(prediction[0])
|
| 319 |
+
else:
|
| 320 |
+
p_found = False
|
| 321 |
+
for p in prediction:
|
| 322 |
+
if p == final_result[-1] or (p_ind + 1 < len(result) and p in result[p_ind + 1]):
|
| 323 |
+
# It is equal to the one in the left or in the one to the right
|
| 324 |
+
final_result.append(p)
|
| 325 |
+
p_found = True
|
| 326 |
+
break
|
| 327 |
+
if not p_found: # choose the one the model is more confident about
|
| 328 |
+
final_result.append(sorted(prediction, key=lambda x: x.item_probability(), reverse=True)[0])
|
| 329 |
+
# ########################################################################################################
|
| 330 |
+
# Convert the model predictions (subword-level) to valid GERBIL annotation spans (continuous char-level)
|
| 331 |
+
# ########################################################################################################
|
| 332 |
+
tokens_offsets = tokens_offsets[1:-1]
|
| 333 |
+
final_result = final_result[1:]
|
| 334 |
+
# last_step_annotations = []
|
| 335 |
+
word_annotations = [WordAnnotation(final_result[m[0]:m[1]], tokens_offsets[m[0]:m[1]])
|
| 336 |
+
for m in subword_to_word_mapping]
|
| 337 |
+
# ########################################################################################################
|
| 338 |
+
# MAKING SURE WORDS ARE NOT BROKEN IN SEPARATE PHRASES!
|
| 339 |
+
# ########################################################################################################
|
| 340 |
+
w_p_1 = 0
|
| 341 |
+
w_p_2 = 0
|
| 342 |
+
w_2_buffer = ""
|
| 343 |
+
w_1_buffer = ""
|
| 344 |
+
while w_p_1 < len(word_annotations) and w_p_2 < len(simple_split_words):
|
| 345 |
+
w_1 = word_annotations[w_p_1]
|
| 346 |
+
w_2 = normalize(simple_split_words[w_p_2]).strip()
|
| 347 |
+
w_1_word_string = normalize(w_1.word_string).strip()
|
| 348 |
+
if w_1_word_string == w_2:
|
| 349 |
+
w_p_1 += 1
|
| 350 |
+
w_p_2 += 1
|
| 351 |
+
elif w_1_buffer and w_2_buffer and normalize(
|
| 352 |
+
w_1_buffer + w_1.word_string).strip() == normalize(w_2_buffer + simple_split_words[w_p_2]).strip():
|
| 353 |
+
w_p_1 += 1
|
| 354 |
+
w_p_2 += 1
|
| 355 |
+
w_1_buffer = ""
|
| 356 |
+
w_2_buffer = ""
|
| 357 |
+
elif w_2_buffer and w_1_word_string == normalize(w_2_buffer + simple_split_words[w_p_2]).strip():
|
| 358 |
+
w_p_1 += 1
|
| 359 |
+
w_p_2 += 1
|
| 360 |
+
w_2_buffer = ""
|
| 361 |
+
elif w_1_buffer and normalize(w_1_buffer + w_1.word_string).strip() == w_2:
|
| 362 |
+
w_p_1 += 1
|
| 363 |
+
w_p_2 += 1
|
| 364 |
+
w_1_buffer = ""
|
| 365 |
+
elif w_1_buffer and len(w_2) < len(normalize(w_1_buffer + w_1.word_string).strip()):
|
| 366 |
+
w_2_buffer += simple_split_words[w_p_2]
|
| 367 |
+
w_p_2 += 1
|
| 368 |
+
elif len(w_2) < len(w_1_word_string):
|
| 369 |
+
w_2_buffer += simple_split_words[w_p_2]
|
| 370 |
+
w_p_2 += 1
|
| 371 |
+
# Connecting the "." in between the names to the word it belongs to.
|
| 372 |
+
elif len(w_2) > len(w_1_word_string) and w_p_1 + 1 < len(word_annotations) \
|
| 373 |
+
and word_annotations[w_p_1 + 1].word_string == ".":
|
| 374 |
+
word_annotations[w_p_1 + 1] = WordAnnotation(
|
| 375 |
+
word_annotations[w_p_1].annotations + word_annotations[w_p_1 + 1].annotations,
|
| 376 |
+
word_annotations[w_p_1].token_offsets + word_annotations[w_p_1 + 1].token_offsets)
|
| 377 |
+
word_annotations[w_p_1].annotations = []
|
| 378 |
+
word_annotations[w_p_1].token_offsets = []
|
| 379 |
+
w_p_1 += 1
|
| 380 |
+
elif len(w_2) > len(w_1_word_string) and w_p_1 + 1 < len(word_annotations):
|
| 381 |
+
w_1_buffer += w_1.word_string
|
| 382 |
+
w_p_1 += 1
|
| 383 |
+
elif w_2_buffer and normalize(word_annotations[w_p_1].word_string + word_annotations[w_p_1 + 1].word_string).strip():
|
| 384 |
+
w_p_1 += 2
|
| 385 |
+
w_2_buffer = ""
|
| 386 |
+
else:
|
| 387 |
+
raise ValueError("This should not happen!")
|
| 388 |
+
# ################################################################################################################
|
| 389 |
+
phrase_annotations = []
|
| 390 |
+
for w in word_annotations:
|
| 391 |
+
if not w.annotations:
|
| 392 |
+
continue
|
| 393 |
+
if phrase_annotations and phrase_annotations[-1].resolved_annotation == w.resolved_annotation:
|
| 394 |
+
phrase_annotations[-1].add(w)
|
| 395 |
+
else:
|
| 396 |
+
phrase_annotations.append(PhraseAnnotation(w))
|
| 397 |
+
return phrase_annotations
|
| 398 |
+
|
| 399 |
+
|
| 400 |
+
class ComparisonResult(Enum):
|
| 401 |
+
CORRECTLY_IGNORED_O = 0
|
| 402 |
+
CORRECTLY_FOUND_BOTH_SPAN_AND_ANNOTATION = 1
|
| 403 |
+
CORRECTLY_FOUND_SPAN_BUT_NOT_ANNOTATION = 2
|
| 404 |
+
OVER_GENERATED_ANNOTATION = 3
|
| 405 |
+
|
| 406 |
+
@staticmethod
|
| 407 |
+
def get_correct_status(g_span, p_span):
|
| 408 |
+
g_is_o = g_span.resolved_annotation == 0
|
| 409 |
+
got_annotation_right = p_span.resolved_annotation == g_span.resolved_annotation
|
| 410 |
+
got_span_right = p_span.word_string.replace(" ", "") == g_span.word_string.replace(" ", "")
|
| 411 |
+
# p_span.average_annotation_confidence == g_span.average_annotation_confidence
|
| 412 |
+
if got_span_right and got_annotation_right and g_is_o:
|
| 413 |
+
return ComparisonResult.CORRECTLY_IGNORED_O
|
| 414 |
+
elif got_span_right and got_annotation_right and not g_is_o:
|
| 415 |
+
return ComparisonResult.CORRECTLY_FOUND_BOTH_SPAN_AND_ANNOTATION
|
| 416 |
+
elif got_span_right and not got_annotation_right and not g_is_o:
|
| 417 |
+
# it could be that p is o or not!
|
| 418 |
+
return ComparisonResult.CORRECTLY_FOUND_SPAN_BUT_NOT_ANNOTATION
|
| 419 |
+
elif got_span_right and not got_annotation_right and g_is_o:
|
| 420 |
+
return ComparisonResult.OVER_GENERATED_ANNOTATION
|
| 421 |
+
else:
|
| 422 |
+
raise ValueError("This should not happen!")
|
| 423 |
+
|
| 424 |
+
|
| 425 |
+
def compare_gold_and_predicted_annotation_documents(gold_document, predicted_document, ignore_over_generated=False,
|
| 426 |
+
ignore_predictions_outside_candidate_list=False):
|
| 427 |
+
"""
|
| 428 |
+
Compares the output results of the model predictions and the gold annotations.
|
| 429 |
+
"""
|
| 430 |
+
g_id = 0
|
| 431 |
+
p_id = 0
|
| 432 |
+
comparison_results = []
|
| 433 |
+
while g_id < len(gold_document) and p_id < len(predicted_document):
|
| 434 |
+
p_span = predicted_document[p_id]
|
| 435 |
+
g_span = gold_document[g_id]
|
| 436 |
+
special_condition = p_span.word_string != g_span.word_string and p_span.word_string.replace(
|
| 437 |
+
" ", "") == g_span.word_string.replace(" ", "")
|
| 438 |
+
if p_span.word_string == g_span.word_string or special_condition:
|
| 439 |
+
p_id += 1
|
| 440 |
+
g_id += 1
|
| 441 |
+
comparison_results.append((g_span, p_span, ComparisonResult.get_correct_status(g_span, p_span)))
|
| 442 |
+
elif len(p_span.word_string) < len(g_span.word_string) and \
|
| 443 |
+
len(p_span.words) == len(g_span.words) == 1 and p_id + 1 < len(predicted_document) and \
|
| 444 |
+
len(predicted_document[p_id+1].words) > 1:
|
| 445 |
+
p_span.add(predicted_document[p_id+1].words[0])
|
| 446 |
+
predicted_document[p_id+1].words.pop(0)
|
| 447 |
+
continue
|
| 448 |
+
elif len(p_span.word_string) < len(g_span.word_string):
|
| 449 |
+
# potentially over-generated span later
|
| 450 |
+
new_phrase = PhraseAnnotation(g_span.words[0])
|
| 451 |
+
i = 1
|
| 452 |
+
while new_phrase.word_string.replace(" ", "") != p_span.word_string.replace(" ", "") \
|
| 453 |
+
and i < len(g_span.words):
|
| 454 |
+
new_phrase.add(g_span.words[i])
|
| 455 |
+
i += 1
|
| 456 |
+
not_solved = new_phrase.word_string.replace(" ", "") != p_span.word_string.replace(" ", "")
|
| 457 |
+
if not_solved and p_id + 1 < len(predicted_document) and len(predicted_document[p_id+1].words) > 1:
|
| 458 |
+
p_span.add(predicted_document[p_id+1].words[0])
|
| 459 |
+
predicted_document[p_id+1].words.pop(0)
|
| 460 |
+
continue
|
| 461 |
+
elif not_solved and p_id + 1 < len(predicted_document) and len(predicted_document[p_id+1].words) == 1:
|
| 462 |
+
p_span.add(predicted_document[p_id+1].words[0])
|
| 463 |
+
predicted_document[p_id+1].words = p_span.words
|
| 464 |
+
predicted_document[p_id+1].set_alternative_as_resolved_annotation(p_span.resolved_annotation)
|
| 465 |
+
p_id += 1
|
| 466 |
+
continue
|
| 467 |
+
elif not_solved:
|
| 468 |
+
raise ValueError("This should not happen!")
|
| 469 |
+
else:
|
| 470 |
+
comparison_results.append((
|
| 471 |
+
new_phrase, p_span, ComparisonResult.get_correct_status(new_phrase, p_span)))
|
| 472 |
+
g_span.words = g_span.words[i:]
|
| 473 |
+
p_id += 1
|
| 474 |
+
elif len(p_span.word_string) > len(g_span.word_string):
|
| 475 |
+
# potentially missed a span
|
| 476 |
+
new_phrase = PhraseAnnotation(p_span.words[0])
|
| 477 |
+
i = 1
|
| 478 |
+
while new_phrase.word_string.replace(" ", "") != g_span.word_string.replace(" ", "") \
|
| 479 |
+
and i < len(p_span.words):
|
| 480 |
+
new_phrase.add(p_span.words[i])
|
| 481 |
+
i += 1
|
| 482 |
+
if new_phrase.word_string.replace(" ", "") != g_span.word_string.replace(" ", ""):
|
| 483 |
+
# re-alignment not helpful
|
| 484 |
+
new_p = PhraseAnnotation(p_span.words[0])
|
| 485 |
+
new_g = PhraseAnnotation(g_span.words[0])
|
| 486 |
+
i = 1
|
| 487 |
+
while new_p.word_string == new_g.word_string:
|
| 488 |
+
new_p.add(p_span.words[i])
|
| 489 |
+
new_g.add(g_span.words[i])
|
| 490 |
+
i += 1
|
| 491 |
+
new_p.words = new_p.words[:-1]
|
| 492 |
+
new_g.words = new_g.words[:-1]
|
| 493 |
+
comparison_results.append((new_g, new_p, ComparisonResult.get_correct_status(new_g, new_p)))
|
| 494 |
+
p_span.words = p_span.words[i - 1:]
|
| 495 |
+
g_span.words = g_span.words[i - 1:]
|
| 496 |
+
else:
|
| 497 |
+
comparison_results.append((
|
| 498 |
+
g_span, new_phrase, ComparisonResult.get_correct_status(g_span, new_phrase)))
|
| 499 |
+
p_span.words = p_span.words[i:]
|
| 500 |
+
g_id += 1
|
| 501 |
+
elif g_span.word_string.replace(" ", "").startswith(p_span.word_string.replace(" ", "")) and \
|
| 502 |
+
p_id + 1 < len(predicted_document) and p_span.word_string.replace(" ", "") + \
|
| 503 |
+
predicted_document[p_id + 1].word_string.replace(" ", "") == g_span.word_string.replace(" ", ""):
|
| 504 |
+
for next_span_word in predicted_document[p_id+1].words:
|
| 505 |
+
p_span.add(next_span_word)
|
| 506 |
+
predicted_document[p_id+1] = p_span
|
| 507 |
+
p_id += 1
|
| 508 |
+
continue
|
| 509 |
+
elif g_span.word_string.replace(" ", "").startswith(p_span.word_string.replace(" ", "")) and \
|
| 510 |
+
p_id + 1 < len(predicted_document) and p_span.word_string.replace(" ", "") + \
|
| 511 |
+
predicted_document[p_id + 1].words[0].word_string.replace(" ", "") == \
|
| 512 |
+
g_span.word_string.replace(" ", ""):
|
| 513 |
+
p_span.add(predicted_document[p_id+1].words[0])
|
| 514 |
+
predicted_document[p_id+1].words.pop(0)
|
| 515 |
+
continue
|
| 516 |
+
elif g_span.word_string.replace(" ", "").startswith(p_span.word_string.replace(" ", "")):
|
| 517 |
+
raise ValueError("This should be handled correctly!")
|
| 518 |
+
elif p_span.word_string.replace(" ", "").startswith(g_span.word_string.replace(" ", "")):
|
| 519 |
+
raise ValueError("This should be handled correctly!")
|
| 520 |
+
else:
|
| 521 |
+
raise ValueError("This should not happen!")
|
| 522 |
+
if ignore_over_generated:
|
| 523 |
+
c_results = []
|
| 524 |
+
for g, p, r in comparison_results:
|
| 525 |
+
if ignore_over_generated and r == ComparisonResult.OVER_GENERATED_ANNOTATION:
|
| 526 |
+
p.set_alternative_as_resolved_annotation(0)
|
| 527 |
+
r = ComparisonResult.CORRECTLY_IGNORED_O
|
| 528 |
+
c_results.append((g, p, r))
|
| 529 |
+
comparison_results = c_results
|
| 530 |
+
if ignore_predictions_outside_candidate_list:
|
| 531 |
+
c_results = []
|
| 532 |
+
for g, p, r in comparison_results:
|
| 533 |
+
g_ppr_for_ned_candidates = [dl_sa.mentions_vocab[x] for x in g.ppr_for_ned_candidates if x in dl_sa.mentions_vocab]
|
| 534 |
+
if g_ppr_for_ned_candidates:
|
| 535 |
+
all_p_anns = p.all_possible_annotations()
|
| 536 |
+
filtered_p_predictions = sorted([x for x in all_p_anns if x[0] in g_ppr_for_ned_candidates],
|
| 537 |
+
key=lambda y: y[1], reverse=True)
|
| 538 |
+
if filtered_p_predictions:
|
| 539 |
+
p.set_alternative_as_resolved_annotation(filtered_p_predictions[0][0])
|
| 540 |
+
else:
|
| 541 |
+
p.set_alternative_as_resolved_annotation(0)
|
| 542 |
+
r = ComparisonResult.get_correct_status(g, p)
|
| 543 |
+
c_results.append((g, p, r))
|
| 544 |
+
comparison_results = c_results
|
| 545 |
+
return comparison_results
|