【程式碼精讀】Graph Convolution over Pruned Dependency Trees for Relation Extraction(1)
阿新 • • 發佈:2021-01-11
First, download and unzip GloVe vectors from the Stanford NLP group website, with:
chmod +x download.sh; ./download.sh
命令chomd+x,使download.sh檔案有執行許可權
使用Git Bash工具執行此指令碼檔案download.sh:
#!/bin/bash cd dataset; mkdir glove cd glove echo "==> Downloading glove vectors..." wget http://nlp.stanford.edu/data/glove.840B.300d.zip echo"==> Unzipping glove vectors..." unzip glove.840B.300d.zip rm glove.840B.300d.zip echo "==> Done."
選擇合適的Glove預訓練詞向量:
我們使用TACRED資料集,所以選擇第三個預訓練好的詞向量。
TACRED資料集標註格式如下:
train.json中一個無關係例項:
1 { 2 "id":"61b3a65fb906688c92a1", 3 "relation":"no_relation", 4 "token":[ 5 "Ali", 6 "lied", 7 "about", 8 "having", 9 "to", 10 "leave", 11 "for", 12 "her", 13 "job", 14 "to", 15 "see", 16 "if", 17 "Jake", 18 "would", 19 "end", 20 "the", 21 "show", 22 "to", 23 "be", 24 "with", 25 "her", 26 "." 27 ], 28 "subj_start":20, 29 "subj_end":20, 30 "obj_start":12, 31 "obj_end":12, 32 "subj_type":"PERSON", 33 "obj_type":"PERSON", 34 "stanford_pos":[ 35 "NNP", 36 "VBD", 37 "IN", 38 "VBG", 39 "TO", 40 "VB", 41 "IN", 42 "PRP$", 43 "NN", 44 "TO", 45 "VB", 46 "IN", 47 "NNP", 48 "MD", 49 "VB", 50 "DT", 51 "NN", 52 "TO", 53 "VB", 54 "IN", 55 "PRP", 56 "." 57 ], 58 "stanford_ner":[ 59 "PERSON", 60 "O", 61 "O", 62 "O", 63 "O", 64 "O", 65 "O", 66 "O", 67 "O", 68 "O", 69 "O", 70 "O", 71 "PERSON", 72 "O", 73 "O", 74 "O", 75 "O", 76 "O", 77 "O", 78 "O", 79 "O", 80 "O" 81 ], 82 "stanford_head":[ 83 "2", 84 "0", 85 "4", 86 "2", 87 "6", 88 "4", 89 "11", 90 "9", 91 "11", 92 "11", 93 "6", 94 "15", 95 "15", 96 "15", 97 "11", 98 "17", 99 "15", 100 "21", 101 "21", 102 "21", 103 "17", 104 "2" 105 ], 106 "stanford_deprel":[ 107 "nsubj", 108 "ROOT", 109 "mark", 110 "advcl", 111 "mark", 112 "xcomp", 113 "mark", 114 "nmod:poss", 115 "nsubj", 116 "mark", 117 "advcl", 118 "mark", 119 "nsubj", 120 "aux", 121 "advcl", 122 "det", 123 "dobj", 124 "mark", 125 "cop", 126 "case", 127 "acl", 128 "punct" 129 ] 130 },
train.json中有關係的例項
1 { 2 "id":"61b3a5158dd9ce154430", 3 "relation":"org:city_of_headquarters", 4 "token":Array[33], 5 "subj_start":17, 6 "subj_end":19, 7 "obj_start":21, 8 "obj_end":21, 9 "subj_type":"ORGANIZATION", 10 "obj_type":"CITY", 11 "stanford_pos":[ 12 "NNP", 13 "NNP", 14 ",", 15 "CD", 16 ",", 17 "IN", 18 "NNP", 19 ",", 20 "NNP", 21 ",", 22 "VBD", 23 "VBN", 24 "NNP", 25 "IN", 26 "PRP$", 27 "NN", 28 "IN", 29 "NNP", 30 "NNP", 31 "NNP", 32 "IN", 33 "NNP", 34 ",", 35 "WRB", 36 "NN", 37 "VBD", 38 "PRP", 39 "VBD", 40 "NN", 41 "IN", 42 "PRP$", 43 "NN", 44 "." 45 ], 46 "stanford_ner":[ 47 "PERSON", 48 "PERSON", 49 "O", 50 "NUMBER", 51 "O", 52 "O", 53 "LOCATION", 54 "O", 55 "LOCATION", 56 "O", 57 "O", 58 "O", 59 "DATE", 60 "O", 61 "O", 62 "O", 63 "O", 64 "ORGANIZATION", 65 "ORGANIZATION", 66 "ORGANIZATION", 67 "O", 68 "LOCATION", 69 "O", 70 "O", 71 "O", 72 "O", 73 "O", 74 "O", 75 "O", 76 "O", 77 "O", 78 "O", 79 "O" 80 ], 81 "stanford_head":[ 82 "2", 83 "12", 84 "2", 85 "2", 86 "2", 87 "7", 88 "2", 89 "7", 90 "7", 91 "7", 92 "12", 93 "0", 94 "12", 95 "16", 96 "16", 97 "12", 98 "20", 99 "20", 100 "20", 101 "16", 102 "22", 103 "20", 104 "22", 105 "26", 106 "26", 107 "22", 108 "28", 109 "26", 110 "28", 111 "32", 112 "32", 113 "29", 114 "12" 115 ], 116 "stanford_deprel":[ 117 "compound", 118 "nsubjpass", 119 "punct", 120 "amod", 121 "punct", 122 "case", 123 "nmod", 124 "punct", 125 "appos", 126 "punct", 127 "auxpass", 128 "ROOT", 129 "nmod:tmod", 130 "case", 131 "nmod:poss", 132 "nmod", 133 "case", 134 "compound", 135 "compound", 136 "nmod", 137 "case", 138 "nmod", 139 "punct", 140 "advmod", 141 "nsubj", 142 "acl:relcl", 143 "nsubj", 144 "ccomp", 145 "dobj", 146 "case", 147 "nmod:poss", 148 "nmod", 149 "punct" 150 ] 151 },
dev.json中有關係例項1:
1 { 2 "id":"e7798fb92683ba431dd7", 3 "relation":"per:title", 4 "token":[ 5 "From", 6 "his", 7 "perch", 8 "as", 9 "a", 10 "researcher", 11 "for", 12 "IBM", 13 "in", 14 "New", 15 "York", 16 ",", 17 "where", 18 "he", 19 "worked", 20 "for", 21 "decades", 22 "before", 23 "accepting", 24 "a", 25 "position", 26 "at", 27 "Yale", 28 "University", 29 ",", 30 "he", 31 "noticed", 32 "patterns", 33 "that", 34 "other", 35 "researchers", 36 "may", 37 "have", 38 "overlooked", 39 "in", 40 "their", 41 "own", 42 "data", 43 ",", 44 "then", 45 "often", 46 "swooped", 47 "in", 48 "to", 49 "collaborate", 50 "." 51 ], 52 "subj_start":1, 53 "subj_end":1, 54 "obj_start":5, 55 "obj_end":5, 56 "subj_type":"PERSON", 57 "obj_type":"TITLE", 58 "stanford_pos":[ 59 "IN", 60 "PRP$", 61 "NN", 62 "IN", 63 "DT", 64 "NN", 65 "IN", 66 "NNP", 67 "IN", 68 "NNP", 69 "NNP", 70 ",", 71 "WRB", 72 "PRP", 73 "VBD", 74 "IN", 75 "NNS", 76 "IN", 77 "VBG", 78 "DT", 79 "NN", 80 "IN", 81 "NNP", 82 "NNP", 83 ",", 84 "PRP", 85 "VBD", 86 "NNS", 87 "IN", 88 "JJ", 89 "NNS", 90 "MD", 91 "VB", 92 "VBN", 93 "IN", 94 "PRP$", 95 "JJ", 96 "NNS", 97 ",", 98 "RB", 99 "RB", 100 "VBD", 101 "IN", 102 "TO", 103 "VB", 104 "." 105 ], 106 "stanford_ner":[ 107 "O", 108 "O", 109 "O", 110 "O", 111 "O", 112 "O", 113 "O", 114 "ORGANIZATION", 115 "O", 116 "LOCATION", 117 "LOCATION", 118 "O", 119 "O", 120 "O", 121 "O", 122 "O", 123 "DURATION", 124 "O", 125 "O", 126 "O", 127 "O", 128 "O", 129 "ORGANIZATION", 130 "ORGANIZATION", 131 "O", 132 "O", 133 "O", 134 "O", 135 "O", 136 "O", 137 "O", 138 "O", 139 "O", 140 "O", 141 "O", 142 "O", 143 "O", 144 "O", 145 "O", 146 "O", 147 "O", 148 "O", 149 "O", 150 "O", 151 "O", 152 "O" 153 ], 154 "stanford_head":[ 155 "3", 156 "3", 157 "27", 158 "6", 159 "6", 160 "3", 161 "8", 162 "6", 163 "11", 164 "11", 165 "6", 166 "11", 167 "15", 168 "15", 169 "11", 170 "17", 171 "15", 172 "19", 173 "15", 174 "21", 175 "19", 176 "24", 177 "24", 178 "21", 179 "27", 180 "27", 181 "0", 182 "27", 183 "34", 184 "31", 185 "34", 186 "34", 187 "34", 188 "28", 189 "38", 190 "38", 191 "38", 192 "34", 193 "27", 194 "42", 195 "42", 196 "27", 197 "42", 198 "45", 199 "42", 200 "27" 201 ], 202 "stanford_deprel":[ 203 "case", 204 "nmod:poss", 205 "nmod", 206 "case", 207 "det", 208 "nmod", 209 "case", 210 "nmod", 211 "case", 212 "compound", 213 "nmod", 214 "punct", 215 "advmod", 216 "nsubj", 217 "acl:relcl", 218 "case", 219 "nmod", 220 "mark", 221 "advcl", 222 "det", 223 "dobj", 224 "case", 225 "compound", 226 "nmod", 227 "punct", 228 "nsubj", 229 "ROOT", 230 "dobj", 231 "mark", 232 "amod", 233 "nsubj", 234 "aux", 235 "aux", 236 "ccomp", 237 "case", 238 "nmod:poss", 239 "amod", 240 "nmod", 241 "punct", 242 "advmod", 243 "advmod", 244 "dep", 245 "compound:prt", 246 "mark", 247 "xcomp", 248 "punct" 249 ] 250 },
dev.json中有關係例項2:
1 { 2 "id":"e7798eaebf3179c706bf", 3 "relation":"org:website", 4 "token":[ 5 "A123", 6 ":", 7 "http://wwwa123systemscom/", 8 "Production", 9 "of", 10 "stimulus-aided", 11 "car", 12 "batteries", 13 "revs", 14 "up", 15 "Battery", 16 "maker", 17 "A123", 18 "Systems", 19 "Inc", 20 "planned", 21 "to", 22 "open", 23 "a", 24 "new", 25 "lithium", 26 "ion", 27 "battery", 28 "plant", 29 "Monday", 30 "in", 31 "Livonia", 32 ",", 33 "Michigan", 34 "." 35 ], 36 "subj_start":0, 37 "subj_end":0, 38 "obj_start":2, 39 "obj_end":2, 40 "subj_type":"ORGANIZATION", 41 "obj_type":"URL", 42 "stanford_pos":[ 43 "NN", 44 ":", 45 "NN", 46 "NN", 47 "IN", 48 "JJ", 49 "NN", 50 "NNS", 51 "VBZ", 52 "RP", 53 "NN", 54 "NN", 55 "NNP", 56 "NNPS", 57 "NNP", 58 "VBD", 59 "TO", 60 "VB", 61 "DT", 62 "JJ", 63 "NN", 64 "NN", 65 "NN", 66 "NN", 67 "NNP", 68 "IN", 69 "NNP", 70 ",", 71 "NNP", 72 "." 73 ], 74 "stanford_ner":[ 75 "O", 76 "O", 77 "O", 78 "O", 79 "O", 80 "O", 81 "O", 82 "O", 83 "O", 84 "O", 85 "O", 86 "O", 87 "ORGANIZATION", 88 "ORGANIZATION", 89 "ORGANIZATION", 90 "O", 91 "O", 92 "O", 93 "O", 94 "O", 95 "O", 96 "O", 97 "O", 98 "O", 99 "DATE", 100 "O", 101 "LOCATION", 102 "O", 103 "LOCATION", 104 "O" 105 ], 106 "stanford_head":[ 107 "0", 108 "1", 109 "4", 110 "9", 111 "8", 112 "8", 113 "8", 114 "4", 115 "1", 116 "9", 117 "15", 118 "15", 119 "15", 120 "15", 121 "16", 122 "9", 123 "18", 124 "16", 125 "24", 126 "24", 127 "24", 128 "24", 129 "24", 130 "18", 131 "18", 132 "27", 133 "18", 134 "27", 135 "27", 136 "1" 137 ], 138 "stanford_deprel":[ 139 "ROOT", 140 "punct", 141 "compound", 142 "nsubj", 143 "case", 144 "amod", 145 "compound", 146 "nmod", 147 "appos", 148 "compound:prt", 149 "compound", 150 "compound", 151 "compound", 152 "compound", 153 "nsubj", 154 "ccomp", 155 "mark", 156 "xcomp", 157 "det", 158 "amod", 159 "compound", 160 "compound", 161 "compound", 162 "dobj", 163 "nmod:tmod", 164 "case", 165 "nmod", 166 "punct", 167 "appos", 168 "punct" 169 ] 170 },
dev.json中無關係例項:
1 { 2 "id":"e779865fb91dc9cef1f3", 3 "relation":"no_relation", 4 "token":[ 5 "The", 6 "Academy", 7 "of", 8 "Motion", 9 "Picture", 10 "Arts", 11 "and", 12 "Sciences", 13 "awarded", 14 "Edwards", 15 "--", 16 "who", 17 "was", 18 "married", 19 "to", 20 "actress", 21 "Julie", 22 "Andrews", 23 "--", 24 "an", 25 "honorary", 26 "lifetime", 27 "achievement", 28 "Oscar", 29 "in", 30 "2004", 31 "." 32 ], 33 "subj_start":9, 34 "subj_end":9, 35 "obj_start":15, 36 "obj_end":15, 37 "subj_type":"PERSON", 38 "obj_type":"TITLE", 39 "stanford_pos":[ 40 "DT", 41 "NN", 42 "IN", 43 "NNP", 44 "NNP", 45 "NNS", 46 "CC", 47 "NNPS", 48 "VBD", 49 "NNP", 50 ":", 51 "WP", 52 "VBD", 53 "VBN", 54 "TO", 55 "NN", 56 "NNP", 57 "NNP", 58 ":", 59 "DT", 60 "JJ", 61 "NN", 62 "NN", 63 "NNP", 64 "IN", 65 "CD", 66 "." 67 ], 68 "stanford_ner":[ 69 "O", 70 "ORGANIZATION", 71 "ORGANIZATION", 72 "ORGANIZATION", 73 "ORGANIZATION", 74 "ORGANIZATION", 75 "ORGANIZATION", 76 "ORGANIZATION", 77 "O", 78 "PERSON", 79 "O", 80 "O", 81 "O", 82 "O", 83 "O", 84 "O", 85 "PERSON", 86 "PERSON", 87 "O", 88 "O", 89 "O", 90 "O", 91 "O", 92 "O", 93 "O", 94 "DATE", 95 "O" 96 ], 97 "stanford_head":[ 98 "2", 99 "9", 100 "6", 101 "6", 102 "6", 103 "2", 104 "6", 105 "6", 106 "0", 107 "9", 108 "10", 109 "14", 110 "14", 111 "10", 112 "18", 113 "18", 114 "18", 115 "14", 116 "10", 117 "24", 118 "24", 119 "24", 120 "24", 121 "10", 122 "26", 123 "24", 124 "9" 125 ], 126 "stanford_deprel":[ 127 "det", 128 "nsubj", 129 "case", 130 "compound", 131 "compound", 132 "nmod", 133 "cc", 134 "conj", 135 "ROOT", 136 "dobj", 137 "punct", 138 "nsubjpass", 139 "auxpass", 140 "acl:relcl", 141 "case", 142 "compound", 143 "compound", 144 "nmod", 145 "punct", 146 "det", 147 "amod", 148 "compound", 149 "compound", 150 "dep", 151 "case", 152 "nmod", 153 "punct" 154 ] 155 },
test.json中無關係例項:
1 { 2 "id":"098f665fb956837273f5", 3 "relation":"no_relation", 4 "token":[ 5 "He", 6 "named", 7 "one", 8 "as", 9 "Shah", 10 "Abdul", 11 "Aziz", 12 ",", 13 "a", 14 "member", 15 "of", 16 "a", 17 "pro-Taliban", 18 "religious", 19 "party", 20 "elected", 21 "to", 22 "parliament", 23 "'s", 24 "lower", 25 "house", 26 "in", 27 "2002", 28 "." 29 ], 30 "subj_start":4, 31 "subj_end":6, 32 "obj_start":2, 33 "obj_end":2, 34 "subj_type":"PERSON", 35 "obj_type":"NUMBER", 36 "stanford_pos":[ 37 "PRP", 38 "VBD", 39 "CD", 40 "IN", 41 "NNP", 42 "NNP", 43 "NNP", 44 ",", 45 "DT", 46 "NN", 47 "IN", 48 "DT", 49 "JJ", 50 "JJ", 51 "NN", 52 "VBN", 53 "TO", 54 "NN", 55 "POS", 56 "JJR", 57 "NN", 58 "IN", 59 "CD", 60 "." 61 ], 62 "stanford_ner":[ 63 "O", 64 "O", 65 "NUMBER", 66 "O", 67 "PERSON", 68 "PERSON", 69 "PERSON", 70 "O", 71 "O", 72 "O", 73 "O", 74 "O", 75 "MISC", 76 "O", 77 "O", 78 "O", 79 "O", 80 "O", 81 "O", 82 "O", 83 "O", 84 "O", 85 "DATE", 86 "O" 87 ], 88 "stanford_head":[ 89 "2", 90 "0", 91 "2", 92 "7", 93 "7", 94 "7", 95 "2", 96 "7", 97 "10", 98 "7", 99 "15", 100 "15", 101 "15", 102 "15", 103 "10", 104 "15", 105 "21", 106 "21", 107 "18", 108 "21", 109 "16", 110 "23", 111 "16", 112 "2" 113 ], 114 "stanford_deprel":[ 115 "nsubj", 116 "ROOT", 117 "dobj", 118 "case", 119 "compound", 120 "compound", 121 "nmod", 122 "punct", 123 "det", 124 "appos", 125 "case", 126 "det", 127 "amod", 128 "amod", 129 "nmod", 130 "acl", 131 "case", 132 "nmod:poss", 133 "case", 134 "amod", 135 "nmod", 136 "case", 137 "nmod", 138 "punct" 139 ] 140 },
test.json有關係例項:
1 { 2 "id":"098f65f2e89007458d2d", 3 "relation":"org:top_members/employees", 4 "token":[ 5 "NDA", 6 "commercial", 7 "director", 8 "John", 9 "Clarke", 10 "said", 11 ":", 12 "``", 13 "The", 14 "NDA", 15 "has", 16 "enjoyed", 17 "a", 18 "successful", 19 "five-year", 20 "relationship", 21 "with", 22 "Westinghouse", 23 "." 24 ], 25 "subj_start":9, 26 "subj_end":9, 27 "obj_start":3, 28 "obj_end":4, 29 "subj_type":"ORGANIZATION", 30 "obj_type":"PERSON", 31 "stanford_pos":[ 32 "NNP", 33 "JJ", 34 "NN", 35 "NNP", 36 "NNP", 37 "VBD", 38 ":", 39 "``", 40 "DT", 41 "NNP", 42 "VBZ", 43 "VBN", 44 "DT", 45 "JJ", 46 "JJ", 47 "NN", 48 "IN", 49 "NNP", 50 "." 51 ], 52 "stanford_ner":[ 53 "ORGANIZATION", 54 "O", 55 "O", 56 "PERSON", 57 "PERSON", 58 "O", 59 "O", 60 "O", 61 "O", 62 "ORGANIZATION", 63 "O", 64 "O", 65 "O", 66 "O", 67 "DURATION", 68 "O", 69 "O", 70 "ORGANIZATION", 71 "O" 72 ], 73 "stanford_head":[ 74 "5", 75 "5", 76 "5", 77 "5", 78 "6", 79 "0", 80 "6", 81 "6", 82 "10", 83 "12", 84 "12", 85 "6", 86 "16", 87 "16", 88 "16", 89 "12", 90 "18", 91 "16", 92 "6" 93 ], 94 "stanford_deprel":[ 95 "compound", 96 "amod", 97 "compound", 98 "compound", 99 "nsubj", 100 "ROOT", 101 "punct", 102 "punct", 103 "det", 104 "nsubj", 105 "aux", 106 "ccomp", 107 "det", 108 "amod", 109 "amod", 110 "dobj", 111 "case", 112 "nmod", 113 "punct" 114 ] 115 },
Then prepare vocabulary and initial word vectors with:
python prepare_vocab.py dataset/tacred dataset/vocab --glove_dir dataset/glove
This will write vocabulary and word vectors as a numpy matrix into the dirdataset/vocab
.
我們先看主函式main( ),之後用到什麼函式再去詳細介紹對應的功能函式:
1 def main(): 2 args = parse_args() 3 4 # input files 5 train_file = args.data_dir + '/train.json' 6 dev_file = args.data_dir + '/dev.json' 7 test_file = args.data_dir + '/test.json' 8 wv_file = args.glove_dir + '/' + args.wv_file 9 wv_dim = args.wv_dim 10 11 # output files 12 helper.ensure_dir(args.vocab_dir) #Output vocab directory 不存在,建立一個資料夾 13 vocab_file = args.vocab_dir + '/vocab.pkl' # 14 emb_file = args.vocab_dir + '/embedding.npy' 15 16 # load files 17 print("loading files...") 18 train_tokens = load_tokens(train_file) 19 dev_tokens = load_tokens(dev_file) 20 test_tokens = load_tokens(test_file) 21 if args.lower: 22 train_tokens, dev_tokens, test_tokens = [[t.lower() for t in tokens] for tokens in\ 23 (train_tokens, dev_tokens, test_tokens)] 24 25 # load glove 26 print("loading glove...") 27 glove_vocab = vocab.load_glove_vocab(wv_file, wv_dim) 28 print("{} words loaded from glove.".format(len(glove_vocab))) 29 30 print("building vocab...") 31 v = build_vocab(train_tokens, glove_vocab, args.min_freq) 32 33 print("calculating oov...") #oov: Out-of-vocabulary 34 datasets = {'train': train_tokens, 'dev': dev_tokens, 'test': test_tokens} 35 for dname, d in datasets.items(): 36 total, oov = count_oov(d, v) 37 print("{} oov: {}/{} ({:.2f}%)".format(dname, oov, total, oov*100.0/total)) 38 39 print("building embeddings...") 40 embedding = vocab.build_embedding(wv_file, v, wv_dim) 41 print("embedding size: {} x {}".format(*embedding.shape)) 42 43 print("dumping to files...") 44 with open(vocab_file, 'wb') as outfile: 45 pickle.dump(v, outfile) 46 np.save(emb_file, embedding) 47 print("all done.")
第2行引數解析器:
1 def parse_args(): 2 parser = argparse.ArgumentParser(description='Prepare vocab for relation extraction.') 3 parser.add_argument('data_dir', help='TACRED directory.') 4 parser.add_argument('vocab_dir', help='Output vocab directory.') 5 parser.add_argument('--glove_dir', default='dataset/glove', help='GloVe directory.') 6 parser.add_argument('--wv_file', default='glove.840B.300d.txt', help='GloVe vector file.') 7 parser.add_argument('--wv_dim', type=int, default=300, help='GloVe vector dimension.') 8 parser.add_argument('--min_freq', type=int, default=0, help='If > 0, use min_freq as the cutoff.') 9 parser.add_argument('--lower', action='store_true', help='If specified, lowercase all words.') 10 #action=‘store_true’,只要執行時該變數有傳參就將該變數設為True。 11 args = parser.parse_args() 12 return args
其中data_dir與vocab_dir引數在terminal中已被賦值dataset/tacred dataset/vocab
第18-20行通過load_tokens( )函式將json檔案對應的資料轉為List形式的資料便於處理:
1 def load_tokens(filename): 2 with open(filename) as infile: 3 data = json.load(infile) 4 tokens = [] 5 for d in data: 6 ts = d['token'] 7 ss, se, os, oe = d['subj_start'], d['subj_end'], d['obj_start'], d['obj_end'] 8 # do not create vocab for entity words 9 ts[ss:se+1] = ['<PAD>']*(se-ss+1) 10 ts[os:oe+1] = ['<PAD>']*(oe-os+1) 11 tokens += list(filter(lambda t: t!='<PAD>', ts)) 12 print("{} tokens from {} examples loaded from {}.".format(len(tokens), len(data), filename)) 13 return tokens