2 votes

nltk.org exemple de segmentation de phrases avec Naive Bayes Classifier : comment .sent sépare-t-il les phrases et comment l'algorithme ML l'améliore-t-il ?

Il y a un exemple dans nltk.org livre (chapitre 6) où ils utilisent un algorithme NaiveBayesian pour classer un symbole de ponctuation comme finissant une phrase ou ne la finissant pas...

C'est ce qu'ils font : Tout d'abord, ils prennent un corpus et utilisent la méthode .sent pour obtenir les phrases et construire à partir de celles-ci un index de l'endroit où se trouvent les symboles de ponctuation qui les séparent (les boundaries ) sont.

Ensuite, ils "tokenisent" le texte (le convertissent en liste de mots et de symboles de ponctuation) et appliquent l'algorithme/fonction suivant à chaque token afin d'obtenir une liste de caractéristiques qui sont retournés dans un dictionnaire :

def punct_features(tokens, i):
    return {'nextWordCapitalized': tokens[i+1][0].isupper(),
        'prevWord': tokens[i-1].lower(),
        'punct': tokens[i],
        'prevWordis1Char': len(tokens[i-1]) == 1}

Ces caractéristiques seront utilisées par l'algorithme ML pour classer le symbole de ponctuation comme terminant ou non une phrase (c'est-à-dire comme un token de frontière).

Avec ce fn et l'index 'boundaries', ils sélectionnent tous les tokens de ponctuation, chacun avec ses caractéristiques, et les étiquettent en tant que True la frontière, ou False un, créant ainsi une liste de ensembles de caractéristiques étiquetées :

featuresets1 = [(punct_features(tokens, i), (i in boundaries)) for i in range(1, len(tokens)-1)
               if tokens[i] in '.?!;']
print(featuresets1[:4])

C'est un exemple de la surcharge que nous pourrions avoir en imprimant les quatre premières séries :

[({'nextWordCapitalized': False, 'prevWord': 'nov', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': '29', 'punct': '.', 'prevWordis1Char': False}, True), 
({'nextWordCapitalized': True, 'prevWord': 'mr', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': 'n', 'punct': '.', 'prevWordis1Char': True}, False)]

Avec cela, ils entraînent et évaluent le classificateur de ponctuation :

size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.NaiveBayesClassifier.train(train_set)

nltk.classify.accuracy(classifier, test_set)

Maintenant, (1) comment et que pourrait améliorer un tel algorithme ML ? Je n'arrive pas à comprendre comment il pourrait améliorer le premier algorithme simple qui vérifie simplement si le jeton suivant du symbole de ponctuation est en majuscule et le précédent en minuscule. En effet, cet algorithme est pris pour valider qu'un symbole est une limite... ! Et s'il ne l'améliore pas, à quoi pourrait-il bien servir ?

Et en relation avec cela : (2) est-ce que l'un de ces deux algorithmes est la façon dont nlpk sépare réellement les phrases ? Je veux dire, surtout si le meilleur est le premier algorithme simple, est-ce que nltk comprend que les phrases sont juste un texte entre deux symboles de ponctuation qui sont suivis par un mot avec le premier graphique en majuscule et le mot précédent en minuscule ? Est-ce ce que fait la méthode .sent ? Remarquez que c'est loin de la façon dont la linguistique, ou mieux, le dictionnaire Oxford, définit une phrase :

"Un ensemble de mots qui est complet en lui-même, contenant typiquement un sujet et un prédicat, véhiculant une déclaration, une question, une exclamation ou un ordre, d'exclamation ou de commandement, et composé d'une clause principale et parfois d'une ou plusieurs clauses subordonnées".

Ou (3) les textes bruts du corpus comme treebank ou brown déjà divisé par des phrases manuellement ? - dans ce cas, quel est le critère pour les sélectionner ?

3voto

Sowmya Points 101

Question (1) : NLTK n'a peut-être pas été clair, mais la segmentation de phrases est un problème difficile. Comme vous l'avez dit, nous pouvons commencer en supposant qu'un marqueur de ponctuation termine la phrase, c'est-à-dire que le caractère précédent est une minuscule, le caractère actuel est une ponctuation, le caractère suivant est une majuscule (il y a des espaces entre les deux, ne l'oubliez pas). Cependant, considérez cette phrase :

" M. Peter travaille dans une entreprise appelée A.B.C. Inc. à Toronto. Son salaire net mensuel est de 2 344,21 $. Il y a 22 ans, il est arrivé à Toronto en tant qu'immigrant." - Maintenant, en suivant notre règle ci-dessus, comment cette somme sera-t-elle divisée ?

En Page Wikipedia sur la désambiguïsation des limites de phrases illustre quelques autres de ces questions. Dans le manuel de PNL "Speech and Language Processing" de Jurafsky et Martin, il y a également une section sur le traitement de la parole. chapitre sur la normalisation des textes Vous trouverez ici quelques exemples supplémentaires de la difficulté que représente la segmentation des mots et des phrases. Je suppose que nous discutons de la segmentation en anglais, mais il est clair qu'il existe d'autres problèmes avec d'autres langues (par exemple, l'absence de majuscules dans certaines langues).

Q 2 : est-ce que l'un de ces deux algorithmes permet à nlpk de séparer réellement les phrases ? NLTK utilise une méthode de segmentation de phrases non supervisée appelée PunktSentenceTokenizer

Q3 : les corpus bruts sont-ils des textes comme des banques d'arbres ou des bruns déjà divisés par des phrases manuellement ? - Oui, ils ont été divisés manuellement en phrases. Il s'agit de certains corpus courants utilisés en TAL pour le développement d'outils linguistiques tels que les marqueurs POS, les analyseurs syntaxiques, etc. Une des raisons de ce choix pourrait être qu'ils sont déjà disponibles dans NLTK, et que nous n'avons pas besoin de chercher un autre corpus annoté par des humains pour faire un apprentissage supervisé de la détection des limites de phrases.

2voto

alexis Points 10856

Une chose que la réponse acceptée (par ailleurs excellente) ne mentionne pas, c'est une explication de ce qu'est la NaiveBayes L'algorithme fait plus qu'appliquer la règle que vous avez décrite.

Tout classificateur de ce type reçoit plusieurs caractéristiques et doit décider de leur importance en tant qu'indices pour la classification. Lettre capitale suivante \= très important, lettre précédente minuscule \= important mais moins, espace après cette ponctuation \= important, etc. Les algorithmes d'apprentissage automatique utilisent un peu de pour attribuer des poids (= importance) à chaque caractéristique, afin que les résultats soient aussi bons que l'algorithme peut le fournir. Certains peuvent le faire en une seule étape, d'autres le font par petites étapes où chaque itération améliore un peu le résultat précédent ("hill climbing").

Les détails sont différents pour chaque algorithme d'apprentissage automatique, et les spécificités de Naive Bayes ne sont pas importantes ici. Mais pour être complet : il s'agit d'un calcul statistique basé sur l'hypothèse (généralement contraire à la réalité, mais c'est pratique) que chaque caractéristique est statistiquement indépendante de toutes les autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X