forked from googleapis/google-cloud-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocument.py
More file actions
146 lines (114 loc) · 4.85 KB
/
Copy pathdocument.py
File metadata and controls
146 lines (114 loc) · 4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# Copyright 2016 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Definition for Google Cloud Natural Language API documents.
A document is used to hold text to be analyzed and annotated.
"""
from gcloud.language.entity import Entity
DEFAULT_LANGUAGE = 'en'
"""Default document language, English."""
class Encoding(object):
"""Document text encoding types."""
NONE = 'NONE'
"""Unspecified encoding type."""
UTF8 = 'UTF8'
"""UTF-8 encoding type."""
UTF16 = 'UTF16'
"""UTF-16 encoding type."""
UTF32 = 'UTF32'
"""UTF-32 encoding type."""
class Document(object):
"""Document to send to Google Cloud Natural Language API.
Represents either plain text or HTML, and the content is either
stored on the document or referred to in a Google Cloud Storage
object.
:type client: :class:`~gcloud.language.client.Client`
:param client: A client which holds credentials and project
configuration.
:type content: str
:param content: (Optional) The document text content (either plain
text or HTML).
:type gcs_url: str
:param gcs_url: (Optional) The URL of the Google Cloud Storage object
holding the content. Of the form
``gs://{bucket}/{blob-name}``.
:type doc_type: str
:param doc_type: (Optional) The type of text in the document.
Defaults to plain text. Can be one of
:attr:`~.Document.PLAIN_TEXT` or
or :attr:`~.Document.HTML`.
:type language: str
:param language: (Optional) The language of the document text.
Defaults to :data:`DEFAULT_LANGUAGE`.
:type encoding: str
:param encoding: (Optional) The encoding of the document text.
Defaults to UTF-8. Can be one of
:attr:`~.Encoding.UTF8`, :attr:`~.Encoding.UTF16`
or :attr:`~.Encoding.UTF32`.
:raises: :class:`~exceptions.ValueError` both ``content`` and ``gcs_url``
are specified or if neither are specified.
"""
TYPE_UNSPECIFIED = 'TYPE_UNSPECIFIED'
"""Unspecified document type."""
PLAIN_TEXT = 'PLAIN_TEXT'
"""Plain text document type."""
HTML = 'HTML'
"""HTML document type."""
def __init__(self, client, content=None, gcs_url=None, doc_type=PLAIN_TEXT,
language=DEFAULT_LANGUAGE, encoding=Encoding.UTF8):
if content is not None and gcs_url is not None:
raise ValueError('A Document cannot contain both local text and '
'a link to text in a Google Cloud Storage object')
if content is None and gcs_url is None:
raise ValueError('A Document must contain either local text or a '
'link to text in a Google Cloud Storage object')
self.client = client
self.content = content
self.gcs_url = gcs_url
self.doc_type = doc_type
self.language = language
self.encoding = encoding
def _to_dict(self):
"""Helper to convert the current document into a dictionary.
To be used when constructing requests.
:rtype: dict
:returns: The Document value as a JSON dictionary.
"""
info = {
'type': self.doc_type,
'language': self.language,
}
if self.content is not None:
info['content'] = self.content
elif self.gcs_url is not None:
info['gcsContentUri'] = self.gcs_url
return info
def analyze_entities(self):
"""Analyze the entities in the current document.
Finds named entities (currently finds proper names as of August 2016)
in the text, entity types, salience, mentions for each entity, and
other properties.
See:
https://cloud.google.com/natural-language/reference/\
rest/v1beta1/documents/analyzeEntities
:rtype: list
:returns: A list of :class:`Entity` returned from the API.
"""
data = {
'document': self._to_dict(),
'encodingType': self.encoding,
}
api_response = self.client.connection.api_request(
method='POST', path='analyzeEntities', data=data)
return [Entity.from_api_repr(entity)
for entity in api_response['entities']]