UBI, Informática Web, 2021/22
Tecnologias de Redes Sociais
Aula 09: Semântica Lexical e associação entre palavras. O thesaurus WordNet;. O “ecossistema Google” e a suas RSV. O YouTube e suas APIs. Exemplos de acesso à informação em Python. Exemplos simples e avançados.
Departamento de Informática
João Cordeiro
Semântica Lexical
Semântica Lexical
❖ Considera as relações semânticas existentes entre palavras de uma língua.
❖ Relações concretas e definidas: sinónimos, hiperónimos, etc.
❖ Relações de proximidade mais vagas
❖ Manualmente estabelecidas por linguistas
❖ Computacionalmente descobertas pela estatística
❖ Elevado potencial de aplicação!
Thesaurus
❖ Consiste numa base de dados lexical com um conjunto de relações semânticas definidas.
❖ No mínimo informação sobre palavras semanticamente relacionadas, por exemplo:
physician:
synonyms: croaker, doc, doctor, MD, medical, mediciner, medico, sawbones.
related: medic, general practitioner, surgeon.
❖ Pode conter a definição de relações mais variadas e mais detalhadamente, e.g. “WordNet”
O Thesaurus WordNet
❖ Base de dados detalhada de relações semânticas para a língua Inglesa.
❖ Desenvolvido na Universidade de Princeton (EUA) por um psicólogo famoso — George Miler — e uma equipa de vários especialistas, durante década de 1990.
❖ Contém cerca de 144 000 palavras.
❖ Os nomes, verbos, adjetivos e advérbios agrupados 109k clusters de sinónimos — synsets.
O Thesaurus WordNet
https://wordnet.princeton.edu
WordNet Synset Relationships
❖ Antonym: front => back
❖ Attribute: benevolence => good (noun to adjective)
❖ Pertainym: alphabetical => alphabet (adjective to noun)
❖ Similar: unquestioning => absolute
❖ Cause: kill => die
❖ Entailment: breathe => inhale
❖ Holonym: chapter => text (part-of)
❖ Meronym: computer => cpu (whole-of)
❖ Hyponym: tree => plant (specialization)
❖ Hypernym: fruit => apple (generalization)
WordNet na Prática
❖ Recurso online
❖ Para Java existe a biblioteca
JWNL, além de muitas outras.
❖ Contido no NLTK.
WordNet @ NLTK
from nltk.corpus import wordnet
syns = wordnet.synsets('program') print('SYNSETS:')
print('========')
for (i,s) in enumerate(syns):
print(i, s) print()
print('SYNSET[0]:') print('==========')
# An example of a synset:
print('Name:'.ljust(15,'.'), syns[0].name())
# Just the word:
print('Lemma:'.ljust(15,'.'), syns[0].lemmas()[0].name())
# Definition of that first synset:
print('Definition:'.ljust(15,'.'), syns[0].definition())
# Examples of the word in use in sentences:
print('Examples:'.ljust(15,'.'), syns[0].examples())
SYNSETS:
========
0 Synset('plan.n.01')
1 Synset('program.n.02') 2 Synset('broadcast.n.02') 3 Synset('platform.n.02') 4 Synset('program.n.05')
5 Synset('course_of_study.n.01') 6 Synset('program.n.07')
7 Synset('program.n.08') 8 Synset('program.v.01') 9 Synset('program.v.02')
WordNet @ NLTK
print('SYNSET[0]:') print('==========')
# An example of a synset:
print('Name:'.ljust(15,'.'), syns[0].name())
# Just the word:
print('Lemma:'.ljust(15,'.'), syns[0].lemmas()[0].name())
# Definition of that first synset:
print('Definition:'.ljust(15,'.'), syns[0].definition())
# Examples of the word in use in sentences:
print('Examples:'.ljust(15,'.'), syns[0].examples())
SYNSET[0]:
==========
Name:... plan.n.01 Lemma:... plan
Definition:.... a series of steps to be carried out or goals to be accomplished
Examples:... ['they drew up a six-step plan', 'they discussed plans for a new bond issue']
WordNet @ NLTK
import nltk
from nltk.corpus import wordnet synonyms = []
antonyms = []
for syn in wordnet.synsets("good"):
for lm in syn.lemmas():
synonyms.append(lm.name()) if lm.antonyms():
antonyms.append(lm.antonyms()[0].name())
print(set(synonyms)) print(set(antonyms))
{'sound', 'honest', 'practiced', 'undecomposed', 'unspoiled', 'thoroughly', 'unspoilt', 'near', 'in_effect', 'dear', 'full', 'soundly', 'honorable', 'beneficial', 'safe', 'adept', 'skillful', 'right', 'upright', 'just', 'expert', 'secure', 'ripe', 'serious', 'in_force', 'effective', 'commodity', 'estimable', 'trade_good', 'proficient', 'respectable', 'goodness', 'well', 'good', 'skilful', 'salutary', 'dependable'}
{'bad', 'badness', 'evilness', 'ill', 'evil'}
WordNet @ NLTK
import nltk
from nltk.corpus import wordnet
w1 = wordnet.synset('run.v.01')
w2 = wordnet.synset('sprint.v.01') si = w1.wup_similarity(w2)
print("%f = SIM(%s, %s)" % (si, w1, w2) ) w1 = wordnet.synset('ship.n.01')
w2 = wordnet.synset('boat.n.01') si = w1.wup_similarity(w2)
print("%f = SIM(%s, %s)" % (si, w1, w2) )
$ python WN-C.py
0.857143 = SIM( Synset('run.v.01'), Synset(‘sprint.v.01') ) 0.909091 = SIM( Synset('ship.n.01'), Synset(‘boat.n.01') )
Thesaurus Estatístico
❖ Os thesauri desenvolvidos por humanos são raros em muitas línguas e difíceis de criar.
❖ Os thesuari manuais são limitados no tipo e na
escala da sinonímia e das relações semânticas que eles representam.
❖ Os termos semanticamente relacionados podem ser descobertos a partir da análise estatística de corpora.
Thesaurus Estatístico
❖ Determina-se a similaridade dos termos através de uma análise estatística pré-computada num corpus.
❖ Cria-se a matriz de associação que quantifica a
correlação de palavras, quanto à frequência de co- ocorrência.
Matriz de Associação
w1 w2 w3 ………..wn w1
w2 w3
. . wn
c11 c12 c13………c1n c21
c31 . . cn1
cij : Fator de correlação entre a palavra wi e a palavra wj
fik : Frequência da palavra wi no documento dk.
D = {d1, …, dk, …dm}
Matriz de Associação Normalizada
❖ A correlação baseada exclusivamente na frequência favorece mais as palavras mais frequentes.
❖ Normalização dos valores da matriz:
❖ O valor normalizado é 1.0 se duas palavras ocorrem com a mesma frequência em todos os documentos.
Matriz de Associação Normalizada
Uma Novela Chamada Facebook
Uma Novela Chamada Facebook
YouTube API
YouTube = Video + SN
❖ Começou por ser uma plataforma de partilha de vídeo; Criado em 14-02-2005, por Chad Hurley, Steve Chen, e Jawed Karim;
❖ Comprado pela Google em novembro de 2006;
❖ A cada 3 minutos, 48h de vídeo são carregados, segundo Wattenhofer et Al. (2012);
❖ Interliga-se com os outros dois gigantes: Facebook e Twitter;
YouTube API - Exemplos
❖ Podemos realizar diversas operações de extração de informação, tais como:
❖ Pesquisa de um tópico ou assunto;
❖ Pesquisa de canais;
❖ Pesquisa de utilizadores;
❖ Extração de threads de comentários;
YouTube API
https://console.developers.google.com/
https://console.developers.google.com/
Criação de um Novo Projeto no
Google Developers
Projetos
existentes
Novo
Escolher
Escolher
Ok
Ok
Falta ainda definir os consentimentos associados ao Projeto
Escolher
Escolher
Credencial com Chave de API
Aqui
Credencial tipo OAuth
Escolher
Exemplo de simples de pesquisa
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube' API_VERSION = 'v3'
from googleapiclient.discovery import build from YouTube.Keys import DEVELOPER_KEY
youtube = build(API_SERVICE_NAME, API_VERSION, developerKey=DEVELOPER_KEY) def youtube_search(query="news", max_results=10):
search_response = youtube.search().list(
q=query,
part='id,snippet',
maxResults=max_results ).execute()
videos = []
for search_result in search_response.get('items', []):
if search_result['id']['kind'] == 'youtube#video':
videos.append('%s --> %s (%s)' % (search_result['snippet']['publishedAt'], search_result['snippet']['title'],
search_result['id']['videoId'])) print('Videos:'); print(10 * "=")
for i, x in enumerate(videos): print("%03d | %s" % (i, x)) print('\n')
youtube_search(query="Donald Trump", max_results=10)
Chave de acesso à API
Função de pesquisa, aqui abreviada
Video ID & URL “video id”
“video id”
Video ID & URL
Estrutura JSON (como saber+?)
https://developers.google.com/youtube/v3/docs/videos
Credencial tipo OAuth
Credencial tipo OAuth
Escolher
Fazer download do ficheiro
*.json com as credenciais de acesso ao YouTube
Integrar numa aplicação ou projeto PyCharm
Exemplo: client_secret.json
Escolher
Código Gerado Copy
Aplicação pronta para rolar:
CLIENT_SECRETS_FILE = "ytcodes2.json"
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube' API_VERSION = 'v3'
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request
import os
import pickle
def get_authenticated_service():
pickle_file = 'token3.pickle' credentials = None
if os.path.exists(pickle_file):
with open(pickle_file, 'rb') as token:
credentials = pickle.load(token)
# Check if the credentials are invalid or do not exist if not credentials or not credentials.valid:
# Check if the credentials have expired
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request()) else:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES) credentials = flow.run_console()
# Save the credentials for the next run with open(pickle_file, 'wb') as token:
pickle.dump(credentials, token)
return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)
Vamos ver uns exemplos mais “advanced”