what is the correct syntax for nested if CLIPS ?
(defrule determina-si-tiene-gripe ""
?A <- (enfermedad (Gripe nose) (compostura))
=>
(if (si-o-no-p "Tiene Fiebre(si/no)? ")
(if (si-o-no-p "Tiene dolores en el cuerpo(si/no)? ")
if (si-o-no-p "Tiene dolor de garganta(si/no)? ")
then (modify ?A (Gripe si)(compostura "El paciente tiene un Resfrio"))
else (modify ?A (Gripe no)))
else (modify ?A (Gripe no)))
else (modify ?A (Gripe no))))
Nested if-the-else is just another action inside then or else branch, as stated in the doc:
Any number of allowable actions may be used inside of the then or else portion, including another if...then...else structure.
So it should be something like
(if (si-o-no-p "Tiene Fiebre(si/no)? ")
then
(if (si-o-no-p "Tiene dolores en el cuerpo(si/no)? ")
then
(if (si-o-no-p "Tiene dolor de garganta(si/no)? ")
then
(modify ?A (Gripe si)(compostura "El paciente tiene un Resfrio"))
else (modify ?A (Gripe no)))
else (modify ?A (Gripe no)))
else (modify ?A (Gripe no))))
However it seems that your example does not require nested if's, all that is needed is one if with several conditions:
(if (and (si-o-no-p "Tiene Fiebre(si/no)? ")
(si-o-no-p "Tiene dolores en el cuerpo(si/no)? ")
(si-o-no-p "Tiene dolor de garganta(si/no)? "))
then
(modify ?A (Gripe si)(compostura "El paciente tiene un Resfrio"))
else (modify ?A (Gripe no)))
(there seems to be user input involved, but this might work anyway)
Related
This question already has answers here:
remove text between delimiters, multiple times on each line
(2 answers)
Closed 3 years ago.
I want to get rid of everything between patterns "< >" including patterns using bash.
I have tried those sed commands, but it's not giving the result i want.
sed 's/<.*>//g'
sed -r 's/<[^ ][^ ]*>//g'
For instance
From:
<span class="tlf_cdefinition">Qui ordonne, dispose, met en ordre.</span> <span class="tlf_cexemple"><i>Le geste humain (...) renonce à prendre; il met la chose en place et la considère; tout est spectacle pour l'homme, et même son action. Non point doux par cela seul; redoutable au contraire par cette activité ordinnatrice </i>[<i>sic</i>] (<span class="tlf_cauteur"><span class="tlf_smallcaps">Alain</span></span><span class="tlf_ctitre">, <i>Propos</i></span><span class="tlf_cdate">, 1921</span>, p.271).</span><div class="tlf_parothers"><b>Rem.</b> On emploie de préférence auj., dans ce sens, <i>ordonnateur, -trice</i>.</div></div><div class="tlf_parah"><span class="tlf_cplan"><b>II. −</b></span> <span class="tlf_cemploi"><i>Subst. masc.</i></span> <div class="tlf_parah"><span class="tlf_cplan"><b>A. −</b></span> <span class="tlf_cdomaine"><i>LITURG.</i>,</span> <span class="tlf_cemploi"><i>vx.</i></span> <span class="tlf_cdefinition">Celui qui confère le sacrement d'un ordre ecclésiastique. (<span class="tlf_csource">Dict. <span class="tlf_smallcaps">xix</span><sup>e</sup>et <span class="tlf_smallcaps">xx</span><sup>e</sup>s.</span>).</span> </div><div class="tlf_parah"><span class="tlf_cplan"><b>B. −</b></span> <span class="tlf_cdomaine"><i>INFORMAT.</i></span> <span class="tlf_cdefinition">Machine algorithmique composée d'un assemblage de matériels correspondant à des fonctions spécifiques, capable de recevoir de l'information, dotée de mémoires à grande capacité et de moyens de traitement à grande vitesse, pouvant restituer tout ou partie des éléments traités, ayant la possibilité de résoudre des problèmes mathématiques et logiques complexes, et nécessitant pour son fonctionnement la mise en oeuvre et l'exploitation automatique d'un ensemble de programmes enregistrés.</span> <span class="tlf_csyntagme"><i>Éléments périphériques d'un ordinateur; adresse, console, pupitre d'un ordinateur; imprimante, mémoire d'un ordinateur;</i></span> <span class="tlf_csyntagme">
I want to keep only that:
Qui ordonne, dispose, met en ordre.Le geste humain (...) renonce à
prendre; il met la chose en place et la considère; tout est spectacle
pour l'homme, et même son action. Non point doux par cela seul;
redoutable au contraire par cette activité ordinnatrice [] (Alain,
Propos, 1921, p.271).Rem. On emploie de préférence auj., dans ce sens,
ordonnateur, -trice.II. −Celui qui confère le sacrement d'un ordre
ecclésiastique. (Dict. xixeet xxes.).B. −INFORMAT.Machine
algorithmique composée d'un assemblage de matériels correspondant à
des fonctions spécifiques, capable de recevoir de l'information, dotée
de mémoires à grande capacité et de moyens de traitement à grande
vitesse, pouvant restituer tout ou partie des éléments traités, ayant
la possibilité de résoudre des problèmes mathématiques et logiques
complexes, et nécessitant pour son fonctionnement la mise en oeuvre et
l'exploitation automatique d'un ensemble de programmes
enregistrés.Éléments périphériques d'un ordinateur; adresse, console,
pupitre d'un ordinateur; imprimante, mémoire d'un ordinateur;
As the comment by #Tom above alludes, using regex to parse HTML is generally evil. That being said, if you only have single level (non nested) HTML tags, then regex might work here. But, Sed's regex engine is not very powerful, as it does not support lazy dot. Here is a way to do this using Perl in the Bash:
echo "<span class=\"tlf_cdefinition\">Qui ordonne, dispose, met en ordre.</span> <h1>Hello World!</h1>"
| perl -pe 's|<[^>]+>(.*?)</[^>]+>|\1|g'
This outputs:
Qui ordonne, dispose, met en ordre. Hello World!
I ran into an interesting problem when attempting to tokenise a french text using nltk (version 3.1, python 2.7). Here is the code snippet I am using.
#python 2.7
from __future__ import division
import nltk, re, pprint
f= open('test.txt')
raw = f.read()
print "got it!"
print type(raw)
ucoderaw=raw.decode('utf-8')
print ucoderaw
tokens = nltk.word_tokenize(ucoderaw)
print type(tokens)
words = [w.lower() for w in tokens]
print type(words)
vocab = sorted(set(words))
print "Tokens"
The document contains a french text:
J'ai lieu de croire que Mr. de Voltaire ne sera pas fâché de voir que
son Manuscrit, qu'il a intitulé Abrégé de l'Histoire Universelle
depuis Charlemagne jusqu'à Charles-Quint, et qu'il dit être entre les
mains de trente Particuliers, soit tombé entre les miennes. Il sait
qu'il m'en avait flatté dès l'année 1742, à l'occasion de son Siècle
de Louis XIV, auquel je ne renonçai en 1750, que parce qu'il me dit
alors à Postdam, où j'étais, qu'il l'imprimait lui-même à ses propres
dépens. Ainsi il ne s'agit ici que de dire comment cet Abrégé m'est
tombé entre les mains, le voici.
À mon retour de Paris, en Juin de cette année 1753, je m'arrêtai à
Bruxelles, où j'eus l'honneur de voir une Personne de mérite, qui en
étant le possesseur me le fit voir, et m'en fit aussi tout l'éloge
imaginable, de même que l'histoire du Manuscrit, et de tout ce qui
s'était passé à l'occasion d'un Avertissement qui se trouve inséré
dans le
second Volume du mois de Juin 1752 du Mercure de France, et répété dans l'Épilogueur du 31 Juillet de la même année, avec la Réponse
que l'on y a faite, et qui se trouve dans le même Épilogueur du 7
Août suivant: toutes choses inutiles à relever ici, mais qui m'ont
ensuite déterminé à acheter des mains de ce Galant-Homme le Manuscrit
après avoir été offert à l'Auteur, bien persuadé d'ailleurs qu'il
était effectivement de Mr. de Voltaire; son génie, son style, et
surtout son orthographe s'y trouvant partout. J'ai changé cette
dernière, parce qu'il est notoire que le Public a toutes les peines du
monde à s'y accoutumer; et c'est ce que l'Auteur est prié de vouloir
bien excuser.[1]
Je dois encore faire remarquer que par la dernière période de ce
Livre, il paraît qu'elle fait la clôture de cet Abrégé, qui finit à
Charles VII Roi de France, au lieu que l'Auteur la promet par son Titre jusqu'à l'Empereur Charles-Quint. Ainsi il est à présumer que
ce qui devrait suivre, est cette partie différente d'Histoire qui
concerne les Arts, qu'il serait à souhaiter que Mr. de Voltaire
retrouvât, ou, pour mieux dire, qu'il voulût bien refaire, et la
pousser jusqu'au Siècle de Louis XIV, afin de remplir son plan, et
de nous donner ainsi une suite d'Histoire qui ferait grand plaisir au
Public et aux Libraires.
When I attempt to tokenise that text using tokens = nltk.word_tokenize(ucoderaw)
and then subsequently print out the tokens using sorted(set(words))
I get output with broken utf-8 encoding:
u'autant', u'author', u'autres', u'aux', u'available', u'avait',
u'avant', u'avec', u'avertissement', u'avoir', u'avons', u'away',
u'ayant', u'barbare', u'beaucoup', u'biblioth\xe8que', u'bien',
u'bnf/gallica', u'bornais', u'bruxelles', u'but', u'by', u"c'est",
u'capet', u'carri\xe8re', u'ce', u'cela', u'ces', u'cet', u'cette',
u'ceux', u'chang\xe9', u'chaos', u'character', u'charger',
u'charlemagne', u'charlequint', u'charles-quint_', u'chartes',
u'chez', u'chine', u'choses', u'chronologie', u'chronologiques',
u'chr\xe9tienne', u'cl\xf4ture'
where the correct output should include accents i.e. bibliothèque and not biblioth\xe8que
I've been trying to figure out how to fix this, short of saving the output to a file and writing another program to replace \xe8 with è and so on and so forth.
Is there a simpler method?
EDIT: Not the cleanest solution, however I found that by tokenising and then saving that output to a file with the correct encoding I do (largely get the output required):
#python 2.7
#-*- coding: utf-8 -*-
from __future__ import division
import nltk, re, pprint
f= open('test.txt')
raw = f.read()
print "got it!"
#print raw
print type(raw)
#encode as utf8 before moving on.
ucoderaw=raw.decode('utf-8')
tokens = nltk.word_tokenize(ucoderaw)
print type(tokens)
words = [w.lower() for w in tokens]
print type(words)
vocab = sorted(set(words))
print "encoded raw input is"
print ucoderaw
# GET TOKENS
print vocab
#write to file with correct encoding to "fix" the problem
output_file = open('output.txt', 'w')
print len(vocab)
for words in vocab:
output_file.write(words.encode('utf-8') + "\n")
Firstly, see http://nedbatchelder.com/text/unipain.html
Then try to use Python3 instead of Python2 for text processing, it makes your life a lot easier =)
Finally, regardless of Py3 or Py2, using io.open instead of open is a good practice so that your code works across both Py3 and Py2:
import io
from collections import Counter
import nltk
# Try to open files within a context, see
# https://www.python.org/dev/peps/pep-0343/ and
# http://effbot.org/zone/python-with-statement.htm
with io.open('test.txt', 'r', encoding='utf8') as fin:
word_counts = Counter(word_tokenize(fin.read()))
# List of top most common words.
print word_counts.most_common()
# Sorted by counts
print word_counts.most_common(len(word_counts))
# Sorted alphabetically
print sorted(word_counts.keys())
Here is the error summary:
CLIPS> (load "C:/Users/labor/Desktop/Witek/projekt.CLP")
Defining defrule: R1 +j+j
Defining defrule: R2 +j+j
Defining defrule: R3 =j+j+j
Defining defrule: imie-if =j=j+j+j
[CSTRCPSR1] Expected the beginning of a construct.
And here is the code for my CLIPS program. Basically I want it to react different if the name and last name are different from Abraham Lincoln.
(defrule R1
(initial-fact)
=>
(printout t "Enter your name:" crlf)
(bind ?name (read))
(assert (name ?name)))
(defrule R2
(name ?name)
=>
(printout t "Enter your last name" crlf)
(bind ?lastnm (read))
(assert (lastnm ?lastnm)))
(defrule R3
(and(name ?name)(lastnm ?lastnm))
=>
(printout t "How old are you " ?name "?" crlf)
(bind ?age (read))
(assert (age ?age)))
(defrule name-if
(name ?name)(lastnm ?lastnm)(age ?age)
=>
(if(and(eq ?name Abraham)(eq ?lastnm Lincoln))
then (printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old bro" crlf))
else (printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old" crlf)))
I copied the if statement logic from some webpage and I am not quite sure what, in this case, 'eq' stands for... i'd appreciate if you could additionally explain the role of it.
Regards,
W
You have an extra right parenthesis at the end of the then clause that is causing the issue. The Mac OS and Window CLIPS IDEs have a balance command that you can use to see if the parentheses are properly balanced within a construct. Just click inside a construct and apply the balance command several times until the entire construct is selected. If you place the cursor by the then keyword and balance, you'll see that the if statement is closed by the parenthesis at the end of the then clause and the else clause is left dangling.
The corrected rule is:
(defrule name-if
(name ?name)
(lastnm ?lastnm)
(age ?age)
=>
(if (and (eq ?name Abraham)
(eq ?lastnm Lincoln))
then
(printout t "Hello" ?name " " ?lastnm ", you are " ?age " years old bro" crlf)
else
(printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old" crlf)))
The eq predicate is short for equals. Unlike the = predicate that expects numeric arguments, eq compares values of any type.
I have three files. One is the original file, another contains a part of the lines of the original and another file with the modified parts have to replace the original.
And do not even know where to start. Can you help me?
Match file:
a demandé de montrer
grandes vacances
de faire
a montré
a remis
bien posé
n '
quand il l '
arrière du véhicule
modèle essence
Replace file:
a_demandé_de_montrer
grandes_vacances
de_faire
a_montré
a_remis
bien_posé
n_'
quand_il_l_'
arrière_du_véhicule
modèle_essence
Original file:
A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a demandé de montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de faire leurs avis....
A l'achat, le vendeur m'a montré comment rabattre le siège arrière, mais quand il l'a remis en place, ce n'était pas bien posé.
A l'arrière du véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.
Desired output:
A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
J'avais droit aux grandes_vacances à l'entretien kit vacances.
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas **bien_posé**.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.
There may be a better way to do this, but if you would like to use AWK, you can asssign a variable for each file you read, build some arrays with the find and replace string, and then loop through each find/replace value:
awk '
file == 1 { source[++s] = $0 }
file == 2 { replace[++r] = $0 }
file == 3 {
for (i = 1; i < s; i++)
{ gsub (source[i], replace[i], $0) }
print
}
' file=1 match_file \
file=2 replace_file \
file=3 original_file
I don't claim this is the most efficient way to do it, but I think it will do what you describe.
You didn't show any effort on the implementation but this should solve your problem.
awk -F"\t" 'NR==FNR{a[$1]=$2;next}
{for(k in a) gsub(k,a[k])}1' <(paste search replace) text
create a lookup table, do the replacement based on lookup.
Here is one approach of solving this using awk:
#!/usr/bin/awk -f
FILENAME == ARGV[1] { m[FNR]=$0 } # Store the match word in an array
FILENAME == ARGV[2] { r[FNR]=$0 } # Store the replacement word in a second array
FILENAME == ARGV[3] { for (i in m) gsub(m[i],r[i]); print } # Do the replacement for every line in file3
Run it like this:
./script.awk match_file replace_file original_file
This is the output the first three codes.This is the output the first two codes. Perhaps the encoding?
a_demand▒_de_montreraa_demand▒_de_montreria_demand▒_de_montrersa_demand▒_de_montrersa_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montrerea_demand▒_de_montrerua_demand▒_de_montrerra_demand▒_de_montrer a_demand▒_de_montrerua_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrerma_demand▒_de_montrerpa_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerda_demand▒_de_montrer a_demand▒_de_montreraa_demand▒_de_montrerda_demand▒_de_montreraa_demand▒_de_montrerpa_demand▒_de_montrerta_demand▒_de_montreraa_demand▒_de_montrerta_deman
d▒_de_montreria_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer
a_demand▒_de_montrerAa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreraa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreria_demand▒_de_montrerma_demand▒_de_montreria_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrer,a_demand▒_de_montrer a_demand▒_de_montrerca_demand▒_de_montrerha_demand▒_de_montreraa_demand▒_de_montrerca_demand▒_de_montrerua_demand▒_de_montrerna_demand▒
I tried this..
BEGIN {
while ((getline ln1 < mt) > 0)
{
source[++s] = ln1;
}
while ((getline ln2 < rp) > 0)
{
replace[++r] = ln2;
}
}
{
for ( i = 1; i < s; i++)
gsub (source[i], replace[i], $0)
print;
}
With GNU awk for ARGIND (with other awks just add FNR==1{ARGIND++}):
$ cat tst.awk
ARGIND==1 { a[FNR] = $0; next }
ARGIND==2 { map[a[FNR]] = $0; next }
{
for (m in map) {
gsub(m,map[m])
}
print
}
$ awk -f tst.awk match.txt replace.txt original.txt
A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes_vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas bien_posé.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.
Like all other solutions posted so far, the above will behave undesirably if you have regexp metachars in your match file or regexp capture group identifiers in your replace file. If that can happen use index() and substr() instead of gsub().
I'm trying to adapt an article to include it in a LaTeX Document. For that I'm using sed to substitute characters. However I find myself with a problem with some symbols like quotation marks. So for example with this paragraph:
Los problemas de Europa no son los mismos en todos los países. "Alemania no está creciendo rápidamente, pero consiguió evitar la recaída en la recesión", dice Guillen. "En Irlanda, por ejemplo, la economía cayó un 20%. En Francia, la situación no es desesperada, pero el país tampoco es ninguna Alemania". Mientras, Italia y España han vuelto a caer en la recesión, y Reino Unido acaba de anunciar que está nuevamente en recesión.
The " symbol (double quote in a single character) should be changed to a `` if it's found at the beginning of a word but to a '' (they are 2 characters: \x27\x27) if it's at the end. So the resulting paragraph should be (the % sysmbol was also changed):
Los problemas de Europa no son los mismos en todos los países. ``Alemania no está creciendo rápidamente, pero consiguió evitar la recaída en la recesión'', dice Guillen. ``En Irlanda, por ejemplo, la economía cayó un 20\%. En Francia, la situación no es desesperada, pero el país tampoco es ninguna Alemania''. Mientras, Italia y España han vuelto a caer en la recesión, y Reino Unido acaba de anunciar que está nuevamente en recesión.
I imagine that a regexp combining a space symbol and word to match at beginning should work, and a similar one for the end, but I don't know how to do it.
You could check that the " is either at the beginning of a line or preceded by a whitespace:
sed -r 's/(^| )"/\1``/g' filename
If your version of sed doesn't support extended regular expressions, you could say:
sed 's/\(^\| \)"/\1``/g'` filename
For escaping % and possibly other characters like &, $, you could make use of a character class to escape all those in one go:
sed -r 's/([$%])/\\\1/g' filename
The two could be combined too:
sed -r 's/(^| )"/\1``/g; s/([$%])/\\\1/g' filename
EDIT: From your clarification, it seems that you need to say:
sed -r 's/(^| )"/\1``/g;s/"/'"''"'\1/g' filename
This awk should change the " to `` if its in a beginning of a word.
awk '{for (i=1;i<=NF;i++) if ($i~/^"/) sub(/"/,"``",$i)}1' file
Los problemas de Europa no son los mismos en todos los países. ``Alemania no está creciendo rápidamente, pero consiguió evitar la recaída en la recesión", dice Guillen. ``En Irlanda, por ejemplo, la economía cayó un 20%. En Francia, la situación no es desesperada, pero el país tampoco es ninguna Alemania". Mientras, Italia y España han vuelto a caer en la recesión, y Reino Unido acaba de anunciar que está nuevamente en recesión.
It test one by one by one word and see if its starting with ", if yes change it.
For posix
sed "s/^\"/``/;s/ \"/ ``/g;s/\"$/''/;s/\" /''/g" YourFile > TempFile
mv TempFile YourFile
for gnu sed version (not testing machine here to validate)
sed -r "s/\( |^\)\"/\1``/g;s/"\( |$)/''\1/g" YourFile