Exemple #1
0
        // Renvoie le temps auquel est conjugué le verbe composé en fonction du temps de l'auxiliaire.
        public static string TimeOfVerbeCompose(ConjugatedVerb auxiliaire)
        {
            if (auxiliaire.Mode == "indicatif" && auxiliaire.Time == "présent")
            {
                return("passé composé");
            }
            else
            {
                switch (auxiliaire.Time)
                {
                case "présent":
                    return("passé");

                case "imparfait":
                    return("plus-que-parfait");

                case "passé simple":
                    return("passé antérieur");

                case "futur simple":
                    return("futur antérieur");

                default:
                    return(auxiliaire.Time);
                }
            }
        }
Exemple #2
0
        // METHODES DE CLASSE

        // Transforme le verbe conjugué en un pluriel.
        public static void SingularToPlurial(ref ConjugatedVerb verbe)
        {
            Verb v = verbe;

            if (verbe.Nature == "verbe conjugué")
            {
                switch (verbe.Person)
                {
                case "1":
                    Conjugate(ref v, "4", verbe.Time, verbe.Mode);
                    break;

                case "2":
                    Conjugate(ref v, "5", verbe.Time, verbe.Mode);
                    break;

                case "3":
                    Conjugate(ref v, "6", verbe.Time, verbe.Mode);
                    break;
                }
                // Si le verbe est déjà au pluriel, on ne fait rien.
            }
            // Si le verbe est un infinitif, on ne fait rien.
        }
Exemple #3
0
        // Transforme le verbe conjugué en un singulier.
        public static void PlurialToSingular(ref ConjugatedVerb verbe)
        {
            Verb v = verbe;

            if (verbe.Nature == "verbe conjugué")
            {
                switch (verbe.Person)
                {
                case "4":
                    Conjugate(ref v, "1", verbe.Time, verbe.Mode);
                    break;

                case "5":
                    Conjugate(ref v, "2", verbe.Time, verbe.Mode);
                    break;

                case "6":
                    Conjugate(ref v, "3", verbe.Time, verbe.Mode);
                    break;
                }
                // Si le verbe est déjà au singulier, on ne fait rien.
            }
            // Si le verbe est un infinitif, on ne fait rien.
        }
Exemple #4
0
 public static bool IsAStateVerb(ConjugatedVerb verbe)
 {
     return(new string[] { "être", "devenir", "paraître", "sembler", "demeurer", "rester" }.Contains(verbe.Action));
 }
Exemple #5
0
        // Détermine la nature de chaque mot d'une phrase entrée en paramètre, en déterminant
        // dans un premier temps toutes les natures possibles pour ce mot, puis la nature
        // la plus probable en fonction du nbrUtilisation de chaque nature pour ce mot
        // et du contexte dans lequel est le mot.
        public static List <Word> DeterminerLesNatures(List <List <object[]> > laPhrase)
        {
            int    i;
            string motCourant;
            int    tailleMotCourant;
            bool   precDeterOuPronom = false;


            //  =======================================================================================================
            //  ETAPE 1
            // ========================================================================================================
            // On cherche à attribuer une nature unique à chaque mot de la phrase. Pour cela, on parcourt les mots de la
            // phrase. On note dans un premier temps toutes les natures possibles pour chaque mot. Puis, on trie les natures
            // possibles en fonction du nombre d'utilisation de ce mot pour cette nature, et on ne conserve que la nature
            // ayant le nombre d'utilisation le plus élevé.

            #region Etape1 : Recherche de toutes les natures possibles
            for (i = 0; i < laPhrase.Count; i++) // on parcourt chaque mot de la phrase
            {
                // On traite le cas du mot du qui peut être un déterminant partitif (ex : du beurre),
                // ou une contraction d'une préposition et d'un déterminant (de le → du).
                #region Cas de "du" → "de le"
                if (laPhrase[i][0][0] as string == "du" && i < laPhrase.Count - 1)
                {
                    laPhrase.RemoveAt(i);
                    laPhrase.Insert(i, new List <object[]> {
                        new object[] { "de", 0 }
                    });
                    laPhrase.Insert(i + 1, new List <object[]> {
                        new object[] { "le", 0 }
                    });
                }
                #endregion

                #region Les cas où le mot courant est connu dans la base de données
                // On parcourt la liste de chaque natures grammaticales suivantes.
                // Si le mot courant est contenu dans une de ces listes, alors on a trouvé sa nature.
                motCourant       = (string)laPhrase[i][0][0];
                tailleMotCourant = motCourant.Length;

                // PREPOSITIONS
                rechercheDansTable("Prepositions", i, motCourant, laPhrase, false);

                if (tailleMotCourant > 1)   // car un mot d'une seule lettre ne peut pas être des natures suivantes
                {
                    // CONJONCTIONS DE COORDINATION
                    rechercheDansTable("ConjDeCoords", i, motCourant, laPhrase, false);

                    // CONJONCTIONS DE SUBORDINATION
                    rechercheDansTable("ConjDeSubs", i, motCourant, laPhrase, false);

                    // DETERMINANTS
                    // On on a trouvé que le mot courant pouvait être un déterminant, mais que le mot précédent est un nom
                    // ou un adjectif avec un nombre d'utilisation faible, on supprime de la liste le fait que le mot
                    // courant puissent être un déterminant, car en général il n'y a pas de déterminant après un nom ou
                    // après un adjectif.
                    if (rechercheDansTable("Determinants", i, motCourant, laPhrase, false) &&
                        i > 0 && laPhrase[i - 1].Count > 0 && new string[] { "Noms", "Adjectifs" }.Contains(laPhrase[i - 1][1][0]) &&
                        (int)laPhrase[i - 1][1][1] < 5)
                    {
                        laPhrase[i].RemoveAt(laPhrase[i].Count - 1);
                    }

                    // PRONOMS
                    rechercheDansTable("Pronoms", i, motCourant, laPhrase, false);

                    // VERBES INFINITIFS
                    rechercheDansTable("VerbesInfinitifs", i, motCourant, laPhrase, false);

                    // ADVERBES CONNUS
                    rechercheDansTable("Adverbes", i, motCourant, laPhrase, false);
                }

                // VERBES CONJUGUÉS et NOMS et ADJECTIFS
                if (laPhrase[i].Count == 1) // car si le mot est déjà d'une autre nature, il ne peut pas être un verbe, un nom ou un adjectif
                {
                    // Verbe
                    rechercheDansTable("VerbesConjugues", i, motCourant, laPhrase, precDeterOuPronom);

                    // Nom
                    // Si on a trouvé que le mot courant est un nom, mais que le mot précédent est également
                    // spécifié comme pouvant être un nom avec un faible nombre d'utilisation,
                    // alors on supprime l'option "Noms" pour le mot précédent et on lui met l'option
                    // "Adjectifs" à la place.
                    if (rechercheDansTable("Noms", i, motCourant, laPhrase, precDeterOuPronom) &&
                        i > 0 && laPhrase[i - 1].Count > 0 && laPhrase[i - 1][1][0] as string == "Noms" &&
                        (int)laPhrase[i - 1][1][1] < 5)
                    {
                        laPhrase[i - 1].RemoveAt(laPhrase[i].Count - 1);
                        laPhrase[i - 1].Add(new object[] { "Adjectifs", "2" });
                    }

                    // Adjectif
                    rechercheDansTable("Adjectifs", i, motCourant, laPhrase, precDeterOuPronom);
                }
                #endregion

                // Les mots comme "le", "la", "les", "leur" (etc) peuvent à la fois être des déterminants ou des pronoms.
                // Ils sont des déterminants s'ils sont devant un nom (il peut y avoir un adjectif entre le déterminant et le nom),
                // et sont des pronoms s'ils sont devant un verbe.
                #region Traitement des hésitations entre déterminant et pronom
                if (new string[] { "le", "la", "les", "leur" }.Contains(laPhrase[i][0][0]))
                {
                    // S'il y a encore un mot après...
                    if (laPhrase.Count > i + 1)
                    {
                        // On passe le booléen à true pour effectuer des tests au prochain tour.
                        precDeterOuPronom = true;
                    }
                    // Sinon, s'il n'y a plus de mot après...
                    else
                    {
                        // Le mot est certainement un pronom.
                        laPhrase[i].Add(new object[] { "Pronoms", 3 });
                    }
                }
                else
                {
                    precDeterOuPronom = false;
                }
                #endregion

                // Le mot "que" peut à la fois être une conjonction de coordination ou un pronom relatif
                // selon s'il suit un verbe ou un nom.
                // On traite cette hésitation.
                #region Traitement des hésitations entre conjDeSub et pronom relatif pour "que"
                if (laPhrase[i][0][0] as string == "que" && i > 0)
                {
                    string nature = "";
                    for (int indice = i - 1; i >= 0; indice--)
                    {
                        if (laPhrase[indice].Count > 1 && laPhrase[indice][1][0] as string == "Noms")
                        {
                            nature = "Pronoms";
                            break;
                        }
                        else if (laPhrase[indice].Count > 1 && laPhrase[indice][1][0] as string == "VerbesConjugues")
                        {
                            nature = "ConjDeCoords";
                            break;
                        }
                    }

                    // On vide la liste des natures possibles pour le "que" et on y met
                    // qu'une seule nature en fonction des résultats précédents.
                    if (nature != "")
                    {
                        object[] mot = laPhrase[i][0];
                        laPhrase[i].Clear();
                        laPhrase[i].Add(mot);
                        laPhrase[i].Add(new object[] { nature, 3 });
                    }
                }
                #endregion

                // Si on a rien trouvé, et que le mot courant n'a toujours pas de nature attribuée
                #region Les cas où le mot courant n'est pas connu dans la base de données
                if (laPhrase[i].Count == 1 && i > 0)    // on teste i > 0 pour éviter les IndexOutOfRangeException avec laPhrase[i - 1]
                {
                    // Verbe infinitif
                    // Si le mot courant termine par "er" ou "ir", il a de grandes chances d'être un verbe à l'infinitif.
                    if (motCourant.EndsWith("er") || motCourant.EndsWith("ir"))
                    {
                        laPhrase[i].Add(new object[] { "VerbesInfinitifs", 3 });
                    }

                    // Verbe conjugué
                    // Si le mot précédent est un pronom ou un nom, alors le mot courant peut être un verbe
                    if (laPhrase[i - 1].Count > 1 && new string[] { "Pronoms", "Noms" }.Contains(laPhrase[i - 1][1][0] as string))
                    {
                        laPhrase[i].Add(new object[] { "VerbesConjugues", 2 });
                    }

                    // Nom
                    // Si le mot précédent est un déterminant, alors le mot courant peut être un nom
                    //var testMotPrecedent = (from item in laPhrase[i - 1] where (string)item[0] == "Determinants" select item);
                    if (laPhrase[i - 1].Exists(item => (string)item[0] == "Determinants"))
                    {
                        laPhrase[i].Add(new object[] { "Noms", 2 });
                    }

                    // Adjectif
                    // Si le mot précédent est un nom
                    // OU si le mot précédent est une des conjugaisons du verbe être
                    // ALORS le mot courant peut être un adjectif.

                    int j, compteur;
                    for (j = i - 1, compteur = 0; j >= 0; j--)
                    {
                        if (laPhrase[j].Exists(a => a[0] as string == "Adverbes"))
                        {
                            ++compteur;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (laPhrase[i - 1 - compteur].Exists(item => (string)item[0] == "Noms") ||
                        (RecupBDD.lesData.Tables["VerbesConjugues"].AsEnumerable()
                         .Where(x => x["Infinitif"] as string == "être").AsEnumerable()
                         .Any(c => c["Verbe"].ToString() == laPhrase[i - 1 - compteur][0][0].ToString())))
                    {
                        laPhrase[i].Add(new object[] { "Adjectifs", 2 });
                    }

                    // Participe présent
                    // Si le mot courant termine par "-ant", alors il peut être un participe présent.
                    if (motCourant.Length > 3 && motCourant.EndsWith("ant"))
                    {
                        laPhrase[i].Add(new object[] { "VerbesConjugues", 1 });
                    }

                    // Participe passé
                    // Si le mot courant termine par "-é", "-i" ou "u", alors il peut être un participe passé.
                    if (motCourant.Length > 1 && (motCourant.EndsWith("é") || motCourant.EndsWith("i") || motCourant.EndsWith("u")))
                    {
                        laPhrase[i].Add(new object[] { "VerbesConjugues", 1 });
                    }

                    else if (motCourant.Length > 2 && (motCourant.EndsWith("és") || motCourant.EndsWith("ée") ||
                                                       motCourant.EndsWith("is") || motCourant.EndsWith("ie") ||
                                                       motCourant.EndsWith("us") || motCourant.EndsWith("ue")))
                    {
                        if (rechercheDansTable("VerbesConjugues", i, motCourant.Substring(0, motCourant.Length - 1), laPhrase, false))
                        {
                            laPhrase[i].Add(new object[] { "VerbesConjugues", 5 });
                        }
                        else
                        {
                            laPhrase[i].Add(new object[] { "VerbesConjugues", 1 });
                        }
                    }

                    else if (motCourant.Length > 3 && (motCourant.EndsWith("ées") || motCourant.EndsWith("ies") || motCourant.EndsWith("ues")))
                    {
                        if (rechercheDansTable("VerbesInfinitifs", i, motCourant.Substring(0, motCourant.Length - 2), laPhrase, false))
                        {
                            laPhrase[i].Add(new object[] { "VerbesConjugues", 5 });
                        }
                        else
                        {
                            laPhrase[i].Add(new object[] { "VerbesConjugues", 1 });
                        }
                    }


                    // ADVERBES INCONNUS EN -ment
                    // Comme la table Adverbes ne contient pas tous les adverbes existants
                    // (car il en existe beaucoup trop), on repere aussi les adverbes par leur
                    // terminaison en -ment

                    if (motCourant.Length > 4 && motCourant.EndsWith("ment"))
                    {
                        laPhrase[i].Add(new object[] { "Adverbes", 5 });
                    }
                }
                #endregion


                // Une fois que l'on a trouvé toutes les natures possibles pour le mot courant,
                // on les trie de la nature la plus probable à la nature la moins probable,
                // cela en utilisant le nbrUtilisation associé à chacune des natures
                // pour le mot en question.

                // On trie les natures du mot courant ( laPhrase[i] ) de la plus probable à la moins probable
                for (int a = 2; a < laPhrase[i].Count; a++)
                {
                    if ((int)laPhrase[i][a][1] <= (int)laPhrase[i][a - 1][1])
                    {
                        laPhrase[i].RemoveAt(a);
                    }
                    else
                    {
                        laPhrase[i].RemoveAt(a - 1);
                    }
                }
            }

            #endregion

            //  =======================================================================================================
            //  ETAPE 2
            // ========================================================================================================
            // Maintenant qu'on a attribué une unique nature à chaque mot, on cherche à déterminer le genre et le nombre
            // des mots variables et la personne (+ nombre) et le temps des verbes. On stocke ces informations en transformant
            // chaque string contenant un mot de la phrase en type correspondant à sa nature (structure)
            #region Etape2 : Attribution d'une nature unique à chaque mot, selon la plus probable

            List <Word> phrase = new List <Word>();

            for (i = 0; i < laPhrase.Count; i++) // Pour chaque mot de la phrase...
            {
                // Afin que le programme ne crash pas si le mot testé n'a pas de nature attribuée
                // (et donc que la case laPhrase[i][1] n'existe pas, ce qui entraîne une exception).
                if (laPhrase[i].Count > 1)
                {
                    switch (laPhrase[i][1][0] as string)   // laPhrase[i][1][0] → correspond à la nature
                    {
                    case "Noms":
                        phrase.Add(new Name((string)laPhrase[i][0][0]));
                        break;

                    case "Adjectifs":
                        phrase.Add(new Adjective((string)laPhrase[i][0][0]));
                        break;

                    case "VerbesConjugues":
                        // On traite les verbes conjugués à des temps composés
                        if (phrase.Count > 0 && phrase.Last().Nature == "verbe conjugué")
                        {
                            ConjugatedVerb auxiliaire = (ConjugatedVerb)phrase.Last();

                            if (new string[] { "être", "avoir" }.Contains(auxiliaire.Action))
                            {
                                phrase.RemoveAt(phrase.Count - 1);
                                ConjugatedVerb participe = new ConjugatedVerb((string)laPhrase[i][0][0]);

                                phrase.Add(new ConjugatedVerb(auxiliaire.ToString() + " " + participe.ToString(), auxiliaire.Person, participe.Group,
                                                              ConjugatedVerb.TimeOfVerbeCompose(auxiliaire), auxiliaire.Mode, participe.Action, participe.AuxAvoir, participe.AuxEtre,
                                                              participe.NonPronominale, auxiliaire.Pronominale, auxiliaire.Transitif, auxiliaire.Intransitif));
                                break;
                            }
                        }
                        phrase.Add(new ConjugatedVerb((string)laPhrase[i][0][0]));
                        break;

                    case "VerbesInfinitifs":
                        phrase.Add(new InfinitiveVerb((string)laPhrase[i][0][0]));
                        break;

                    case "Determinants":
                        phrase.Add(new Determiner((string)laPhrase[i][0][0]));
                        break;

                    case "Pronoms":
                        phrase.Add(new Pronoun((string)laPhrase[i][0][0]));
                        break;

                    case "Adverbes":
                        phrase.Add(new Adverbe((string)laPhrase[i][0][0]));
                        break;

                    case "ConjDeCoords":
                        phrase.Add(new ConjDeCoord((string)laPhrase[i][0][0]));
                        break;

                    case "ConjDeSubs":
                        phrase.Add(new ConjDeSub((string)laPhrase[i][0][0]));
                        break;

                    case "Prepositions":
                        phrase.Add(new Preposition((string)laPhrase[i][0][0]));
                        break;

                    default:
                        phrase.Add(new UnknowWord((string)laPhrase[i][0][0]));
                        break;
                    }
                }
                else
                {
                    phrase.Add(new UnknowWord((string)laPhrase[i][0][0]));
                }
            }
            #endregion

            return(phrase);
        }