Page 1 sur 1

travailler une variable chaine ?

Publié : 13 déc. 2017, 00:10
par alexbi
bonjour,

je commence par prévenir que mon niveau en LUA est limité surtout quand on commence a perler de fonction etc ...
Après plusieur de recherche je m'avoue vaincu ...

je cherche à contourner un problème, le voici :

J'utilise mon google home et IFTTT pour mettre a jour une variable "domoticz". Cette variable va donc prendre la valeur (chaine) de ma commande vocale, exemple : 'allume les lumières du salon'. J'utilise déjà du LUA avec beaucoup de si je dis tel phrases alors ou tels phrase ou tel ... Bref c'est long est pas toujours sure que ma commande sera bien celle que j'ai écrite dans mon script LUA...

Je souhaiterais donc utiliser un système de mots clés (idée venue du fait que j'utilise Tasker sur mon tel et que j'ai découvert le site dialoflow), par exemple dans ma phrase je vais détecter si je trouve le mot 'allumer' ou 'allume' ou 'active' et si il est détecté alors je vais chercher le nom de mon actionneur ici 'lumières du salon' puis j'effectue l'action.

rechercher un mot dans une chaine, j'ai trouvé cette méthode :

Code : Tout sélectionner

commandArray = {}

local y = 'active'
local z = 'allumer'
local x = 'power_on' 


s = 'je veux allumer la lumière'

a = string.find(s, z)
print(a)
b = string.find(s, y)
print(b)
c = string.find(s, x)
print(c)

if a ~= nil or b ~= nil or c ~= nil then
print('ok')
end

return commandArray
bon vous l'aurez compris ma méthode est niveau débutant...

j'ai trouvé d'autres méthode comme séparer ma chaine en plusieurs mots mais le problème c'est que ne sais pas comment utiliser ce mots séparément ou

exemple :

Code : Tout sélectionner

local example = "an example string"
for i in string.gmatch(example, "%S+") do
   print(i)
end

-- output:
-- an
-- example
-- string
comment récupérer les différentes valeur de i séparément pour les utiliser par la suite ?

je vous laisse m'aiguiller vers la bonne voie car je rame un peu trop :roll:

Re: travailler une variable chaine ?

Publié : 13 déc. 2017, 06:46
par Chrominator
Je peux te proposer de mettre tout ça dans un tableau.
Ensuite tu peux passer en revue le tableau dans une boucle.

Exemple :

Code : Tout sélectionner

local commande = {"active", "allumer", "power_on"}
s = 'je veux allumer la lumière'

for i in pairs(commande) do
	if string.find(s, commande[i])then   -- On compare l'ordre avec l'un des postes du tableau
		print("J'ai l'ordre d'allumer")
	else
		print("C'est pas cela qu'on m'a demandé")
	end
end
Ce qui affiche :

C'est pas cela qu'on m'a demandé
J'ai l'ordre d'allumer
C'est pas cela qu'on m'a demandé

Re: RE: Re: travailler une variable chaine ?

Publié : 13 déc. 2017, 10:50
par alexbi
Chrominator a écrit :Je peux te proposer de mettre tout ça dans un tableau.
Ensuite tu peux passer en revue le tableau dans une boucle.

Exemple :

Code : Tout sélectionner

local commande = {"active", "allumer", "power_on"}
s = 'je veux allumer la lumière'

for i in pairs(commande) do
	if string.find(s, commande[i])then   -- On compare l'ordre avec l'un des postes du tableau
		print("J'ai l'ordre d'allumer")
	else
		print("C'est pas cela qu'on m'a demandé")
	end
end
Ce qui affiche :

C'est pas cela qu'on m'a demandé
J'ai l'ordre d'allumer
C'est pas cela qu'on m'a demandé
ouaaa ça c'est une réponse qui va bien m'aider merci à toi. Je vais essayer de mieux comprendre le système de pairs car je vois qu'on l'utilise partout.

sinon tu ne sais pas si on peux couper une chaîne en deux ? en repérant un mot comme "et" par exemple pour pouvoir analyser les deux partie d'une phrase comme par exemple si je dis 'allume la lumière du salon 'et' éteins la lumière de la salle de bains'. Cela me donnerait deux chaîne 'allume la lumière' et une autre 'éteins la lumière de la salle de bain', que je pourrais ensuite analyser séparément avec la méthode de ton premier poste.

merci à toi pour ton aide


Envoyé de mon HUAWEI VNS-L31 en utilisant Tapatalk

Re: travailler une variable chaine ?

Publié : 14 déc. 2017, 00:50
par alexbi
bon
je crois que j'ai trouvé une réponse a ma question : comment couper une chaîne avec un mot repère, ici "et".

Code : Tout sélectionner

commandArray = {}

s = 'allume la lumière et fait moi un café'

nbLettre = #s          -- trouve nombre de caractères dans la phrase = 39
print(nbLettre)

local i, j = string.find( s, "%set%s" )  -- repère la position de "et" dans la phrase = de 19 à 22
print(i, j)


print(string.sub (s, 1, i-1))  -- donne la première partie de la phrase donc avant le "et" = allume la lumière

print(string.sub (s, j+1, nbLettre))  -- donne la deuxième partie de la phrase donc après le "et" = fait moi un café

return commandArray

Re: travailler une variable chaine ?

Publié : 14 déc. 2017, 02:18
par Chrominator
Nickel ! :)