Nltk: CoreNLPParser tag() sollte das Überladen von Eigenschaften ermöglichen

Erstellt am 10. Sept. 2018  ·  3Kommentare  ·  Quelle: nltk/nltk

Bei den aktuellen CoreNLPParser.tag() kommt die "Retokenization" von Stanford CoreNLP unerwartet:

>>> from nltk.parse.corenlp import CoreNLPParser
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> sent = ['my', 'phone', 'number', 'is', '1111', '1111', '1111']
>>> ner_tagger.tag(sent)
[('my', 'O'),
 ('phone', 'O'),
 ('number', 'O'),
 ('is', 'O'),
 ('1111\xa01111\xa01111', 'NUMBER')]

Das erwartete Verhalten sollte sein:

>>> from nltk.parse.corenlp import CoreNLPParser
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> sent = ['my', 'phone', 'number', 'is', '1111', '1111', '1111']
>>> ner_tagger.tag(sent)
[('my', 'O'), ('phone', 'O'), ('number', 'O'), ('is', 'O'), ('1111', 'DATE'), ('1111', 'DATE'), ('1111', 'DATE')]

Die vorgeschlagene Lösung besteht darin, das Überladen von properties Argumenten für .tag() und .tag_sents() zuzulassen, dh unter https://github.com/nltk/nltk/blob/develop/nltk/parse/ corenlp.py#L348 und verwenden standardmäßig properties = {'tokenize.whitespace':'true'} da wir die Token durch Leerzeichen in tag_sents() verketten.


    def tag_sents(self, sentences, properties=None):
        """
        Tag multiple sentences.

        Takes multiple sentences as a list where each sentence is a list of
        tokens.

        :param sentences: Input sentences to tag
        :type sentences: list(list(str))
        :rtype: list(list(tuple(str, str))
        """
        # Converting list(list(str)) -> list(str)
        sentences = (' '.join(words) for words in sentences)
        if properties == None:
            properties = {'tokenize.whitespace':'true'}
        return [sentences[0] for sentences in self.raw_tag_sents(sentences, properties)]

    def tag(self, sentence, properties=None):
        """
        Tag a list of tokens.

        :rtype: list(tuple(str, str))

        >>> parser = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
        >>> tokens = 'Rami Eid is studying at Stony Brook University in NY'.split()
        >>> parser.tag(tokens)
        [('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'),
        ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'O')]

        >>> parser = CoreNLPParser(url='http://localhost:9000', tagtype='pos')
        >>> tokens = "What is the airspeed of an unladen swallow ?".split()
        >>> parser.tag(tokens)
        [('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'),
        ('airspeed', 'NN'), ('of', 'IN'), ('an', 'DT'),
        ('unladen', 'JJ'), ('swallow', 'VB'), ('?', '.')]
        """
        return self.tag_sents([sentence], properties)[0]

    def raw_tag_sents(self, sentences, properties=None):
        """
        Tag multiple sentences.

        Takes multiple sentences as a list where each sentence is a string.

        :param sentences: Input sentences to tag
        :type sentences: list(str)
        :rtype: list(list(list(tuple(str, str)))
        """
        default_properties = {'ssplit.isOneSentence': 'true',
                              'annotators': 'tokenize,ssplit,' }

        default_properties.update(properties or {})

        # Supports only 'pos' or 'ner' tags.
        assert self.tagtype in ['pos', 'ner']
        default_properties['annotators'] += self.tagtype
        for sentence in sentences:
            tagged_data = self.api_call(sentence, properties=default_properties)
            yield [[(token['word'], token[self.tagtype]) for token in tagged_sentence['tokens']]
                    for tagged_sentence in tagged_data['sentences']]

Das sollte die Liste der von den Benutzern eingegebenen Zeichenfolgen-Token erzwingen.

Details zu https://stackoverflow.com/questions/52250268/why-do-corenlp-ner-tagger-and-ner-tagger-join-the-separated-numbers-together

Wenn wir .tag() erlauben, die Eigenschaften vor raw_tag_sents .tag() zu überladen, können Benutzer auch Fälle wie #1876 problemlos handhaben

bug goodfirstbug stanford api

Hilfreichster Kommentar

Sieht gut aus.

Nur ein paar kleine Anmerkungen. Es sollte if properties is None , nicht if properties == None . assert self.tagtype in ['pos', 'ner'] sollte assert self.tagtype in ['pos', 'ner'], "CoreNLP tagger supports only 'pos' or 'ner' tags." .

Ich mag die Idee, Strings zu verbinden und zu teilen, nicht wirklich, vielleicht gibt es eine Möglichkeit, eine Liste von Wörtern als Satz anstelle einer einfachen Zeichenfolge an CoreNLP zu übergeben.

Alle 3 Kommentare

Sieht gut aus.

Nur ein paar kleine Anmerkungen. Es sollte if properties is None , nicht if properties == None . assert self.tagtype in ['pos', 'ner'] sollte assert self.tagtype in ['pos', 'ner'], "CoreNLP tagger supports only 'pos' or 'ner' tags." .

Ich mag die Idee, Strings zu verbinden und zu teilen, nicht wirklich, vielleicht gibt es eine Möglichkeit, eine Liste von Wörtern als Satz anstelle einer einfachen Zeichenfolge an CoreNLP zu übergeben.

Hallo, ich möchte dies als meine erste Ausgabe aufgreifen.

Schön, dass Sie sich für das Thema interessieren. Wenn Sie Fragen haben, stellen Sie diese hier.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen