Pesquisa semântica para manchetes e texto de história
tldrstory é um aplicativo de pesquisa semântica para manchetes e conteúdo de texto relacionado a histórias. tldrstory aplica rotulagem zero-shot sobre o texto, o que permite categorizar dinamicamente o conteúdo. Esta estrutura também constrói um índice txtai que permite a pesquisa por similaridade de texto. Um aplicativo Streamlit personalizável e um serviço de back-end FastAPI permitem que os usuários revisem e analisem os dados processados.
tldrstory tem um artigo correspondente no Medium que cobre os conceitos deste README e muito mais. Confira!
Os links a seguir são exemplos de aplicativos criados com tldrstory.
A maneira mais fácil de instalar é via pip e PyPI
pip install tldrstory
Você também pode instalar o tldrstory diretamente do GitHub. É recomendado usar um ambiente virtual Python.
pip install git+https://github.com/neuml/tldrstory
Python 3.8+ é compatível
Consulte este link para ajudar a resolver problemas de instalação específicos do ambiente.
Depois de instalado, um aplicativo deve ser configurado para ser executado. Um aplicativo tldrstory consiste em três processos separados:
Esta seção mostrará como iniciar o aplicativo "Sports News".
mkdir sports
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/app.yml -O sports/app.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/api.yml -O sports/api.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/apps/sports/index-simple.yml -O sports/index.yml
wget https://raw.githubusercontent.com/neuml/tldrstory/master/src/python/tldrstory/app.py -O sports/app.py
python -m tldrstory.index sports/index.yml
CONFIG=sports/api.yml API_CLASS=tldrstory.api.API uvicorn " txtai.api:app " &
streamlit run sports/app.py sports/app.yml " Sports " " ? "
Pronto para uso, o tldrstory oferece suporte à leitura de dados de RSS e da API Reddit. Fontes de dados adicionais podem ser definidas e configuradas.
Veja a seguir um exemplo de definição de fonte de dados customizada. neuspo é um aplicativo de eventos esportivos e notícias em tempo real. Esta fonte de dados carrega 4 entradas predefinidas no banco de dados de artigos.
from tldrstory . source . source import Source
class Neuspo ( Source ):
"""
Articles have the following schema:
uid - unique id
source - source name
date - article date
title - article title
url - reference url for data
entry - entry date
"""
def run ( self ):
# List of articles created
articles = []
articles . append ( self . article ( "0" , "Neuspo" , self . now (), "Eagles defeat the Giants 22 - 21" ,
"https://neuspo.com/stream/34952e3919d685982c17735018b0197f" , self . now ()))
articles . append ( self . article ( "1" , "Neuspo" , self . now (), "Giants lose to the Eagles 22 - 21" ,
"https://t.co/e9FFgo0wgR?amp=1" , self . now ()))
articles . append ( self . article ( "2" , "Neuspo" , self . now (), "Rays beat Dodgers 6 to 4" ,
"https://neuspo.com/stream/6cb820b3ebadc086aa36b5cc4a0f575d" , self . now ()))
articles . append ( self . article ( "3" , "Neuspo" , self . now (), "Dodgers drop Game 2, 6-4" ,
"https://t.co/1hEQAShVnP?amp=1" , self . now ()))
return articles
Vamos executar novamente as etapas acima usando neuspo como fonte de dados. Primeiro remova o diretório sports/data para garantir a criação de um novo banco de dados. Podemos então baixar a essência acima no diretório de esportes.
# Delete the sports/data directory before running
wget https://gist.githubusercontent.com/davidmezzetti/9a6064d9a741acb89bd46eba9f906c26/raw/7058e97da82571005b2654b4ab908f25b9a04fe2/neuspo.py -O sports/neuspo.py
Edite sports/index.yml e remova a seção rss. Substitua-o pelo seguinte.
# Custom data source for neuspo
source : sports.neuspo.Neuspo
Agora execute novamente as etapas 2 a 4 das instruções acima.
As seções a seguir definem parâmetros de configuração para cada processo que faz parte de um aplicativo tldrstory.
Configura a indexação do conteúdo. Atualmente oferece suporte à extração de dados por meio da API Reddit, RSS e fontes personalizadas definidas pelo usuário.
name : string
Nome do aplicativo
schedule : string
String estilo cron que permite a execução agendada do trabalho de indexação. Consulte este link para obter mais informações sobre strings cron.
Configuração da fonte de dados.
reddit.subreddit : name of subreddit to pull from
reddit.sort : sort type
reddit.time : time range
reddit.queries : list of text queries to run
Executa uma série de consultas à API do Reddit. Uma chave de API do Reddit precisará ser criada e configurada para que este método funcione. Os parâmetros de autenticação podem ser definidos no ambiente ou em um arquivo praw.ini. Consulte este link para obter mais informações sobre como configurar uma conta Reddit API; acesso somente leitura é tudo o que é necessário.
Consulte a documentação do PRAW para obter mais detalhes sobre como definir as configurações de consulta.
rss : list of RSS urls
Lê uma série de feeds RSS e cria artigos para cada link de artigo encontrado.
source : string
Configura uma fonte personalizada. Este parâmetro utiliza um caminho de classe completo como uma string, por exemplo "tldrstory.source.rss.RSS"
Fontes personalizadas podem usar qualquer dado que tenha data, string de texto e URL de referência. Consulte a documentação em source.py para obter informações sobre como criar uma fonte personalizada. rss.py e reddit.py são exemplos de implementações.
ignore : list of url patterns
Lista de padrões de URL a serem ignorados. Suporta strings e expressões regulares.
labels : dict
Configuração de rótulo para classificador zero-shot. Esta configuração define uma categoria juntamente com uma lista de valores de tópico.
Exemplo:
labels :
topic :
values : [Label 1, Label 2]
O exemplo acima configura a categoria “Tópico” com dois rótulos possíveis, “Rótulo 1” e “Rótulo 2”. Qualquer rótulo pode ser definido aqui e um modelo de PNL em grande escala será usado para categorizar o texto de entrada nesses rótulos.
path : string
Onde armazenar a saída do modelo, o caminho será criado se ainda não existir.
embeddings : dict
Configura um índice txtai usado para pesquisar tópicos. Consulte a configuração do txtai para obter mais detalhes sobre isso.
Configura uma interface suportada por FastAPI para extrair dados indexados.
path : string
Caminho para um índice de modelo.
O aplicativo padrão é desenvolvido com Streamlit e controlado por um arquivo de configuração YAML. O arquivo de configuração define o nome do aplicativo, o endpoint da API para extrair conteúdo e a configuração do componente. Um aplicativo Streamlit personalizado ou qualquer outro aplicativo pode ser usado no lugar dele para extrair conteúdo diretamente do endpoint da API.
name : string
Nome do aplicativo
api : url
Endpoint da API para extrair conteúdo.
description : string
String Markdown usada para criar uma descrição da barra lateral.
queries.name : Queries drop down header
queries.values : List of values to use for queries drop down
Configura a caixa suspensa de consulta. Esta deve ser uma lista de consultas predefinidas a serem usadas. Se um valor "Último" estiver presente, ele consultará os últimos N artigos. Se um valor de "--Search--" estiver presente, será apresentada outra caixa de texto para permitir a inserção de consultas personalizadas.
filters : list
Lista de filtros deslizantes. Isso deve ser mapeado para os rótulos zero-shot configurados na seção de indexação.
chart.name : Chart name
chart.x : Chart x-axis column
chart.y : Chart y-axis column
chart.scale : Color scale for list of colors
chart.colors : List of colors
Permite a configuração de um gráfico de dispersão que representa graficamente dois pontos de rótulo. Este gráfico pode ser usado para plotar e aplicar cores aos rótulos aplicados.
" column name " : dynamic range of coloring
Tabela de dados que mostra detalhes dos resultados. Além das colunas padrão, esta seção permite adicionar colunas adicionais com base nos rótulos zero-shot aplicados. O modo padrão é mostrar o valor numérico do rótulo, mas uma série de rótulos de texto também pode ser aplicada.
Por exemplo:
O texto acima geraria o texto "Rótulo 1" em vermelho para valores entre 0 e 5. Valores entre 5 e 10 gerariam o texto "Rótulo 2" em verde.