How do I compare two ASCII strings in Coq? - functional-programming

I want to compare two ASCII strings s1 and s2 in Coq.
It seems like the standard library contains no functions for this purpose?
What is the canonical way of proving strings equal?

You can use the string_dec function, which decides (hence the suffix _dec) if two strings are equal. Incidentally, this name slightly violates the usual Coq naming style -- it should've been named string_eq_dec -- _eq_dec stands for decidable equality. string_dec has the following type:
string_dec
: forall s1 s2 : string, {s1 = s2} + {s1 <> s2}
Let me provide a concrete example. Coq lets you use string_dec in if-expressions like an ordinary boolean value:
Require Import String.
Open Scope string_scope.
Coq < Compute if string_dec "abc" "abc" then 1 else 0.
= 1
: nat
Coq < Compute if string_dec "ABC" "abc" then 1 else 0.
= 0
: nat

If you are going to actually run string comparison inside Coq, I recommend to use the boolean versions:
From Coq Require Import Bool Ascii String.
Definition eq_ascii (a1 a2 : ascii) :=
match a1, a2 with
| Ascii b1 b2 b3 b4 b5 b6 b7 b8, Ascii c1 c2 c3 c4 c5 c6 c7 c8 =>
(eqb b1 c1) && (eqb b2 c2) && (eqb b3 c3) && (eqb b4 c4) &&
(eqb b5 c5) && (eqb b6 c6) && (eqb b7 c7) && (eqb b8 c8)
end.
Fixpoint eq_string (s1 s2 : string) :=
match s1, s2 with
| EmptyString, EmptyString => true
| String x1 s1, String x2 s2 => eq_ascii x1 x2 && eq_string s1 s2
| _, _ => false
end.
They are usually 3x faster in my tests, but can be one order of magnitude if the hnf strategy is involved (which happens in proofs).
Time Compute if string_dec
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
"
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
" then 1 else 0.
(* around 0.015 *)
Time Compute eq_string
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
"
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
".
(* around 0.005 *)

Related

data cleaning with R language

I have to build an access database from a txt file (that I obtained from a raw pdf file).
This in order to feed some stuff to a free quiz making software (quizfaber.com)
This is my input file:
001. A norma del disposto di cui al co. 2, art. 36, Reg. Ord. Penit., negli istituti penitenziari come sono disciplinate le modalità relative allo svolgimento dei vari servizi predisposti per i detenuti e per gli internati?
A)Con singoli provvedimenti del direttore dell'istituto.
B)Con regolamento interno dell'istituto.
C)Con singoli atti del provveditore regionale competente.
002. A norma del disposto di cui al co. 7 , art. 47-quinquies, Ord. Penit., la detenzione domiciliare speciale può essere concessa anche al padre detenuto?
A)Sì, alle stesse condizioni previste per la madre, in alternativa alla madre.
B)Sì, alle stesse condizioni previste per la madre, ma solo se la madre è deceduta e non vi è modo di affidare la prolead altri che al padre.
C)Sì, alle stesse condizioni previste per la madre, se la madre è deceduta o impossibilitata e non vi è modo di affidarela prole ad altri che al padre.
003. A norma del disposto di cui al co. 8-bis, art. 656, c.p.p. (Esecuzione delle pene detentive), quando il pubblico ministero può disporre la rinnovazione della notifica dell'avviso dell'ordine di esecuzione e del decreto di sospensione?
A)Solo quando è sicuramente provato che il condannato non abbia avuto effettiva conoscenza dell'avviso.
B)In nessun caso.
C)Quando è provato o appare probabile che il condannato non abbia avuto effettiva conoscenza dell'avviso.
004. Quale sanzione disciplinare di cui all'art. 39, Ord. Penit., non può avere durata massima di quindici giorni?
A)Isolamento durante la permanenza all'area aperta.
B)Esclusione dalle attività in comune.
C)Esclusione dalle attività ricreative e sportive.
005. In materia di "alimentazione" l'art. 9, Ord. Penit. dispone, tra l'altro, che:
A)Il vitto è somministrato, di regola, in locali all'uopo destinati.
B)I prezzi di vendita devono essere almeno inferiori del 30% rispetto a quelli comunemente praticati nel luogo in cui èsito l'istituto.
C)Il servizio di vettovagliamento di regola non è gestito direttamente dall'amministrazione penitenziaria.
006. A norma del disposto di cui all'art. 76, Reg. Ord. Penit., quale ricompensa può essere concessa dal consiglio di disciplina, ai detenuti e agli internati, se ricorrano i presupposti?
A)Encomio.
B)Nessuna delle altre risposte è corretta; tutte le ricompense sono concesse dal direttore dell'istituto penitenziario o dalmagistrato di sorveglianza.
C)Proposta di licenza.
007. A norma del disposto di cui al co. 11, art. 11, Ord. Penit., nel caso di diagnosi anche sospetta di malattia contagiosa devono essere messi in atto tutti gli interventi di controllo per evitare insorgenza di casi secondari, compreso l'isolamento; chi deve essere immediatamente informato?
A)Il difensore della persona contagiata.B)Il famigliari della persona contagiata.C)Il direttore dell'istituto.
008. A norma del disposto di cui all'art. 40, Ord. Penit., quale tra le seguenti non è una sanzione disciplinare deliberata al consiglio di disciplina?
A)Isolamento durante la permanenza all'area aperta.
B)Esclusione da attività in comune.
C)Richiamo.
009. In materia di "alimentazione" l'art. 9, Ord. Penit. dispone, tra l'altro, che:
A)Una rappresentanza di soggetti non detenuti o internati controlla l'applicazione delle tabelle e la preparazione delvitto.
B)Tutti i detenuti hanno la stessa alimentazione; l'istituto non può tener conto di eventuali diverse richieste anche sepreviste dal credo religioso.
C)Il servizio di vettovagliamento è di regola gestito direttamente dall'amministrazione penitenziaria.
010. Al condannato ammesso al regime di semilibertà possono essere concesse a titolo di premio una o più licenze di durata non superiore nel complesso a 45 giorni l'anno. Chi provvede alla concessione?
A) Il tribunale di sorveglianza. B) Il direttore dell'istituto penitenziario. C) Il magistrato di sorveglianza.
Here are the two requested output txt files
FIRST
1; 1; 1; 001. A norma del disposto di cui al co. 2, art. 36, Reg. Ord. Penit., negli istituti penitenziari come sono disciplinate le modalità relative allo svolgimento dei vari servizi predisposti per i detenuti e per gli internati?; Y
2; 1; 1; 002. A norma del disposto di cui al co. 7 , art. 47-quinquies, Ord. Penit., la detenzione domiciliare speciale può essere concessa anche al padre detenuto?; Y
3; 1; 1; 003. A norma del disposto di cui al co. 8-bis, art. 656, c.p.p. (Esecuzione delle pene detentive), quando il pubblico ministero può disporre la rinnovazione della notifica dell'avviso dell'ordine di esecuzione e del decreto di sospensione?; Y
4; 1; 1; 004. Quale sanzione disciplinare di cui all'art. 39, Ord. Penit., non può avere durata massima di quindici giorni?; Y
5; 1; 1; 005. In materia di "alimentazione" l'art. 9, Ord. Penit. dispone, tra l'altro, che:; Y
6; 1; 1; 006. A norma del disposto di cui all'art. 76, Reg. Ord. Penit., quale ricompensa può essere concessa dal consiglio di disciplina, ai detenuti e agli internati, se ricorrano i presupposti?; Y
7; 1; 1; 007. A norma del disposto di cui al co. 11, art. 11, Ord. Penit., nel caso di diagnosi anche sospetta di malattia contagiosa devono essere messi in atto tutti gli interventi di controllo per evitare insorgenza di casi secondari, compreso l'isolamento; chi deve essere immediatamente informato?; Y
8; 1; 1; 008. A norma del disposto di cui all'art. 40, Ord. Penit., quale tra le seguenti non è una sanzione disciplinare deliberata al consiglio di disciplina?; Y
9; 1; 1; 009. In materia di "alimentazione" l'art. 9, Ord. Penit. dispone, tra l'altro, che:; Y
10; 1; 1; 010. Al condannato ammesso al regime di semilibertà possono essere concesse a titolo di premio una o più licenze di durata non superiore nel complesso a 45 giorni l'anno. Chi provvede alla concessione?; Y
AND SECOND
1;A)Con singoli provvedimenti del direttore dell'istituto.; N; 1
1;B)Con regolamento interno dell'istituto.; N; 2
1;C)Con singoli atti del provveditore regionale competente.; N; 3
2;A)Sì, alle stesse condizioni previste per la madre, in alternativa alla madre.; N; 4
2;B)Sì, alle stesse condizioni previste per la madre, ma solo se la madre è deceduta e non vi è modo di affidare la prolead altri che al padre.; N; 5
2;C)Sì, alle stesse condizioni previste per la madre, se la madre è deceduta o impossibilitata e non vi è modo di affidarela prole ad altri che al padre.; N; 6
3;A)Solo quando è sicuramente provato che il condannato non abbia avuto effettiva conoscenza dell'avviso.; N; 7
3;B)In nessun caso.; N; 8
3;C)Quando è provato o appare probabile che il condannato non abbia avuto effettiva conoscenza dell'avviso.; N; 9
4;A)Isolamento durante la permanenza all'area aperta.; N; 10
4;B)Esclusione dalle attività in comune.; N; 11
4;C)Esclusione dalle attività ricreative e sportive.; N; 12
5;A)Il vitto è somministrato, di regola, in locali all'uopo destinati.; N; 13
5;B)I prezzi di vendita devono essere almeno inferiori del 30% rispetto a quelli comunemente praticati nel luogo in cui èsito l'istituto.; N; 14
5;C)Il servizio di vettovagliamento di regola non è gestito direttamente dall'amministrazione penitenziaria.; N; 15
6;A)Encomio.; N; 16
6;B)Nessuna delle altre risposte è corretta; tutte le ricompense sono concesse dal direttore dell'istituto penitenziario o dalmagistrato di sorveglianza.; N; 17
6;C)Proposta di licenza.; N; 18
7;A)Il difensore della persona contagiata.; N; 19
7;B)Il famigliari della persona contagiata.; N; 20
7;C)Il direttore dell'istituto.; N; 21
8;A)Isolamento durante la permanenza all'area aperta.; N; 22
8;B)Esclusione da attività in comune.; N; 23
8;C)Richiamo.; N; 24
9;A)Una rappresentanza di soggetti non detenuti o internati controlla l'applicazione delle tabelle e la preparazione delvitto.; N; 25
9;B)Tutti i detenuti hanno la stessa alimentazione; l'istituto non può tener conto di eventuali diverse richieste anche sepreviste dal credo religioso.; N; 26
9;C)Il servizio di vettovagliamento è di regola gestito direttamente dall'amministrazione penitenziaria.; N; 27
10;A) Il tribunale di sorveglianza.; N; 28
10;B) Il direttore dell'istituto penitenziario.; N; 29
10;C) Il magistrato di sorveglianza.; N; 30
In fact I have to create this two access tables, questions and answers
And then I'll set the relations as this-:
I don't know well how to start in R language to perform this task.
Firstable I should check if the input file contains any semicolon and trasform to something else (_ for example)
Second I should add all the stuff in order to represent all the fields of the table. The field values are fixed except for the indexes that are progressive
Third I should deal with the case when the three answers are placed on the same line.
I beg Your pardon for the long post and all Your suggestions will be welcome.
Your first output file is the questions list. Your second output file is the answers list. Simply put, your main objective is to separate the questions from the answers from your input file, and then add aesthetics to meet the desired output formats.
In the solution below, output1 is the desired question information, and output2 is the desired answer information. I added your stated goals in the commented code to kind of help show how each part is done.
library(stringr) # used for string manipulations (required for `str_extract_all()` below)
# read input file
f <- readLines(file("input_file.txt", open = "r"))
# Firstable I should check if the input file contains any semicolon and trasform[sic] to something else (_ for example)
f <- gsub(";", "_", f)
# Second I should add all the stuff in order to represent all the fields of the table. The field values are fixed except for the indexes that are progressive
f_questions <- f[grepl("^[0-9]", f)] # selects lines that start with a digit (because they are questions)
output1 <- paste0(1:length(f_questions), "; 1; 1; ", f_questions, "; Y")
f_answers <- f[grepl("^[A-C]", f)] # selects lines that start with capital letters "A" through "C" (because they are answers)
# Third I should deal with the case when the three answers are placed on the same line.
f_answers <- unlist(str_extract_all(f_answers, ".\\)[^.]+.")) # makes one answer per string (assuming all answers contain and end with a period)
output2 <- paste0(rep(1:(length(f_answers)/3), each = 3), ";", f_answers, "; N; ", 1:length(f_answers))
> output1
[1] "1; 1; 1; 001. A norma del disposto di cui al co. 2, art. 36, Reg. Ord. Penit., negli istituti penitenziari come sono disciplinate le modalità relative allo svolgimento dei vari servizi predisposti per i detenuti e per gli internati? ; Y"
[2] "2; 1; 1; 002. A norma del disposto di cui al co. 7 , art. 47-quinquies, Ord. Penit., la detenzione domiciliare speciale può essere concessa anche al padre detenuto? ; Y"
[3] "3; 1; 1; 003. A norma del disposto di cui al co. 8-bis, art. 656, c.p.p. (Esecuzione delle pene detentive), quando il pubblico ministero può disporre la rinnovazione della notifica dell'avviso dell'ordine di esecuzione e del decreto di sospensione? ; Y"
[4] "4; 1; 1; 004. Quale sanzione disciplinare di cui all'art. 39, Ord. Penit., non può avere durata massima di quindici giorni? ; Y"
[5] "5; 1; 1; 005. In materia di \"alimentazione\" l'art. 9, Ord. Penit. dispone, tra l'altro, che: ; Y"
[6] "6; 1; 1; 006. A norma del disposto di cui all'art. 76, Reg. Ord. Penit., quale ricompensa può essere concessa dal consiglio di disciplina, ai detenuti e agli internati, se ricorrano i presupposti? ; Y"
[7] "7; 1; 1; 007. A norma del disposto di cui al co. 11, art. 11, Ord. Penit., nel caso di diagnosi anche sospetta di malattia contagiosa devono essere messi in atto tutti gli interventi di controllo per evitare insorgenza di casi secondari, compreso l'isolamento_ chi deve essere immediatamente informato? ; Y"
[8] "8; 1; 1; 008. A norma del disposto di cui all'art. 40, Ord. Penit., quale tra le seguenti non è una sanzione disciplinare deliberata al consiglio di disciplina? ; Y"
[9] "9; 1; 1; 009. In materia di \"alimentazione\" l'art. 9, Ord. Penit. dispone, tra l'altro, che: ; Y"
[10] "10; 1; 1; 010. Al condannato ammesso al regime di semilibertà possono essere concesse a titolo di premio una o più licenze di durata non superiore nel complesso a 45 giorni l'anno. Chi provvede alla concessione? ; Y"
> output2
[1] "1;A)Con singoli provvedimenti del direttore dell'istituto.; N; 1"
[2] "1;B)Con regolamento interno dell'istituto.; N; 2"
[3] "1;C)Con singoli atti del provveditore regionale competente.; N; 3"
[4] "2;A)Sì, alle stesse condizioni previste per la madre, in alternativa alla madre.; N; 4"
[5] "2;B)Sì, alle stesse condizioni previste per la madre, ma solo se la madre è deceduta e non vi è modo di affidare la prolead altri che al padre.; N; 5"
[6] "2;C)Sì, alle stesse condizioni previste per la madre, se la madre è deceduta o impossibilitata e non vi è modo di affidarela prole ad altri che al padre.; N; 6"
[7] "3;A)Solo quando è sicuramente provato che il condannato non abbia avuto effettiva conoscenza dell'avviso.; N; 7"
[8] "3;B)In nessun caso.; N; 8"
[9] "3;C)Quando è provato o appare probabile che il condannato non abbia avuto effettiva conoscenza dell'avviso.; N; 9"
[10] "4;A)Isolamento durante la permanenza all'area aperta.; N; 10"
[11] "4;B)Esclusione dalle attività in comune.; N; 11"
[12] "4;C)Esclusione dalle attività ricreative e sportive.; N; 12"
[13] "5;A)Il vitto è somministrato, di regola, in locali all'uopo destinati.; N; 13"
[14] "5;B)I prezzi di vendita devono essere almeno inferiori del 30% rispetto a quelli comunemente praticati nel luogo in cui èsito l'istituto.; N; 14"
[15] "5;C)Il servizio di vettovagliamento di regola non è gestito direttamente dall'amministrazione penitenziaria.; N; 15"
[16] "6;A)Encomio.; N; 16"
[17] "6;B)Nessuna delle altre risposte è corretta_ tutte le ricompense sono concesse dal direttore dell'istituto penitenziario o dalmagistrato di sorveglianza.; N; 17"
[18] "6;C)Proposta di licenza.; N; 18"
[19] "7;A)Il difensore della persona contagiata.; N; 19"
[20] "7;B)Il famigliari della persona contagiata.; N; 20"
[21] "7;C)Il direttore dell'istituto.; N; 21"
[22] "8;A)Isolamento durante la permanenza all'area aperta.; N; 22"
[23] "8;B)Esclusione da attività in comune.; N; 23"
[24] "8;C)Richiamo.; N; 24"
[25] "9;A)Una rappresentanza di soggetti non detenuti o internati controlla l'applicazione delle tabelle e la preparazione delvitto.; N; 25"
[26] "9;B)Tutti i detenuti hanno la stessa alimentazione_ l'istituto non può tener conto di eventuali diverse richieste anche sepreviste dal credo religioso.; N; 26"
[27] "9;C)Il servizio di vettovagliamento è di regola gestito direttamente dall'amministrazione penitenziaria.; N; 27"
[28] "10;A) Il tribunale di sorveglianza.; N; 28"
[29] "10;B) Il direttore dell'istituto penitenziario. N; 29"
[30] "10;C) Il magistrato di sorveglianza.; N; 30"
Diving into the code
Most of these functions are base functions that are worth becoming familiar with. They are likely covered in R introduction courses.
The more complicated part in the code is the regular expression used inside str_extract_all(), so I will explain that here.
str_extract_all(f_answers, ".\\)[^.]+.") extracts all occurrences of the regular expression pattern ".\\)[^.]+." from the input strings f_answers.
".\\)[^.]+." indicates that the pattern starts with a wild card character (expressed as .) followed by a closing parenthesis (expressed as \\)). The string can then match one or more of any character, except the period, until it reaches the period ([^.]+.). (FYI, the last part can also be coded as [^\\.]+\\. to prevent confusion of the period (\\.) with the wild card character.)

Search in R list function

I made the following function in order to output only sentences containing ALL of the words in "keywords":
ricerca <- function(sentences,keywords){
for(i in 1:length(keywords)){
sentences <- lapply(sentences, function(x) grep(keywords[i], x, value = TRUE))
sentences <-unlist(sentences[lengths(sentences) > 0])
return (sentences)
}
}
I used unlist because the input sentences are in a get_sentences (sentimentr) list.
Here is a bit of the list:
> frasi_negative[4:5]
[[1]]
[1] "Per la musica non è male ma per le telefonate è completamente unutile."
[2] "L'altro interlocutore non mi sente."
[3] "Quindi mi costringe a disabilitare il bluetooth per rispondere."
[4] "Il problema ulteriore è che dopo pochi secondi il bluetooth si ricollega automaticamente alle cuffie."
[5] "Quindi bisogna disabilitarlo nuovamente e cosi via."
[6] "Da impazzire ..."
[7] "Altro problema è che a volte riponendo le cuffiette nella custodia non si spegnevano."
[8] "Insomma prodotto molto economico e scarsamente funzionale."
[9] "Lo sconsiglio."
[[2]]
[1] "L'auricolare sinistro non si è mai connesso all'altro."
[2] "Provando a seguire le istruzioni oppure le dritte trovate in risposta alle domande qui su amazon non ho risolto, inoltre il lampeggiare delle lucine non corrispondeva mai a quello che era indicato."
[3] "Le ho rimandate indietro."
[4] "Peccato perchè il suono della destra era ottimo e il prodotto molto carino"
When I try using my function
ricerca(frasi_negative, c("audio","pessimo"))
The output shows sentences containing even only one of the keywords.
> ricerca(frasi_negative, c("audio","pessimo"))
[1] "Audio basso, bassi praticamente inesistenti se non aumentandoli a dismisura dal audio manager del telefono."
[2] "Correndo, a seconda della posizione del telefono, l'audio scompare brevemente."
Can you tell me why this happens, and how to solve this issue?
Thank you very much.
UPDATE:
> dput(frasi_negative[4:5])
list(c("Per la musica non è male ma per le telefonate è completamente unutile.",
"L'altro interlocutore non mi sente.", "Quindi mi costringe a disabilitare il bluetooth per rispondere.",
"Il problema ulteriore è che dopo pochi secondi il bluetooth si ricollega automaticamente alle cuffie.",
"Quindi bisogna disabilitarlo nuovamente e cosi via.", "Da impazzire ...",
"Altro problema è che a volte riponendo le cuffiette nella custodia non si spegnevano.",
"Insomma prodotto molto economico e scarsamente funzionale.",
"Lo sconsiglio."), c("L'auricolare sinistro non si è mai connesso all'altro.",
"Provando a seguire le istruzioni oppure le dritte trovate in risposta alle domande qui su amazon non ho risolto, inoltre il lampeggiare delle lucine non corrispondeva mai a quello che era indicato.",
"Le ho rimandate indietro.", "Peccato perchè il suono della destra era ottimo e il prodotto molto carino"
))
You can achieve this in almost only 1 line of Base-R code
sentences <- unlist(frasi_negative)[lengths(frasi_negative) > 0]
sentences[which(apply(sapply(keywords,grepl,sentences),1,all))]
example with keywords <- c("il","della")
outpu [1] "Peccato perchè il suono della destra era ottimo e il prodotto molto carino"
Edit: The which function is not needed, we can simplify to:
sentences[apply(sapply(keywords,grepl,sentences),1,all)]
Data:
a <- c("Per la musica non è male ma per le telefonate è completamente unutile.","L'altro interlocutore non mi sente.","Quindi mi costringe a disabilitare il bluetooth per rispondere.","Il problema ulteriore è che dopo pochi secondi il bluetooth si ricollega automaticamente alle cuffie.","Quindi bisogna disabilitarlo nuovamente e cosi via.","Da impazzire ...","Altro problema è che a volte riponendo le cuffiette nella custodia non si spegnevano.","Insomma prodotto molto economico e scarsamente funzionale.","Lo sconsiglio.")
b<- c("L'auricolare sinistro non si è mai connesso all'altro.","Provando a seguire le istruzioni oppure le dritte trovate in risposta alle domande qui su amazon non ho risolto, inoltre il lampeggiare delle lucine non corrispondeva mai a quello che era indicato.","Le ho rimandate indietro.","Peccato perchè il suono della destra era ottimo e il prodotto molto carino")
frasi_negative <- list(a,b)
Base R solution:
# Function; ricera => function
ricera <- function(sentences, keywords){
keywords <- unique(keywords)
matches <- lapply(sentences, function(w){
matched <- lapply(keywords, function(x){grep(x, w, value = TRUE)})
Reduce(function(y, z){intersect(y, z)}, matched)
}
)
Filter(Negate(is.null), unlist(matches))
}
# Application: charater vector => stdout console
ricera(text_list, c("problema", "non"))
Data:
text_list <- list(c("Per la musica non è male ma per le telefonate è completamente unutile.",
"L'altro interlocutore non mi sente.",
"Quindi mi costringe a disabilitare il bluetooth per rispondere.",
"Il problema ulteriore è che dopo pochi secondi il bluetooth si ricollega automaticamente alle cuffie.",
"Quindi bisogna disabilitarlo nuovamente e cosi via.",
"Da impazzire ...",
"Altro problema è che a volte riponendo le cuffiette nella custodia non si spegnevano.",
"Insomma prodotto molto economico e scarsamente funzionale.",
"Lo sconsiglio."),
c("L'auricolare sinistro non si è mai connesso all'altro.",
"Provando a seguire le istruzioni oppure le dritte trovate in risposta alle domande qui su amazon non ho risolto, inoltre il lampeggiare delle lucine non corrispondeva mai a quello che era indicato.",
"Le ho rimandate indietro.",
"Peccato perchè il suono della destra era ottimo e il prodotto molto carino"))

Extract sentences containing specific word(s)

I have a get_sentences (sentimentr) list, and need to extract only those sentences containing specific words.
This is how the data looks like:
> class(frasi_negative)
[1] "get_sentences" "get_sentences_character" "list"
> frasi_negative[2:3]
[[1]]
[1] "Al mio cellulare (Xiaomi Redmi Note 5) si mostrano singolarmente, separate, quando cerco di connetterle."
[2] "O si connette alla destra, o alla sinistra, e in ogni caso il suono poi esce dalle casse del cellulare (nonostante aver dato alle cuffie tutti i permessi)."
[3] "Non capisco perché, data che la prima connessione era andata come si deve; spente e riaccese, hanno iniziato a comportarsi così."
[4] "Ho provato a riavviare sia loro che cellulare, a rimetterle nella scatoletta e ritoglierle, ma il problema persiste."
[5] "Non penso c'entri il mio cellulare (mai avuto problemi con prodotti simili), in ogni caso effettuo reso con rimborso."
[[2]]
[1] "Comprate due mesi fa."
[2] "All'inizio funzionavano perfettamente, ma dopo qualche settimana hanno iniziato a disconnettersi tra loro di tanto in tanto."
[3] "qualche giorno fa estraendo la sinistra dall'astuccio magnetico è saltata la saldatura che la teneva chiusa e questo è il risultato."
[4] "Usandole in chiamata rendono un suono non limpido."
[5] "Il suono è accettabile ma nulla di speciale."
[6] "Ormai sono inutilizzabili."
[7] "Per il prezzo mi aspettavo un prodotto migliore e più duraturo (avendo già provato auricolari wireless della stessa fascia di prezzo di altri brand)"
As an example, if I search "wireless", only the [[2]][7] element should show up.
How can I achieve this?
Thank you in advance.
You can try to iterate over the list using lapply and return the sentence which matches a particular keyword using grep .
keyword <- 'wireless'
lapply(frasi_negative, function(x) grep(keyword, x, value = TRUE))
We can use str_detect
library(purrr)
library(stringr)
keyword <- 'wireless'
map(frasi_negative, ~ .x[str_detect(.x, keyword)])

How can I remove line break tags from a character vector with Regular Expressions

How can I remove the \n line break tag from a string using regular expressions?
I tried using stringr::str_replace(), but failed.
For example, I have the string:
text= "de sentir sua atitude\n\n ela merece\n\n ele não dos cabelos\n\n você vai te puxo pra caralho só no corpo nele e berrar que não sei dizer alguma coisa\nem precisar ser tão bonita o meio das outras\n\n no chão.\nespecialmente quando ele levou tanto buscava. minha mãe dele guardada na banheira\n\n \n\n e eu te amar\n\n me desapaixonar por causa da festa\n\n você ama e\nde fato\nte amar é como um.\nque possamos nada especial acho que você imagina a conexão ou onde a independência aqui bocas nunca teve o amor com esta é seu ambiente\nnão"
And I tried using [:punct:]n, and \\n{1,}, but all of them failed in doing so when I ran than into the replacement function with:
stringr::str_replace(text, '([:punct:]n|\\n{1,})', ' ')
We can use str_remove_all which would make it compact instead of using the replacement argument in str_replace_all with ""
stringr::str_remove_all(text, '([[:punct:]]|\\n{1,})')
NOTE: str_replace replaces only the first instance and not more than one
Using R base
string <- "aaaa\naaaaaaa\naaaaa\n"
gsub('\n', '', string)
will output
"aaaaaaaaaaaaaaaa"
Also works with your text. Sometimes the simplest is the best solution, no need for regex, it is technically a literal match.

How to convert a rtf string to plain text using R?

I have lots of rtf strings (Base64) and I want to use R to obtain a plain text. Is it possible? There is one example bellow.
There are lots of ways using other languages, but it will be very useful if I found a "R way" to do the job.
rtfString <- "e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZGVmZjBcZGVmbGFuZzEwNDZcZGVmbGFuZ2ZlMTA0NlxkZWZ0YWI3MDl7XGZvbnR0Ymx7XGYwXGZzd2lzc1xmcHJxMlxmY2hhcnNldDAgQXJpYWw7fX0NClx2aWV3a2luZDRcdWMxXHBhcmRcc2w0ODBcc2xtdWx0MVxxalxmMFxmczI0XHRhYlxiIE8gU1IuIERVRElNQVIgUEFYSVVCQSBcYjAgKFBTREItUEEuIFNlbSByZXZpc1wnZTNvIGRvIG9yYWRvci4pIC0gU3IuIFByZXNpZGVudGUsIFNyYXMuIGUgU3JzLiBQYXJsYW1lbnRhcmVzLCBvY3VwbyBlc3RhIHRyaWJ1bmEgcGFyYSBwYXJhYmVuaXphciBhIHRvcmNpZGEgcGFyYWVuc2UuIE8gZnV0ZWJvbCBwYXJhZW5zZSBkZXUgdW0gXGkgc2hvd1xpMCAgZGUgY2l2aWxpZGFkZSBuZXN0ZSBmaW5hbCBkZSBzZW1hbmEsIGUgYSB0b3JjaWRhIGJpY29sb3IgZG8gUGFwXCdlM28gZGEgQ3VydXp1LCBvIFBheXNhbmR1LCBlc3RcJ2UxIGRlIHBhcmFiXCdlOW5zLCBwb2lzIHNhZ3JvdS1zZSBjYW1wZVwnZTNvIGRvIHByaW1laXJvIHR1cm5vIGVtIGNpbWEgZG8gc2V1IG1haW9yIHJpdmFsLCB2ZW5jZW5kbyBvIHZhbG9yb3NvIENsdWJlIGRvIFJlbW8uDQpccGFyIFx0YWIgRXN0XCdlM28gZGUgcGFyYWJcJ2U5bnMgbyBQYXlzYW5kdSwgbyBHb3Zlcm5vIGRvIEVzdGFkbywgcXVlIGRldSB1bSBcaSBzaG93IFxpMCBkZSBvcmdhbml6YVwnZTdcJ2UzbywgYSBKdXN0aVwnZTdhIHBhcmFlbnNlLCBhIHBvbFwnZWRjaWEsIG9zIFwnZjNyZ1wnZTNvcyBkZSBzZWd1cmFuXCdlN2EgZG8gRXN0YWRvLiBFbmZpbSwgbWFpcyB1bWEgdmV6LCBwYXJhYlwnZTlucyBcJ2UwIHRvcmNpZGEgYmljb2xvci4NClxwYXIgXHRhYiBQYXlzYW5kdSwgbXVpdGFzIGUgbXVpdGFzIGdsXCdmM3JpYXMgdm9jXCdlYSBhaW5kYSBkYXJcJ2UxIHBhcmEgZXNzYSBzdWEgYnJpbGhhbnRlIHRvcmNpZGEsIHF1ZSBcJ2U5IGEgdG9yY2lkYSBiaWNvbG9yIGRlIEJlbFwnZTltIGRvIFBhclwnZTEuDQpccGFyIFx0YWIgTXVpdG8gb2JyaWdhZG8sIFNyLiBQcmVzaWRlbnRlLg0KXHBhciANClxwYXIgXHBhcmRcc2EyMDBcc2wyNzZcc2xtdWx0MSANClxwYXIgDQpccGFyIFxwYXJkXHNsNDgwXHNsbXVsdDFccWogDQpccGFyIH0NCgA="
plainText <- function(rtfString)
# The result will be something similar to this:
plainText
[1] "Sr. Presidente, Sras. e Srs. Parlamentares, ocupo esta tribuna para parabenizar a torcida paraense. O futebol paraense deu um show de civilidade neste final de semana, e a torcida bicolor do Papão da Curuzu, o Paysandu, está de parabéns, pois sagrou-se campeão do primeiro turno em cima do seu maior rival, vencendo o valoroso Clube do Remo.\nEstão de parabéns o Paysandu, o Governo do Estado, que deu um show de organização, a Justiça paraense, a polícia, os órgãos de segurança do Estado. Enfim, mais uma vez, parabéns à torcida bicolor.\nPaysandu, muitas e muitas glórias você ainda dará para essa sua brilhante torcida, que é a torcida bicolor de Belém do Pará.\nMuito obrigado, Sr. Presidente."
A combination of a few packages and some regex can accomplish this:
library(RCurl)
library(stringr)
library(magrittr)
decode_rtf <- function(txt) {
txt %>%
base64Decode %>%
str_replace_all("\\\\'e3", "ã") %>%
str_replace_all("\\\\'e1", "á") %>%
str_replace_all("\\\\'e9", "é") %>%
str_replace_all("\\\\'e7", "ç") %>%
str_replace_all("\\\\'ed", "í") %>%
str_replace_all("\\\\'f3", "ó") %>%
str_replace_all("\\\\'ea", "ê") %>%
str_replace_all("\\\\'e0", "à") %>%
str_replace_all("(\\\\[[:alnum:]']+|[\\r\\n]|^\\{|\\}$)", "") %>%
str_replace_all("\\{\\{[[:alnum:]; ]+\\}\\}", "") %>%
str_trim
}
rtfString <- "e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZGVmZjBcZGVmbGFuZzEwNDZcZGVmbGFuZ2ZlMTA0NlxkZWZ0YWI3MDl7XGZvbnR0Ymx7XGYwXGZzd2lzc1xmcHJxMlxmY2hhcnNldDAgQXJpYWw7fX0NClx2aWV3a2luZDRcdWMxXHBhcmRcc2w0ODBcc2xtdWx0MVxxalxmMFxmczI0XHRhYlxiIE8gU1IuIERVRElNQVIgUEFYSVVCQSBcYjAgKFBTREItUEEuIFNlbSByZXZpc1wnZTNvIGRvIG9yYWRvci4pIC0gU3IuIFByZXNpZGVudGUsIFNyYXMuIGUgU3JzLiBQYXJsYW1lbnRhcmVzLCBvY3VwbyBlc3RhIHRyaWJ1bmEgcGFyYSBwYXJhYmVuaXphciBhIHRvcmNpZGEgcGFyYWVuc2UuIE8gZnV0ZWJvbCBwYXJhZW5zZSBkZXUgdW0gXGkgc2hvd1xpMCAgZGUgY2l2aWxpZGFkZSBuZXN0ZSBmaW5hbCBkZSBzZW1hbmEsIGUgYSB0b3JjaWRhIGJpY29sb3IgZG8gUGFwXCdlM28gZGEgQ3VydXp1LCBvIFBheXNhbmR1LCBlc3RcJ2UxIGRlIHBhcmFiXCdlOW5zLCBwb2lzIHNhZ3JvdS1zZSBjYW1wZVwnZTNvIGRvIHByaW1laXJvIHR1cm5vIGVtIGNpbWEgZG8gc2V1IG1haW9yIHJpdmFsLCB2ZW5jZW5kbyBvIHZhbG9yb3NvIENsdWJlIGRvIFJlbW8uDQpccGFyIFx0YWIgRXN0XCdlM28gZGUgcGFyYWJcJ2U5bnMgbyBQYXlzYW5kdSwgbyBHb3Zlcm5vIGRvIEVzdGFkbywgcXVlIGRldSB1bSBcaSBzaG93IFxpMCBkZSBvcmdhbml6YVwnZTdcJ2UzbywgYSBKdXN0aVwnZTdhIHBhcmFlbnNlLCBhIHBvbFwnZWRjaWEsIG9zIFwnZjNyZ1wnZTNvcyBkZSBzZWd1cmFuXCdlN2EgZG8gRXN0YWRvLiBFbmZpbSwgbWFpcyB1bWEgdmV6LCBwYXJhYlwnZTlucyBcJ2UwIHRvcmNpZGEgYmljb2xvci4NClxwYXIgXHRhYiBQYXlzYW5kdSwgbXVpdGFzIGUgbXVpdGFzIGdsXCdmM3JpYXMgdm9jXCdlYSBhaW5kYSBkYXJcJ2UxIHBhcmEgZXNzYSBzdWEgYnJpbGhhbnRlIHRvcmNpZGEsIHF1ZSBcJ2U5IGEgdG9yY2lkYSBiaWNvbG9yIGRlIEJlbFwnZTltIGRvIFBhclwnZTEuDQpccGFyIFx0YWIgTXVpdG8gb2JyaWdhZG8sIFNyLiBQcmVzaWRlbnRlLg0KXHBhciANClxwYXIgXHBhcmRcc2EyMDBcc2wyNzZcc2xtdWx0MSANClxwYXIgDQpccGFyIFxwYXJkXHNsNDgwXHNsbXVsdDFccWogDQpccGFyIH0NCgA="
decode_rtf(rtfString)
## [1] "O SR. DUDIMAR PAXIUBA (PSDB-PA. Sem revisão do orador.) - Sr. Presidente, Sras. e Srs. Parlamentares, ocupo esta tribuna para parabenizar a torcida paraense. O futebol paraense deu um show de civilidade neste final de semana, e a torcida bicolor do Papão da Curuzu, o Paysandu, está de parabéns, pois sagrou-se campeão do primeiro turno em cima do seu maior rival, vencendo o valoroso Clube do Remo. Estão de parabéns o Paysandu, o Governo do Estado, que deu um show de organização, a Justiça paraense, a polícia, os órgãos de segurança do Estado. Enfim, mais uma vez, parabéns à torcida bicolor. Paysandu, muitas e muitas glórias você ainda dará para essa sua brilhante torcida, que é a torcida bicolor de Belém do Pará. Muito obrigado, Sr. Presidente."
I'm sure there are some edge cases this might bork on but it's definitely a start for you.

Resources