2

我对 spacy / textacy 还很陌生,而且我还有一项复杂的任务。非常感谢您的帮助。

简而言之,从“通过踢和推他来袭击护理人员”这样的句子中,我想确定所报告的虐待是否针对警察或其他工作人员(救护车、医院工作人员、交通管理员等)。

挑战是: - 官员写的语言不是标准的英语,而且句子有很多标点符号和其他错误。- 报告中经常省略主题,因此例如使用“textacy.extract.subject_verb_object_triples”不起作用,因为它找不到主题。(这里也不需要主题,因为我们已经知道该个人已被指控虐待,我们只想知道他们从所提供的文本中袭击了哪个类别的工人) - 文本可以包含许多提供其他上下文的句子或者它可能会在一个文本中列出对多种类型工人的多项虐待指控。

示例: 1. “确实喊叫、咒骂和威胁她的邻居,袭击了一名警察。” 2.“确实被逐出许可的场所,之后对他的妻子采取攻击性行为并推她。对门卫和其他人采取攻击性威胁的方式。拒绝逮捕。通过咬和踢来袭击警察。” 3.“被告当时确实在履行职责时打了 PC 史密斯,向他的脸猛击了一拳,但他没有受伤。” 4.“确实向目击者史密斯警员扔了手机”

我期望得到的是像 VERB,OBJECT (punch, PC Smith) 这样的东西,然后需要学习意味着是的,这是一名警察。复合对象可以是 PC(警察)、Sgt(萨金特)等

我试过这个:

import spacy
import textacy


nlp = spacy.load('en')
text = nlp(u'Did assault paramedic by kicking and pushing him')

text_ext = textacy.extract.subject_verb_object_triples(text)

但这仅在添加主题(我不需要)以及对象前面的“the”(护理人员)之后才有效。所以这句话变成了“被告确实通过踢和推他来袭击护理人员)。我有 55k 的陈述要开始,所以纠正语言是不可行的。

我该如何解决这个问题?谢谢

4

1 回答 1

0

一个好的起点是获取代码textacy.extract.subject_verb_object_triples()并对其进行修改以适用于您的数据(请注意,您的非标准句子可能不会以很好的依赖解析结束,也可以尝试en_core_web_lg)。从textacy.extract

def subject_verb_object_triples(doc):
    """
    Extract an ordered sequence of subject-verb-object (SVO) triples from a
    spacy-parsed doc. Note that this only works for SVO languages.
    Args:
        doc (:class:`spacy.tokens.Doc` or :class:`spacy.tokens.Span`)
    Yields:
        Tuple[:class:`spacy.tokens.Span`]: The next 3-tuple of spans from ``doc``
        representing a (subject, verb, object) triple, in order of appearance.
    """
    # TODO: What to do about questions, where it may be VSO instead of SVO?
    # TODO: What about non-adjacent verb negations?
    # TODO: What about object (noun) negations?
    if isinstance(doc, Span):
        sents = [doc]
    else:  # spacy.Doc
        sents = doc.sents

    for sent in sents:
        start_i = sent[0].i

        verbs = spacy_utils.get_main_verbs_of_sent(sent)
        for verb in verbs:
            subjs = spacy_utils.get_subjects_of_verb(verb)
            if not subjs:
                continue
            objs = spacy_utils.get_objects_of_verb(verb)
            if not objs:
                continue

            # add adjacent auxiliaries to verbs, for context
            # and add compounds to compound nouns
            verb_span = spacy_utils.get_span_for_verb_auxiliaries(verb)
            verb = sent[verb_span[0] - start_i : verb_span[1] - start_i + 1]
            for subj in subjs:
                subj = sent[
                    spacy_utils.get_span_for_compound_noun(subj)[0]
                    - start_i : subj.i
                    - start_i
                    + 1
                ]
                for obj in objs:
                    if obj.pos == NOUN:
                        span = spacy_utils.get_span_for_compound_noun(obj)
                    elif obj.pos == VERB:
                        span = spacy_utils.get_span_for_verb_auxiliaries(obj)
                    else:
                        span = (obj.i, obj.i)
                    obj = sent[span[0] - start_i : span[1] - start_i + 1]

                    yield (subj, verb, obj)
于 2019-11-29T14:54:16.647 回答