1  import sys 
  2  from SentenceExampleWriter import SentenceExampleWriter 
  3  import Utils.ElementTreeUtils as ETUtils 
  4  from Core.IdSet import IdSet 
  5  import types 
  6  import itertools 
  7       
 11           
 12 -    def writeXML(self, examples, predictions, corpus, outputFile, classSet=None, parse=None, tokenization=None, goldCorpus=None, exampleStyle=None): 
  13          """ 
 14          Writes task 3 examples to interaction XML. Assumes task 3 classification 
 15          is done with SVMMulticlass Classifier, used for two classes. 
 16          """ 
 17          print >> sys.stderr, "Adding task 3 to Interaction XML" 
 18          examples, predictions = self.loadExamples(examples, predictions) 
 19           
 20          if type(classSet) == types.StringType:  
 21              classSet = IdSet(filename=classSet) 
 22          classIds = None 
 23          if classSet != None: 
 24              classIds = classSet.getIds() 
 25   
 26          corpusTree = ETUtils.ETFromObj(corpus) 
 27          corpusRoot = corpusTree.getroot() 
 28           
 29           
 30          task3Type = None 
 31          for example in examples: 
 32              assert example[3].has_key("t3type") 
 33              task3Type = example[3]["t3type"] 
 34              break         
 35          if task3Type == None: 
 36              if outputFile != None: 
 37                  print >> sys.stderr, "Writing corpus to", outputFile 
 38                  ETUtils.write(corpusRoot, outputFile) 
 39              return corpusTree 
 40          assert task3Type in ["multiclass", "speculation", "negation"] 
 41           
 42           
 43          for entity in corpusRoot.getiterator("entity"): 
 44              if task3Type == "multiclass": 
 45                  entity.set("speculation", "False") 
 46                  entity.set("negation", "False") 
 47              elif task3Type == "speculation": 
 48                  entity.set("speculation", "False") 
 49              else:  
 50                  entity.set("negation", "False") 
 51           
 52          specMap = {} 
 53          negMap = {} 
 54          for example, prediction in itertools.izip(examples, predictions): 
 55              assert example[3]["xtype"] == "task3" 
 56              if example[3]["t3type"] == "multiclass": 
 57                  predictedClassName = classSet.getName(prediction[0]) 
 58                  if predictedClassName != "neg": 
 59                      predictedModifiers = predictedClassName.split("---") 
 60                      if "negation" in predictedModifiers: 
 61                          assert not negMap.has_key(example[3]["entity"]) 
 62                          negMap[example[3]["entity"]] = (True, prediction) 
 63                      if "speculation" in predictedModifiers: 
 64                          assert not specMap.has_key(example[3]["entity"]) 
 65                          specMap[example[3]["entity"]] = (True, prediction) 
 66              else: 
 67                  if example[3]["t3type"] == "speculation": 
 68                      map = specMap 
 69                  else: 
 70                      map = negMap 
 71                  if prediction[0] != 1: 
 72                      assert not map.has_key(example[3]["entity"]) 
 73                      map[example[3]["entity"]] = (True, prediction) 
 74                  else: 
 75                      assert not map.has_key(example[3]["entity"]) 
 76                      map[example[3]["entity"]] = (False, prediction) 
 77           
 78          for entity in corpusRoot.getiterator("entity"): 
 79              eId = entity.get("id") 
 80              if task3Type == "multiclass": 
 81                  if specMap.has_key(eId): 
 82                      entity.set("speculation", str(specMap[eId][0])) 
 83                      entity.set("modPred", self.getPredictionStrengthString(specMap[eId][1], classSet, classIds)) 
 84                  if negMap.has_key(eId): 
 85                      entity.set("negation", str(negMap[eId][0])) 
 86                      entity.set("modPred", self.getPredictionStrengthString(negMap[eId][1], classSet, classIds)) 
 87              else: 
 88                  if task3Type == "speculation": 
 89                      if specMap.has_key(eId): 
 90                          entity.set("speculation", str(specMap[eId][0])) 
 91                          entity.set("specPred", self.getPredictionStrengthString(specMap[eId][1], classSet, classIds, [""])) 
 92                  elif task3Type == "negation": 
 93                      if negMap.has_key(eId): 
 94                          entity.set("negation", str(negMap[eId][0])) 
 95                          entity.set("negPred", self.getPredictionStrengthString(negMap[eId][1], classSet, classIds, ["","speculation"])) 
 96           
 97           
 98          if outputFile != None: 
 99              print >> sys.stderr, "Writing corpus to", outputFile 
100              ETUtils.write(corpusRoot, outputFile) 
101          return corpusTree 
  102