Beispiel #1
0
    def makeReplacement(self, currentDocumentOrig):

        currentDocument = copy.deepcopy(currentDocumentOrig)

        modifiedDocumentText = currentDocument.documentTrailingSpacesWords
        modifiedDocumentWordReplacementsDict = currentDocument.wordReplacementsDict
        modifiedDocumentAvailableReplacements = currentDocument.availableReplacements

        replacementsCount = math.floor(
            self.replacements *
            len(currentDocument.documentTrailingSpacesWords))

        # Skipping for the mutant
        # if len(modifiedDocumentWordReplacementsDict) > self.replacementsLimit * len(modifiedDocumentText):
        #     return currentDocumentOrig

        i = 0
        while i < replacementsCount:

            # If the available replacements dictionary is empty then stop the process for this mutant
            # and return the parent
            try:
                randomPosition = random.choice(
                    modifiedDocumentAvailableReplacements)
            except:
                return currentDocumentOrig

            # To make sure that a word chose once is never chosen again
            try:
                (randomWord,
                 posTag) = currentDocumentOrig.documentTrailingSpacesWords[
                     randomPosition]
            except Exception as e:
                modifiedDocumentAvailableReplacements.remove(randomPosition)
                continue

            if posTag not in self.allowedPOStags:
                modifiedDocumentAvailableReplacements.remove(randomPosition)
                continue

            if randomWord[-1] == ' ':
                tempRandomWord = randomWord[:-1]
                try:
                    replacement = random.choice(
                        self.neighboursDictionary[tempRandomWord])
                except:
                    modifiedDocumentAvailableReplacements.remove(
                        randomPosition)
                    continue

                replacementPOSTag = getPOStag(replacement)
                replacement = replacement + ' '

            else:
                tempRandomWord = randomWord
                try:
                    replacement = random.choice(
                        self.neighboursDictionary[tempRandomWord])
                except:
                    modifiedDocumentAvailableReplacements.remove(
                        randomPosition)
                    continue

                replacementPOSTag = getPOStag(replacement)

            modifiedDocumentText[randomPosition] = (replacement,
                                                    replacementPOSTag)

            try:
                modifiedDocumentWordReplacementsDict[randomPosition].append(
                    (randomWord, replacement))
                # print(modifiedDocumentWordReplacementsDict[randomPosition])
            except KeyError:
                modifiedDocumentWordReplacementsDict[randomPosition] = [
                    (randomWord, replacement)
                ]

            i += 1

        updatedText = ''
        for i in range(len(modifiedDocumentText)):
            (reqWord, _) = modifiedDocumentText[i]
            updatedText += reqWord

        modifiedDocument = Document(updatedText)
        modifiedDocument.wordReplacementsDict.update(
            modifiedDocumentWordReplacementsDict)
        modifiedDocument.availableReplacements = modifiedDocumentAvailableReplacements
        return modifiedDocument