Mostrando postagens com marcador Linguagem Python. Mostrar todas as postagens
Mostrando postagens com marcador Linguagem Python. Mostrar todas as postagens

sexta-feira, 1 de maio de 2020

New Features in Python 3.9 You Should Know About

Por Martin Heinz em 25/04/20 no site Medium


The release of Python 3.9 is still quite a while away (5.10.2020), but with the last alpha (3.9.0a5) release out and first beta in near future, it feels like it’s time to see what new features, improvements and fixes we can expect and look forward to. This article won’t be an exhaustive list of every change, but rather a list of the most interesting and noteworthy things to come with the next version for us — developers. So, let’s dive in!
Original Photo by David Clode on Unsplash

Installing Beta Version

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0a5.tgz
tar xzvf Python-3.9.0a5.tgz
cd Python-3.9.0a5
./configure --prefix=$HOME/python-3.9.0a5
make
make install
$HOME/python-3.9.0a5/bin/python3.9
After running this you should be greeted by IDLE and message like:
3.9.0a5 (default, Apr 16 2020, 18:57:58) 
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.

New Dict Operators

# Dictionaries to be merged:
d1 = {"x": 1, "y": 4, "z": 10}
d2 = {"a": 7, "b": 9, "x": 5}

# Expected output after merging
{'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
# ^^^^^ Notice that "x" got overridden by value from second dictionary

# 1. Option
d = dict(d1, **d2)

# 2. Option
d = d1.copy()  # Copy the first dictionary
d.update(d2)   # Update it "in-place" with second one

# 3. Option
d = {**d1, **d2}
The first option above uses dict(iterable, **kwargs) function which initializes dictionaries - the first argument is a normal dictionary and the second one is a list of key/value pairs, in this case, it's just another dictionary unpacked using ** operator.
The second approach uses update function to update the first dictionary with pairs from the second one. As this one modifies dictionary in-place, we need to copy the first one into the final variable to avoid modifying the original.
Third — last — and in my opinion, the cleanest solution is to use dictionary unpacking and unpack both variables ( d1 and d2) into the resulting one d.
Even though the options above are completely valid, we now have a new (and better?) solution using | operator.
# Normal merging
d = d1 | d2
# d = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}

# In-place merging
d1 |= d2
# d1 = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
The first example above does very much the same as operator unpacking shown previously ( d = {**d1, **d2}). The second example, on the other hand, can be used for in-place merging, where the original variable ( d1) is updated with values from the second operand ( d2).

Topological Ordering

Before the introduction of this feature, you would have to implement it yourself using e.g. Khan’s algorithm or depth-first search which aren’t exactly simple algorithms. So, now in case need to — for example — sort dependant jobs for scheduling, you just do the following:
from functools import TopologicalSorter
graph = {"A": {"D"}, "B": {"D"}, "C": {"E", "H"}, "D": {"F", "G", "H"}, "E": {"G"}}
ts = TopologicalSorter(graph)
list(ts.static_order())
# ['H', 'F', 'G', 'D', 'E', 'A', 'B', 'C']
In the example above, we first create a graph using a dictionary, where keys are outgoing nodes and values are sets of their neighbours. After that, we create an instance of sorter using our graph and then call static_order function to produce the ordering. Bear in mind that this ordering may depend on the order of insertion because when 2 nodes are in the same level of the graph, they are going to be returned in the order they were inserted in.
Apart from static ordering, this class also supports parallel processing of nodes as they become ready for processing, which is useful when working with e.g. task queues — you can find examples of that in Python library docs here.

IPv6 Scoped Addresses

So, in case you need to deal with IPv6 addresses in Python, you can now do so like this:
from ipaddress import IPv6Address
addr = IPv6Address('ff02::fa51%1')
print(addr.scope_id)
# "1" - interface-local IP address
There is one thing you should be careful with when using IPv6 scopes though. Two addresses with different scopes are not equal when compared using basic Python operators.

New math Functions

import math

# Greatest common divisor
math.gcd(80, 64, 152)
# 8
Previously, the gcd function which calculates the Greatest Common Divisor could only be applied to 2 numbers, forcing programmers to do something like this math.gcd(80, math.gcd(64, 152)), when working with more numbers. Starting with Python 3.9, we can apply it to any number of values.
The first new addition to math module is math.lcm function:
# Least common multiple
math.lcm(4, 8, 5)
# 40
math.lcm calculates Least Common Multiple of its arguments. Same as with GCD, it allows a variable number of arguments.
The 2 remaining new functions are very much related. These are math.nextafter and math.ulp:
# Next float after 4 going towards 5
math.nextafter(4, 5)
4.000000000000001
# Next float after 9 going towards 0
math.nextafter(9, 0)
8.999999999999998

# Unit in the Last Place
math.ulp(1000000000000000)
0.125

math.ulp(3.14159265)
4.440892098500626e-16
The math.nextafter(x, y) function is pretty straightforward - it's next float after x going towards y while taking into consideration floating-point number precision.
The math.ulp on the other hand, might look a little weird... ULP stands for "Unit in the Last Place" and it's used as a measure of accuracy in numeric calculations. The shortest explanation is using an example:
Let’s imagine that we don’t have 64 bit computer. Instead, all we have is just 3 digits. With these 3 digits, we can represent a number like 3.14, but not 3.141. With 3.14, the nearest larger number that we can represent is 3.15, These 2 numbers differ by 1 ULP (Units at the last place), which is 0.1. So, what the math.ulp returns is equivalent of this example, but with actual precision of your computer. For proper example and explanation see nice writeup at https://matthew-brett.github.io/teaching/floating_error.html.

New String Functions

# Remove prefix
"someText".removeprefix("some")
# "Text"

# Remove suffix
"someText".removesuffix("Text")
# "some"
These 2 functions perform what you would otherwise achieve using string[len(prefix):] for prefix and string[:-len(suffix)] for suffix. These are very simple operations and therefore also very simple functions, but considering that you might perform these operations quite often, it’s nice to have built-in function that does it for you.

Bonus: HTTP Codes

import http

http.HTTPStatus.EARLY_HINTS
# <HTTPStatus.EARLY_HINTS: 103>

http.HTTPStatus.TOO_EARLY  
# <HTTPStatus.TOO_EARLY: 425>

http.HTTPStatus.IM_A_TEAPOT
# <HTTPStatus.IM_A_TEAPOT: 418>
Looking at these status codes, I can’t quite see why would you ever use them. That said, it’s great to finally have I’m a Teapot status code at our disposal. It’s a great quality of life improvement that I can now use http.HTTPStatus.IM_A_TEAPOT when returning this code from production server ( sarcasm, Please never do that...).

Conclusion

If you liked this article you should check you other of my Python articles below!

Resources

domingo, 30 de junho de 2019

Estas são as 3 melhores linguagens de programação para você aprender agora

Peter Wayner, Info World em 25/06/2019.

Cada vez mais pessoas se interessam em aprender programação, e para isso é essencial escolher a primeira linguagem a ser usada. Hoje, as escolas estão variando entre JavaScriptPython e Java, mas será que alguma dessas pode ser considerada melhor que as demais? Confira as avaliações com as principais razões para aprendê-las.

Java é clássico

O Java continua a ser a espinha dorsal de muitos sites e aplicativos. Escolher uma linguagem com um forte número de seguidores permite que o aluno seja beneficiado com um sistema já totalmente abastecido com sofisticadas ferramentas de desenvolvimento. Além disso, há bilhões de linhas de código aberto que o aluno pode estudar, revisar e ampliar para seu próprio trabalho.

Python é novo

Na verdade, o Python não é tão novo - o projeto começou há cerca de 30 anos -, mas parece novo porque seu sucesso demorou para chegar. Apenas recentemente o Python alcançou uma ampla adoção com programadores casuais. A novidade significa que as escolas que estão adotando o Python estão criando novos planos de aula e produzindo novos conteúdos, e não desenterrando algumas velhas perguntas empoeiradas dos anos 90 com referências ao MySpace.

JavaScript está em toda parte

Na última década, o JavaScript assumiu as linhas de frente dos servidores da Web à medida que os aplicativos da Web Node.js se tornaram a maneira mais popular para os desenvolvedores escreverem “código isomórfico”. JavaScript tem praticamente a mesma idade do Java, mas demorou bons anos para os programadores descobrirem seu poder. É novo e antigo ao mesmo tempo.

Java reduz erros

Você pode não gostar de gastar o tempo para especificar o tipo de cada variável, mas não leva muito tempo para clicar em três teclas para adicionar "int" ao seu código. Quando você faz isso, você ganha todo o poder que resulta de permitir que o compilador verifique seu código imediatamente e encontre os erros antes de implementá-lo. As linguagens verificadas por tipos nos forçam a pensar com mais rigor sobre a lógica em nosso código, e essa é uma lição essencial para novos programadores. A estrutura do Java reduz os erros e constrói um código melhor.

Python é construído

Os amantes da linguagem tipada são inteligentes e escrevem um bom código, mas se você acha que seu código é bom o suficiente para rodar sem as informações extras sobre os tipos de dados para cada variável, o Python será bom para você. O computador pode descobrir o tipo de dados quando você os armazena em uma variável.

JavaScript é flexível

O JavaScript em si não é tipado, mas ultimamente alguns dos membros do JavaScript estão migrando para o TypeScript, um superconjunto da linguagem original que lhe dá a capacidade de definir os tipos quando você quiser. E se você não quiser, bem, o JavaScript também funcionará bem. É uma versão mais relaxada da verificação de tipos.

Java governa dispositivos

O sistema operacional mais popular do mundo é o Android, uma pilha enorme de código construída em Java. Mas essa é apenas a plataforma mais visível. Decodificadores, novos Chromebooks e até mesmo alguns desktops executam aplicativos para Android como os smartphones.

Python governa a ciência de dados

Se você está criando um software para trabalhar com dados, há uma boa chance do Python ser mais adequado. A sintaxe simples atraiu muitos cientistas e a linguagem encontrou um forte número de seguidores em laboratórios de todo o mundo. Agora que a ciência de dados está se consolidando no mundo dos negócios, a linguagem está crescendo.

JavaScript governa a web

As outras plataformas podem ser boas, mas o navegador continua sendo o único portal que todos usam para se conectar com o mundo. Geralmente, é o software mais usado na área de trabalho do computador, no smartphone e no tablet. O JavaScript expandiu sua influência, já que o crescimento do Node.js facilitou a vida dos desenvolvedores.

Java roda tudo

Se você escrever um código em Python, há uma boa chance de que ele acabe sendo executado no Jython, uma implementação da linguagem escrita em Java para aproveitar a onipresença da Java Virtual Machine. Se você precisar executar o JavaScript, também poderá alimentá-lo com o Rhino, uma ferramenta que transforma o código em bytecode Java. Vale destacar, também, que muitas linguagens de programação funcionais como Scala, Clojure e Kotlintambém dependem dos mesmos fundamentos.

Python é executado em todos os lugares

Apesar de menos popular, é fácil encontrar o Python em muitos computadores. Os criadores da linguagem sempre trabalharam com código aberto e os pacotes estão em praticamente todos os lugares.

JavaScript é executado no navegador

O JavaScript é hoje a base para diferentes linguagens. Os desenvolvedores querem alcançar os usuários e, se os usuários estiverem no navegador, encontrar uma maneira de executar seu código em JavaScript - a maneira mais rápida de alcançar a todos. Linguagens como Lisp, OCaml e Pascal podem ser convertidas para JavaScript e executadas no navegador.

Java tem IDEs excelentes

Eclipse, NetBeans e IntelliJ são alguns dos melhores ambientes de desenvolvimento integrados. Eles foram criados pela comunidade Java ao longo dos anos como um dos ambientes mais favoráveis ​​para escrever código. Os algoritmos de conclusão e geração de código podem não gravar todo o programa, mas podem escrever uma quantidade significativa. Todo esse controle ajuda os novos desenvolvedores a obter a sintaxe correta.

Python agrega

Algumas das ferramentas mais recentes, como Jupyter, agregam código, dados e explicações para que as pessoas possam compartilhar suas ideias. Os cadernos Jupyter não são documentos estáticos, mas ferramentas interativas para serem exploradas. Outros estão construindo ferramentas sofisticadas em torno da linguagem para melhorar as pesquisas. O PyTorch, por exemplo, é um kit de ferramentas de aprendizado profundo preenchido com código, dados e algoritmos para análise. Ambientes como esse irão dominar o futuro da ciência de dados.

JavaScript tem JSFiddle

Cada navegador vem com capacidade suficiente para atuar como um IDE. O JSFiddle é apenas o mais conhecido entre diversos sites que permitem compartilhar código JavaScript com outros desenvolvedores. Ferramentas como essa simplificam a experiência do aluno.

Aprenda qualquer uma (ou as três)

O mundo da programação se beneficia da alternância. Embora possa ser confuso trabalhar com diferentes linguagens e manter a sintaxe correta, é possível usar o Java, Python e JavaScript nos projetos. Para os especialistas, as três linguagens não precisam ficar isoladas umas das outras.

segunda-feira, 29 de abril de 2019

Inteligência Artificial: Como fazer análise de sentimentos com python? (Parte 1)

Por  em 29/04/2019 no site Lambda3



Resultado de imagem para inteligencia artificial interpretação de texto
Medium

Um dos desafios do ramo da inteligência artificial é a análise e compreensão de texto, visto que até pouco tempo, esta era uma competência que apenas humanos conseguiam realizar de forma efetiva.
Existem diversas técnicas no mercado para realizar análise de texto, vamos utilizar aqui algumas técnicas de vetorização e processamento de dados para poder classificar como positiva ou negativa as avaliações do IMDB sobre filmes.
Neste post, iremos utilizar python 3 para fazer a análise e o google colaboratory para rodar nossos códigos o/.
Inicialmente vamos importar algumas bibliotecas e carregar nosso dataset:
import pandas as pd
df = pd.read_csv('https://s3.amazonaws.com/sergio-prates-blog/imdb-reviews-pt-br.csv').sample(1000, random_state=42)
df.sentiment.value_counts()
df.head()
Acima importamos a biblioteca pandas que nos auxilia a trabalhar com dataframes ou tabelas no python.
Esses comandos terão a saída conforme abaixo:


Veja que carregamos o dataset com 1000 registros, entretanto esse dataset possui aproximadamente 50k registros!!
Como modelos de machine learning trabalham melhor com valores numéricos, vamos modificar a coluna sentimento para 0=negativo e 1=positivo:
df.sentiment = df['sentiment'].map({'pos': 1, 'neg': 0})
df.head()


Apenas alguns conceitos antes, para processamento de linguagem natural, temos o conceito de n-grama, que consiste no agrupamento de palavras, então temos que um n-grama de tamanho um é um unigrama, de tamanho dois é um bigrama e assim por diante.
Esses n-gramas não são nada mais do que combinações de palavras. Para a frase: “Hoje é dia de sol” temos os unigramas:
Hoje, é, dia, de, sol
Neste caso cada palavra é um unigrama, para bigramas teríamos combinações de duas palavras e assim por diante.
Agora, para que possamos passar nossos dados para o modelo de machine learning, vamos vetorizar nossos dados, afinal como dito anteriormente, algoritmos de machine learning trabalham muito bem com números.
Para isso vamos utilizar a classe CountVectorizer da biblioteca scikit-learn. O scikit-learn é a biblioteca mais famosa para trabalhar com machine learning, recomendo que você veja a documentação aqui.
Perceba que aqui temos o parâmetro ngram_range onde passamos o range de n-gramas que queremos criar, para este exemplo vamos utilizar o unigrama.
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer(ngram_range=(1, 1))
vect.fit(df.text_pt)
text_vect = vect.transform(df.text_pt)
Este código tem a função de criar um vetorizador com a representação numérica das palavras do nosso dataset, a variável “vect” é responsável por armazenar esse de-para das palavras para a representação numérica e a variável text_vect armazena uma matriz que representa nossos dados de avaliações do imdb já vetorizados.
Já temos nossos dados vetorizados, agora como gostamos de boas práticas, vamos separar nossa base em conjunto de treino e testes na proporção 70/30.
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(
text_vect,
df.sentiment,
test_size = 0.3,
random_state = 42
)
No código acima, importamos a função “train_test_split” do scikit-learn para separar os dados em treino e teste, veja que passamos a variável criada anteriormente “text_vect” que se trata dos nossos dados vetorizados, passamos a coluna “sentimento” que é o que queremos classificar e a variável “test_size” com o valor 0.3 que significa que queremos 30% dos dados como testes.
Agora que temos nossos dados de treino e testes, vamos partir para o modelo de machine learning, para este post, vamos utilizar o LogisticRegression do sklearn.
No código abaixo, importamos a classe LogisticRegression do scikit-learn para realizar o ajuste do modelo, instanciamos na variável clf e logo em seguida chamamos o método “fit” que é onde o treinamento do modelo acontece, perceba que passamos o X_train que são nossos dados de treino que utilizaremos para prever o y_train que são os sentimentos positivo e negativo.
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(random_state=0, solver='newton-cg')
clf = clf.fit(X_train, y_train)
Após rodar esse comando, podemos chamar o método “predict” para predizer nossos dados de teste e verificar a partir da métrica f1_score qual a porcentagem de acerto do nosso modelo:
from sklearn.metrics import f1_score
y_prediction = clf.predict(X_test)
f1 = f1_score(y_prediction, y_test, average='weighted')
print(f1)



Veja que obtivemos um score de 73%, nada mal hum? Com isso você conseguiu fazer um classificador de textos com técnicas simples de processamento de linguagem natural!! 😎
Apenas um detalhe, é que essa precisão pode variar devido ao método sample, utilizado no início, pois ele pega registros aleatórios, o que pode modificar o resultado final.
Nos próximos posts vamos explorar outros modelos e tentar melhorar esse score!