Формат вывода Google Cloud API в Python - PullRequest
0 голосов
/ 05 мая 2020

Если я вызываю функцию analyse_syntax из библиотеки Google Cloud Python, она возвращает

document = types.Document(content='Tried this', type=enums.Document.Type.PLAIN_TEXT)
info = client.analyze_syntax(document=document)
print(info)
sentences {
  text {
    content: "Tried this"
    begin_offset: -1
  }
}
tokens {
  text {
    content: "Tried"
    begin_offset: -1
  }
  part_of_speech {
    tag: VERB
    mood: INDICATIVE
    tense: PAST
  }
  dependency_edge {
    label: ROOT
  }
  lemma: "try"
}
tokens {
  text {
    content: "this"
    begin_offset: -1
  }
  part_of_speech {
    tag: DET
    number: SINGULAR
  }
  dependency_edge {
    label: DOBJ
  }
  lemma: "this"
}
language: "en"
print(info.tokens)
[text {
  content: "Tried"
  begin_offset: -1
}
part_of_speech {
  tag: VERB
  mood: INDICATIVE
  tense: PAST
}
dependency_edge {
  label: ROOT
}
lemma: "try"
, text {
  content: "this"
  begin_offset: -1
}
part_of_speech {
  tag: DET
  number: SINGULAR
}
dependency_edge {
  label: DOBJ
}
lemma: "this"
]
print(info.tokens[0].part_of_speech)
tag: VERB
mood: INDICATIVE
tense: PAST

который для меня это странный формат, потому что:

  • Я не могу выполнять итерацию по (как выглядит) клавишам for key in info.tokens[0].part_of_speech: дает TypeError: 'PartOfSpeech' object is not iterable.

  • Доступ к значениям не работает, как я думал: info.tokens[0].part_of_speech.tag дает значение 11.

ВОПРОС : Что это за тип объекта и как он работает?

Я хотел иметь возможность преобразовать его в словарь (лучше, чем сначала преобразовать в строку) или как-то перебрать его (найти, какие ключи у него есть и там соответствующие значения).

1 Ответ

1 голос
/ 08 мая 2020

Первое, что вы можете сделать, чтобы получить тип объекта в python, - это вызвать встроенную функцию type ()

part_of_speech_0 = info.tokens[0].part_of_speech
print(type(part_of_speech_0))

Что вы увидите возвращается как результат

<class 'google.cloud.language_v1.types.PartOfSpeech'>

Это класс, определенный в собственной библиотеке NLP Google Cloud.

Вы также можете посмотреть, какие атрибуты имеет этот класс, используя также встроенные функции. в функции dir ():

print(dir(part_of_speech_0))

Это приводит к:

['ACCUSATIVE', 'ACTIVE', 'ADJ', 'ADNOMIAL', 'ADP', 'ADV', 'ADVERBIAL', 'AFFIX', 'ASPECT_UNKNOWN', 'AUXILIARY', 'Aspect', 'ByteSize', 'CASE_UNKNOWN', 'CAUSATIVE', 'COMPLEMENTIVE', 'COMPLEMENTIZER', 'CONDITIONAL_MOOD', 'CONDITIONAL_TENSE', 'CONJ', 'Case', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DATIVE', 'DESCRIPTOR', 'DET', 'DUAL', 'DiscardUnknownFields', 'Extensions', 'FEMININE', 'FINAL_ENDING', 'FIRST', 'FORM_UNKNOWN', 'FUTURE', 'FindInitializationErrors', 'Form', 'FromString', 'GENDER_UNKNOWN', 'GENITIVE', 'GERUND', 'Gender', 'HasExtension', 'HasField', 'IMPERATIVE', 'IMPERFECT', 'IMPERFECTIVE', 'INDICATIVE', 'INSTRUMENTAL', 'INTERROGATIVE', 'IRREALIS', 'IsInitialized', 'JUSSIVE', 'LOCATIVE', 'LONG', 'ListFields', 'MASCULINE', 'MOOD_UNKNOWN', 'MergeFrom', 'MergeFromString', 'Mood', 'NEUTER', 'NOMINATIVE', 'NON_RECIPROCAL', 'NOT_PROPER', 'NOUN', 'NUM', 'NUMBER_UNKNOWN', 'Number', 'OBLIQUE', 'ORDER', 'PARTITIVE', 'PASSIVE', 'PAST', 'PERFECTIVE', 'PERSON_UNKNOWN', 'PLUPERFECT', 'PLURAL', 'PREPOSITIONAL', 'PRESENT', 'PROGRESSIVE', 'PRON', 'PROPER', 'PROPER_UNKNOWN', 'PRT', 'PUNCT', 'ParseFromString', 'Person', 'Proper', 'REALIS', 'RECIPROCAL', 'RECIPROCITY_UNKNOWN', 'REFLEXIVE_CASE', 'REFLEXIVE_PERSON', 'RELATIVE_CASE', 'Reciprocity', 'RegisterExtension', 'SECOND', 'SHORT', 'SINGULAR', 'SPECIFIC', 'SUBJUNCTIVE', 'SerializePartialToString', 'SerializeToString', 'SetInParent', 'TENSE_UNKNOWN', 'THIRD', 'Tag', 'Tense', 'UNKNOWN', 'UnknownFields', 'VERB', 'VOCATIVE', 'VOICE_UNKNOWN', 'Voice', 'WhichOneof', 'X', '_CheckCalledFromGeneratedFile', '_SetListener', '__class__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '_extensions_by_name', '_extensions_by_number', 'aspect', 'case', 'form', 'gender', 'mood', 'number', 'person', 'proper', 'reciprocity', 'tag', 'tense', 'voice']

Как видите, этот объект, похоже, имеет в качестве атрибутов все возможные ключи и значения того, что может выглядеть как словарь. Если вы дополнительно изучите такие атрибуты, как «VERB» или «tag», вы увидите, что все они являются целыми числами. Этот объект хранит информацию путем сопоставления целого числа ключа с целым числом, поэтому 'tag' возвращает '11', потому что это именно целое число, связанное с 'VERB' (вы можете проверить это также с помощью 'mood' и «ИНДИКАТИВНЫЙ» (оба - «3»), «напряженное» и «ПРОШЛОЕ» (оба - «3»)). Напротив, те ключи, которые не имеют связанного значения (например, «человек» или «пол»), получают значение 0.

Теперь, возвращаясь к способу итерации этого элемента, вы можете видеть, что строка, возвращаемая при вызове 'part_of_speech_0', имеет структуру, подобную YAML . таким образом, вы можете превратить его в словарь, загрузив его с помощью модуля yaml в python. Вот последний полный код, который выводит итерацию пар (ключ, значение) в 'part_of_speech':

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
import yaml


client = language.LanguageServiceClient()

document = types.Document(content='Tried this', type=enums.Document.Type.PLAIN_TEXT)

info = client.analyze_syntax(document=document)
part_of_speech_0 = info.tokens[0].part_of_speech

part_0_yaml = yaml.load(str(part_of_speech_0))
#casts part_of_speech into a string and loads that into a dictionary assuming YAML structure


for key, value in part_0_yaml.items():
    print('key: {}, value: {}'.format(key, value))
#iterates the created dictionary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...