Repost: UV, partea 3: Python în r cu reticulat

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe Realizarea geneticiiși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Repostat din original la https://blog.stephenturner.us/p/uv-part-3-python-in-r-with-reticulat.

Două demo -uri care folosesc Python în R prin reticulat+UV: (1) îmbrățișarea transformatoarelor de față pentru analiza sentimentelor, (2) pybigwig pentru a interoga un fișier bigwig și vizualizarea cu GGPLOT2.

Aceasta este partea a 3 -a a unei serii pe UV. Alte postări din această serie:

  1. UV, Partea 1: Rularea scripturilor și instrumentelor

  2. UV, Partea 2: Pachete de construcție și publicare

  3. Această postare

  4. În curând …

Primesc aceeași întrebare tot timpul de la oamenii de știință de date în curs de formare: „Ar trebui să folosesc Python sau R?” Răspunsul meu este întotdeauna același: nu este Python contra R, este Python şi R – Folosiți orice instrument este cel mai bun pentru job. Anul trecut am scris o postare cu resurse pentru învățarea Python ca utilizator R.

Python pentru utilizatorii R

„Cel mai bun instrument pentru job” ar putea necesita știința multilingvă a datelor. Sunt parțial la R pentru manipularea datelor, vizualizare și bioinformatică, dar Python are o bază de utilizator mult mai mare și cel mai bine să nu reinventeze roata dacă există deja un instrument Python bine testat și dezvoltat activ.

Dacă fac 90% din analiza mea într -un mediu R, dar am un cod Python pe care vreau să -l folosesc, reticulează Face ușor utilizarea codului Python în R (dintr -un script, într -un document RMarkdown/Quarto sau în pachete). Acest lucru vă ajută să evitați schimbarea contextelor și exportul de date între R și Python.

Puteți importa un pachet Python și puteți apela o funcție Python din acel pachet din mediul dvs. R. Iată o demo simplă folosind listdir() Funcție în os Pachet în biblioteca standard Python.

library(reticulate)
os <- import("os")
os$listdir(".")

Posit lansat recent Reticulat 1.41 care simplifică instalarea Python și gestionarea pachetelor prin utilizarea UV pe partea din spate. Există o funcție simplă: py_require() ceea ce vă permite să declarați cerințele Python pentru sesiunea dvs. R. Reticularea creează un mediu Python efemer folosind UV. Vezi Referință funcțională pentru detalii.

R are instrumente excelente pentru Wrangling și vizualizare a textului (salut tidytext, stringrși ggplot2), dar imaginați -vă că vrem acces la Îmbrățișarea bibliotecii Transformers a fețeicare oferă sute de modele pretrainate, API -uri simple de conducte pentru lucruri precum analiza sentimentelor, numită recunoaștere, traducere sau rezumare a entității numite. Să încercăm să rulăm analiza sentimentelor cu Îmbrățișarea conductei de analiză a sentimentelor de transformare a feței.

În primul rând, încărcați biblioteca reticulată și utilizați py_require() pentru a declara că vom avea nevoie de pytorch și de fața îmbrățișată Biblioteca Transformers instalat.

library(reticulate)
py_require("torch")
py_require("transformers")

Chiar și după ce mi -am șters cache -ul UV, acest lucru se instalează în cel mai scurt timp pe MacBook Pro.

Installed 23 packages in 411ms

În continuare, voi importa biblioteca Python Transformers în mediul meu R și voi crea un obiect pentru a utiliza conducta de analiză a sentimentelor. Veți primi un mesaj despre faptul că nu ați specificat un model, astfel încât acesta să fie implicit la un Model Distilbert bine reglat pe Stanford Sentiment Treebank Corpora.

transformers <- import("transformers")
analyzer <- transformers$pipeline("sentiment-analysis")

Acum putem folosi această funcție dintr -o bibliotecă Python ca și cum ar fi o funcție R.

analyzer("It was the best of times")

Rezultatul este o listă cuibărită.

((1))
((1))$label
(1) "POSITIVE"

((1))$score
(1) 0.9995624

Ce zici de altul?

analyzer("It was the worst of times")

Rezultate:

((1))
((1))$label
(1) "NEGATIVE"

((1))$score
(1) 0.9997889

Să scriem o funcție R care ne oferă o ieșire mai frumoasă. Acest lucru va lua textul și va produce un cadru de date care indică sentimentul general și scorul.

analyze_sentiment <- function(text) {
  result <- analyzer(text)((1))
  tibble(label = result$label, score = result$score)
}

Să încercăm pe un pasaj mai lung.

analyze_sentiment("it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair")

Rezultatele:

     label     score
1 NEGATIVE 0.5121167

Acum, să creăm mai multe fragmente de text:

mytexts <- c("I love using R and Python together!",
             "This is the worst API I've ever worked with.",
             "Results are fine, but the code is a mess",
             "This package manager is super fast.")

Și folosind unelte standard Tidyverse, putem crea un tabel care arată clasificarea sentimentelor și scorul pentru fiecare dintre ele:

library(dplyr)
library(tidyr)
tibble(text=mytexts) |>
  mutate(sentiment = lapply(text, analyze_sentiment)) |>
  unnest_wider(sentiment)

Rezultatul:

# A tibble: 4 × 3
  text                                         label    score
                                              
1 I love using R and Python together!          POSITIVE 1.00 
2 This is the worst API I've ever worked with. NEGATIVE 1.00 
3 Results are fine, but the code is a mess     NEGATIVE 0.999
4 This package manager is super fast.          POSITIVE 0.995

În primul rând, hai să facem acest exemplu de fișier bigwig:

x <- "http://genome.ucsc.edu/goldenPath/help/examples/bigWigExample.bw"
download.file(x, destfile = "bigWigExample.bw", mode = "wb")

Acum să încărcăm reticularea și să folosim biblioteca Pybigwig:

library(reticulate)
py_require("pyBigWig")
pybw <- import("pyBigWig")

Acum să deschidem acel fișier de exemplu, să privim cromozomii și lungimile lor, apoi să interogați valorile aproape de sfârșitul cromozomului 21.

# Open a BigWig file
bw <- pybw$open("bigWigExample.bw")

# Get list of chromosomes
chroms <- bw$chroms()
print(chroms)

# Query values near the end of chromosome 21
chrom <- "chr21"
start <- chroms((1))-100000L
end <- start+1000L

# Get values (one per base)
values <- bw$values(chrom, start, end)

# Close the file
bw$close()

În cele din urmă, putem introduce rezultatele într -un cadru de date și să -l complotăm cu GGPLOT2:

# Wrap into data frame
df <- data.frame(position = start:(end - 1), 
                 signal = unlist(values))

# Plot the result
library(ggplot2)
ggplot(df, aes(x = position, y = signal)) +
  geom_line(color = "steelblue") +
  theme_minimal() +
  labs(title = paste("Signal at", chrom, "from", start, "to", end),
       x = "Genomic position",
       y = "Signal")

Iată complotul rezultat:

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.