Пример #1
0
def grammar(**kwargs):
    return adjective.grammar(**kwargs) | preposition.grammar(**kwargs) | {
        # Raw nouns
        Rule("NOUN^", [NounParser(is_plural=False)], passthru),

        Rule("NOUNS^", [NounParser(is_plural=True)], passthru),

        # Nouns without prepositions
        Rule("NOUN", [RuleRef('NOUN^')], passthru),

        Rule("NOUNS", [RuleRef('NOUNS^')], passthru),

        # Nouns with prepositions (the car of (the owner of the building))
        Rule("NOUN", [RuleRef('NOUN^'), RuleRef('PP')],
            lambda state, data: data[1] + Interpretation(local=data[0].local.with_preposition_phrase(data[1].local))),

        Rule("NOUNS", [RuleRef('NOUNS^'), RuleRef('PP')],
            lambda state, data: data[1] + Interpretation(local=data[0].local.with_preposition_phrase(data[1].local))),
        
        Rule("NOUN", [RuleRef('ADJECTIVE'), RuleRef('NOUN')],
            lambda state, data: data[1] + Interpretation(local=data[1].local.with_adjective(data[0].local))),

        Rule("NOUNS", [RuleRef('ADJECTIVE'), RuleRef('NOUNS')],
            lambda state, data: data[1] + Interpretation(local=data[1].local.with_adjective(data[0].local))),

        Rule("NOUN*", [RuleRef('NOUN')], passthru),
        Rule("NOUN*", [RuleRef('NOUNS')], passthru),
    }
Пример #2
0
def grammar(assumptions=True, **kwargs):
    return and_rules('EXPANDED_SPECIFIC_CLAIMS', 'EXPANDED_SPECIFIC_CLAIM', accept_singular=True) \
    | and_rules('EXPANDED_SPECIFIC_CLAIMS_GENERAL_FIRST', 'EXPANDED_SPECIFIC_CLAIM', first_singleton='EXPANDED_GENERAL_CLAIM') \
    | and_rules('EXPANDED_SPECIFIC_CLAIMS_GENERAL_LAST', 'EXPANDED_SPECIFIC_CLAIM', last_singleton='EXPANDED_GENERAL_CLAIM') \
    | and_rules('SUPPORTS', 'SUPPORT', accept_singular=True) \
    | and_rules('ATTACKS', 'ATTACK', accept_singular=True) \
    | {
        Rule('ARGUMENT', [RuleRef('SENTENCE')],
            lambda state, data: data[0]),

        Rule('ARGUMENT', [RuleRef('ARGUMENT'), RuleRef('SENTENCE')],
            lambda state, data: data[0] + data[1]),


        Rule('SENTENCE', [RuleRef('EXPANDED_SPECIFIC_CLAIM'), Literal('.')],
            lambda state, data: data[0]),

        Rule('EXPANDED_SPECIFIC_CLAIM', [RuleRef('SPECIFIC_CLAIM'), RuleRef('SUPPORTS'), RuleRef('ATTACKS')],
            expanded_claim),

        # We use CONDITIONAL_CLAIM instead of GENERAL_CLAIM here because a conditional claim is a more specific
        # structure that can contain a general claim, and that is why it has to be above general claim in the
        # hierarchy. And hey, in a sense a general claim is also a conditional claim because for a general claim
        # to be applicable the subject has to match the group of the subject of the general claim, making it
        # more or less a conditional claim, right?
        Rule('EXPANDED_GENERAL_CLAIM', [RuleRef('CONDITIONAL_CLAIM'), RuleRef('SUPPORTS'), RuleRef('ATTACKS')],
            expanded_claim),

        Rule('SUPPORT', [Literal('because'), RuleRef('EXPANDED_SPECIFIC_CLAIMS')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.SUPPORT, specifics=data[1].local, make_assumptions=assumptions))),

        Rule('SUPPORT', [Literal('because'), RuleRef('EXPANDED_SPECIFIC_CLAIMS_GENERAL_FIRST')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.SUPPORT, conditional=data[1].local[0], specifics=data[1].local[1:], make_assumptions=assumptions))),

        Rule('SUPPORT', [Literal('because'), RuleRef('EXPANDED_SPECIFIC_CLAIMS_GENERAL_LAST')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.SUPPORT, conditional=data[1].local[-1], specifics=data[1].local[0:-1], make_assumptions=assumptions))),

        Rule('SUPPORT', [Literal('because'), RuleRef('EXPANDED_GENERAL_CLAIM')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.SUPPORT, conditional=data[1].local, make_assumptions=assumptions))),

        Rule('SUPPORTS', [],
            lambda state, data: Interpretation()),

        Rule('ATTACK', [Expression(r'^except|but$'), RuleRef('EXPANDED_SPECIFIC_CLAIMS')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.ATTACK, specifics=data[1].local, make_assumptions=assumptions))),

        Rule('ATTACK', [Expression(r'^except|but$'), RuleRef('EXPANDED_SPECIFIC_CLAIMS_GENERAL_FIRST')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.ATTACK, conditional=data[1].local[0], specifics=data[1].local[1:], make_assumptions=assumptions))),

        Rule('ATTACK', [Expression(r'^except|but$'), RuleRef('EXPANDED_SPECIFIC_CLAIMS_GENERAL_LAST')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.ATTACK, conditional=data[1].local[-1], specifics=data[1].local[0:-1], make_assumptions=assumptions))),

        Rule('ATTACK', [Expression(r'^except|but$'), RuleRef('EXPANDED_GENERAL_CLAIM')],
            lambda state, data: data[1] + Interpretation(local=PartialRelation(Relation.ATTACK, conditional=data[1].local, make_assumptions=assumptions))),

        Rule('ATTACKS', [],
            lambda state, data: Interpretation()),
    }
def interpret():
    model = request.args.get('model')
    text = request.args.get('text')
    if model == "sentiment":
        interpretation = Interpretation(sentiment_clf, model, text)
    elif model == "sarcasm":
        interpretation = Interpretation(sarcasm_clf, model, text)
    else:
        print("ERROR: {} model not recognized".format(model))
    return render_template('interpret.html', interpretation=interpretation)
Пример #4
0
def blob_conditional_claim(state, data):
    subject = Instance()
    verb = None
    object = None
    claim = GeneralBlob(subject, verb, object, data[0])
    argument = Argument(instances={subject: {subject}},
                        claims={claim: {claim}})
    return Interpretation(argument=argument, local=claim)
Пример #5
0
def grammar(**kwargs):
    return and_rules('SPECIFIC_CLAIMS', 'SPECIFIC_CLAIM', accept_singular=True) \
    | and_rules('SPECIFIC_CLAIMS_CONDITIONAL_FIRST', 'SPECIFIC_CLAIM', first_singleton='CONDITIONAL_CLAIM') \
    | and_rules('SPECIFIC_CLAIMS_CONDITIONAL_LAST', 'SPECIFIC_CLAIM', last_singleton='CONDITIONAL_CLAIM') \
    | {
        Rule('ARGUMENT', [RuleRef('SENTENCE')],
            lambda state, data: data[0]),

        Rule('ARGUMENT', [RuleRef('ARGUMENT'), RuleRef('SENTENCE')],
            lambda state, data: data[0] + data[1]),


        Rule('SENTENCE', [RuleRef('SUPPORTED_CLAIM'), Literal('.')],
            lambda state, data: data[0]),

        Rule('SENTENCE', [RuleRef('ATTACKED_CLAIM'), Literal('.')],
            lambda state, data: data[0]),


        Rule('SUPPORTED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, specifics=data[2].local), local=data[0].local)),

        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM_WITH_WARRANT')],
            lambda state, data: data[0]),

        Rule('SUPPORTED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_FIRST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, general=data[2].local[0], specifics=data[2].local[1:]), local=data[0].local)),

        Rule('SUPPORTED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_LAST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, general=data[2].local[-1], specifics=data[2].local[:-1]), local=data[0].local)),


        Rule('ATTACKED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, specifics=data[2].local), local=data[0].local)),

        Rule('ATTACKED_CLAIM', [RuleRef('ATTACKED_CLAIM_WITH_WARRANT')],
            lambda state, data: data[0]),

        Rule('ATTACKED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_FIRST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, general=data[2].local[0], specifics=data[2].local[1:]), local=data[0].local)),

        Rule('ATTACKED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_LAST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, general=data[2].local[-1], specifics=data[2].local[:-1]), local=data[0].local)),

        # Experimental, don't know if I want this
        # Rule('SUPPORTED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('CONDITIONAL_CLAIM')],
        #     lambda state, data: data[0] + data[2] + assume(data[0].local, data[2].local)),

        # Attacking a warrant?
        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, specifics=data[2].local))),

        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM_WITH_WARRANT'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, warrant_relation(data[0]), specifics=data[2].local)))
    }
Пример #6
0
def grammar(**kwargs):
    return noun.grammar(**kwargs) | {
        Rule(
            "PROTOTYPE", [Expression(r'^every|an?$'),
                          RuleRef("NOUN")],
            lambda state, data: data[1] + Interpretation(local=Prototype(
                data[1].local, article=data[0].local))),
        Rule(
            "PROTOTYPES", [RuleRef("NOUNS")], lambda state, data: data[0] +
            Interpretation(local=Prototype(data[0].local))),
        Rule(
            "PROTOTYPES",
            [Expression(r'^all|most|many|some$'),
             RuleRef("NOUNS")], lambda state, data: data[0] + Interpretation(
                 local=Prototype(data[1].local, article=data[0].local))),
        Rule("PROTOTYPE*", [RuleRef("PROTOTYPE")], passthru),
        Rule("PROTOTYPE*", [RuleRef("PROTOTYPES")], passthru),
    }
Пример #7
0
def and_rules(name: str, singleton: str, accept_singular: bool = False, first_singleton: Optional[str] = None, last_singleton: Optional[str] = None) -> Set[Rule]:
    """
    Creates a mini-grammar of rules that are needed to parse 'A and B',
    'A, B and C', 'A, B, C and D', etc. where A, B, C and D all are parseable
    using the rule name passed using the singleton argument.

    Grammar:

        <As> ::= A_helper `and' A_last
        <A_helper> ::= A_helper `,' A
        <A_helper> ::= A_first
        <As> ::= A
    
    """
    if last_singleton is None:
        last_singleton = singleton

    if first_singleton is None:
        first_singleton = singleton

    helper = name + "_"
    
    rules = {
        # _ and C
        Rule(name, [RuleRef(helper), Literal('and'), RuleRef(last_singleton)],
            lambda state, data: data[0] + data[2] + Interpretation(local=data[0].local | OrderedSet([data[2].local]))),

        # A, B # (allows for 'A, B and C')
        Rule(helper, [RuleRef(helper), Literal(','), RuleRef(singleton)],
            lambda state, data: data[0] + data[2] + Interpretation(local=data[0].local | OrderedSet([data[2].local]))),

        # A (allows for 'A and B')
        Rule(helper, [RuleRef(first_singleton)],
            lambda state, data: data[0] + Interpretation(local=OrderedSet([data[0].local])))
    }

    if accept_singular:
        rules |= {
            Rule(name, [RuleRef(singleton)],
                lambda state, data: data[0] + Interpretation(local=OrderedSet([data[0].local])))
        }

    return rules
Пример #8
0
def grammar(**kwargs):
    return {
        Rule('PREPOSITION', [PrepositionSymbol()], passthru),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('INSTANCE*')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('PROTOTYPE*')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('CATEGORY')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
    }
Пример #9
0
def assume(claim, general):
    assumption = SpecificClaim(claim.subject,
                               'is',
                               general.subject.singular,
                               assumption=True)
    argument = Argument(claims={assumption: {assumption}})
    argument += relation(Relation.SUPPORT,
                         claim,
                         general=general,
                         specifics={assumption})
    return Interpretation(argument=argument, local=claim)
Пример #10
0
class Solver:
    def __init__(self, input_data):
        Interpretation.problem = input_data.clauses  # Set static variable problem for Interpretation class

        self.best_interpretation = Interpretation(num_vars=input_data.num_vars)
        self.best_cost = self.best_interpretation.cost()

    def solve(
        self
    ):  # Greedy search with random initialisation, finding the best neighbour every time
        for i in range(max_tries):
            if self.best_cost != 0:
                neighbour = self.best_interpretation.best_neighbour()
                if neighbour.cost() < self.best_cost:
                    self.best_interpretation = neighbour
                    self.best_cost = self.best_interpretation.cost()
        return self.best_interpretation

    def show(self):
        print("c SAT")
        print("s SATISFIABLE")
        self.best_interpretation.show()
Пример #11
0
def general_claim_singular(state, data):
    scope = Scope()
    subj = Instance(pronoun=Span('something'), scope=scope)
    condition = SpecificClaim(subj, Verb('is'), data[0].local.singular, scope=scope)
    claim = GeneralClaim(subj, data[1].local, data[2].local, scope=scope)
    relation = Relation({condition}, claim, Relation.CONDITION)
    return data[0] + data[2] + Interpretation(
        argument=Argument(
            claims={claim: {claim}, condition: {condition}},
            relations={relation},
            instances={subj: {subj}}
        ),
        local=claim)
Пример #12
0
def expanded_general_claim(state, data):
    assert len(data[0].argument.claims) == 2
    assert len(data[0].argument.relations) == 1
    
    claim = data[0].local
    conditions = set(claim.update(scope=data[0].local.scope) for claim in data[2].local)
    remaining_claims = set(data[0].argument.claims.keys()) ^ {claim}
    relation = Relation(remaining_claims | conditions , claim, Relation.CONDITION)
    return data[0] + data[2] + Interpretation(
        argument=Argument(
            claims={condition: {condition} for condition in conditions},
            relations={relation},
            instances={condition.subject: {condition.subject} for condition in conditions}
        ),
        local=claim)
Пример #13
0
def undetermined_claim(state, data):
    scope = Scope()
    conditions = set(claim.update(scope=scope) for claim in data[2].local)
    claim = GeneralClaim.from_claim(data[0].local, scope=scope, conj=data[1].local)
    relation = Relation(conditions, claim, Relation.CONDITION)
    return data[0] + data[2] + Interpretation(
        argument=Argument(
            claims={
                claim: {claim}, 
                **{condition: {condition} for condition in conditions}
            },
            relations={relation},
            instances={
                claim.subject: {claim.subject},
                **{condition.subject: {condition.subject} for condition in conditions}
            }
        ),
        local=claim)
Пример #14
0
 def from_names_rule(cls, state, data):
     instances = {Instance(name=name) for name in data[0].local}
     instance=cls(instances=instances)
     return data[0] + Interpretation(local=instance, argument=Argument(instances={instance: {instance}}))
Пример #15
0
 def from_pronoun_rule(cls, state, data):
     instance = cls(pronoun=data[0].local)
     return data[0] + Interpretation(local=instance, argument=Argument(instances={instance: {instance}}))
Пример #16
0
 def from_noun_rule(cls, state, data):
     instance = cls(noun=data[1].local) # because 'the'
     return data[1] + Interpretation(argument=Argument(instances={instance: {instance}}), local=instance)
Пример #17
0
 def from_name_rule(cls, state, data):
     instance = cls(name=data[0].local)
     return data[0] + Interpretation(argument=Argument(instances={instance: {instance}}), local=instance)
Пример #18
0
 def from_rule(cls, state, data):
     claim = cls(data[0].local, data[1].local, data[2].local)
     return data[0] + data[1] + data[2] + Interpretation(
         argument=Argument(claims={claim: {claim}}), local=claim)
Пример #19
0
    def instantiate(self, claim, context):
        relation = Relation(sources={}, target=claim, type=self.type)
        argument = Argument(relations={relation})

        if self.specifics is not None:
            instances = OrderedDict()
            claims = OrderedDict()
            for specific in self.specifics:
                # If we're connecting to a scoped statement, make sure we have the right scope
                if claim.scope and specific.scope != claim.scope:
                    scoped_specific = specific.update(scope=claim.scope)
                    relation.sources.add(scoped_specific)
                    instances[scoped_specific.subject] = {
                        scoped_specific.subject, specific.subject
                    }
                    claims[scoped_specific] = {scoped_specific, specific}
                else:
                    relation.sources.add(specific)
            argument = argument + Argument(instances=instances, claims=claims)

        if self.make_assumptions and self.conditional is not None:
            argument = argument + Argument(relations={
                Relation([self.conditional], relation, Relation.SUPPORT)
            })
            conditions = find_conditions(self.conditional, context)
            if len(conditions) > 0:
                assumptions = []
                for condition in conditions:
                    params = {
                        'subject': claim.subject,
                        'verb': condition.verb.for_subject(claim.subject),
                    }

                    if condition.verb.literal in ('is', 'are'):
                        params['object'] = getattr(
                            condition.object, claim.subject.grammatical_number)

                    assumptions.append(condition.assume(**params))

                argument = argument + Argument(claims=dict(
                    (assumption, {assumption}) for assumption in assumptions))
                relation.sources.update(assumptions)

        if self.make_assumptions and self.conditional is None and self.specifics is not None:
            """
            Make a general assumption in the trend of 'When Tweety can fly
            because she is a bird, anything that is a bird can fly.'
            """
            scope = Scope()
            subject = Instance(pronoun=Span('something'), scope=scope)

            if self.type == Relation.SUPPORT:
                object = claim.object
            elif self.type == Relation.ATTACK:
                object = Negation(
                    claim.object
                )  #is this ok? Or are we jumping to conclusions?
            else:
                assert False, "Can't deal with this kind of relation"

            conditional = GeneralClaim(subject,
                                       claim.verb,
                                       object,
                                       scope=scope,
                                       assumption=True)
            assumptions = []

            for specific in self.specifics:
                if claim.subject.could_be(specific.subject):
                    assumptions.append(
                        specific.update(id=None,
                                        subject=conditional.subject,
                                        scope=scope))

            if len(assumptions) > 0:
                argument = argument + Argument(
                    instances={subject: {subject}},
                    claims={
                        conditional: {conditional},
                        **{
                            assumption: {assumption}
                            for assumption in assumptions
                        }
                    },
                    relations={
                        Relation([conditional], relation, Relation.SUPPORT),
                        Relation(assumptions, conditional, Relation.CONDITION)
                    })

        if len(relation.sources) == 0:
            raise Exception(
                "No specific claim or assumption to link the conditional claim to"
            )

        return Interpretation(argument=argument, local=claim)
Пример #20
0
    def __init__(self, input_data):
        Interpretation.problem = input_data.clauses  # Set static variable problem for Interpretation class

        self.best_interpretation = Interpretation(num_vars=input_data.num_vars)
        self.best_cost = self.best_interpretation.cost()
Пример #21
0
        """
			The interpretation phase, although closely related to the evaluation phase, includes a more fine-grained understanding of the latent variables. The main goal of the interpretation 
			phase is to go beyond the latent variables and understand the latent variables in the context of the domain under study. This phase is highly depending on the research question 
			that we would want to have answered. What topics are present, how are they distributed over time, and how are they related to other topics are possible ways to explore the output 
			of the LDA analysis. Similarly to the evaluation phase, aiming for a deeper understanding of the topics might also result in flaws in the analysis. For example, a visualization of 
			the topics that places two very distinct topics in close proximity, high probability of a topic in a document that does not cover aspects of that topic, or topics that should not 
			co-occur together are indicators of flaws or areas of improvements. In such cases, it would be wise to revisit the pre-processing phase and to re-run the analysis with, for instance, 
			different model parameters or pre-processing steps.

			IMPORTANT
			
			Remember to label the words in the topics that were created during the evaluation phase. Update the function get_topic_label in helper_functions to reflect the correct number of labels.
		"""

        # instantiate interpretation class
        interpretation = Interpretation()

        # infer the documen topic distribution per publication
        interpretation.infer_document_topic_distribution()

        # # obtain list of document titles per topic
        interpretation.get_document_title_per_topic()

        # # plot topics over time
        interpretation.plot_topics_over_time()

        # # plot topics over time stacked
        interpretation.plot_topics_over_time_stacked()

        # plot topic co-occurrence
        interpretation.plot_topic_co_occurrence()
Пример #22
0
 def from_noun_rule(cls, state, data):
     instance = cls(noun=data[1].local)  # 1 because of the 'the' at pos 0.
     return data[1] + Interpretation(local=instance, argument=Argument(instances={instance: {instance}}))
Пример #23
0
 def finish(self, literal: str, position: int, state: 'State'):
     span = super().finish(literal, position, state)
     return Interpretation(local=Noun(span, self.is_plural))
Пример #24
0
 def finish(self, literal: str, position: int, state: State):
     return Interpretation(local=Verb(literal))
Пример #25
0
 def from_rule(cls, state, data):
     if isinstance(data[1].local, cls):
         neg = data[1].local.object  # Unwrap double negations
     else:
         neg = cls(data[1].local)
     return data[1] + Interpretation(local=neg)