Boîte à outils en langage naturel - Transformer des morceaux

Pourquoi transformer Chunks?

Jusqu'à présent, nous avons des morceaux ou des phrases de phrases, mais que sommes-nous censés en faire? L'une des tâches importantes est de les transformer. Mais pourquoi? Il s'agit de faire ce qui suit -

  • correction grammaticale et
  • réorganiser les phrases

Filtrer les mots insignifiants / inutiles

Supposons que si vous voulez juger de la signification d'une phrase, il existe de nombreux mots couramment utilisés tels que «le», «a», qui sont insignifiants ou inutiles. Par exemple, voyez la phrase suivante -

'Le film était bien'.

Ici, les mots les plus significatifs sont «film» et «bon». D'autres mots, «le» et «était» sont tous deux inutiles ou insignifiants. C'est parce que sans eux aussi, nous pouvons obtenir le même sens de la phrase. 'Bon film'.

Dans la recette python suivante, nous allons apprendre à supprimer les mots inutiles / insignifiants et à conserver les mots significatifs à l'aide de balises POS.

Exemple

Tout d'abord, en regardant à travers treebankcorpus pour les mots vides, nous devons décider quelles balises de partie de discours sont significatives et lesquelles ne le sont pas. Voyons le tableau suivant de mots et balises insignifiants -

Mot Marque
une DT
Tout PDT
Un DT
Et CC
Ou CC
Cette WDT
le DT

Dans le tableau ci-dessus, nous pouvons voir autre que CC, toutes les autres balises se terminent par DT, ce qui signifie que nous pouvons filtrer les mots insignifiants en regardant le suffixe de la balise.

Pour cet exemple, nous allons utiliser une fonction nommée filter()qui prend un seul morceau et renvoie un nouveau morceau sans aucun mot étiqueté insignifiant. Cette fonction filtre toutes les balises qui se terminent par DT ou CC.

Exemple

import nltk
def filter(chunk, tag_suffixes=['DT', 'CC']):
   significant = []
   for word, tag in chunk:
      ok = True
      for suffix in tag_suffixes:
         if tag.endswith(suffix):
            ok = False
            break
      if ok:
         significant.append((word, tag))
   return (significant)

Maintenant, utilisons cette fonction filter () dans notre recette Python pour supprimer les mots insignifiants -

from chunk_parse import filter
filter([('the', 'DT'),('good', 'JJ'),('movie', 'NN')])

Production

[('good', 'JJ'), ('movie', 'NN')]

Correction verbale

Plusieurs fois, dans le langage du monde réel, nous voyons des formes verbales incorrectes. Par exemple, "ça va?" n'est pas correcte. La forme verbale n'est pas correcte dans cette phrase. La phrase devrait être «ça va? NLTK nous fournit le moyen de corriger de telles erreurs en créant des mappages de correction verbale. Ces mappages de correction sont utilisés selon qu'il existe un nom au pluriel ou au singulier dans le bloc.

Exemple

Pour implémenter la recette Python, nous devons d'abord définir les mappages de correction des verbes. Créons deux mappages comme suit -

Plural to Singular mappings

plural= {
   ('is', 'VBZ'): ('are', 'VBP'),
   ('was', 'VBD'): ('were', 'VBD')
}

Singular to Plural mappings

singular = {
   ('are', 'VBP'): ('is', 'VBZ'),
   ('were', 'VBD'): ('was', 'VBD')
}

Comme vu ci-dessus, chaque mappage a un verbe étiqueté qui correspond à un autre verbe étiqueté. Les mappages initiaux de notre exemple couvrent les bases des mappagesis to are, was to were, et vice versa.

Ensuite, nous définirons une fonction nommée verbs(), dans lequel vous pouvez passer un chink avec une forme verbale incorrecte et récupérer un morceau corrigé. Pour le faire,verb() fonction utilise une fonction d'assistance nommée index_chunk() qui recherchera dans le bloc la position du premier mot marqué.

Voyons ces fonctions -

def index_chunk(chunk, pred, start = 0, step = 1):
   l = len(chunk)
   end = l if step > 0 else -1
   for i in range(start, end, step):
      if pred(chunk[i]):
         return i
      return None
def tag_startswith(prefix):
   def f(wt):
      return wt[1].startswith(prefix)
   return f

def verbs(chunk):
   vbidx = index_chunk(chunk, tag_startswith('VB'))
   if vbidx is None:
      return chunk
   verb, vbtag = chunk[vbidx]
   nnpred = tag_startswith('NN')
   nnidx = index_chunk(chunk, nnpred, start = vbidx+1)
   if nnidx is None:
      nnidx = index_chunk(chunk, nnpred, start = vbidx-1, step = -1)
   if nnidx is None:
      return chunk
   noun, nntag = chunk[nnidx]
   if nntag.endswith('S'):
      chunk[vbidx] = plural.get((verb, vbtag), (verb, vbtag))
   else:
      chunk[vbidx] = singular.get((verb, vbtag), (verb, vbtag))
   return chunk

Enregistrez ces fonctions dans un fichier Python dans votre répertoire local où Python ou Anaconda est installé et exécutez-le. Je l'ai sauvegardé sousverbcorrect.py.

Maintenant, appelons verbs() fonction sur un point de vente étiqueté is you fine morceau -

from verbcorrect import verbs
verbs([('is', 'VBZ'), ('you', 'PRP$'), ('fine', 'VBG')])

Production

[('are', 'VBP'), ('you', 'PRP$'), ('fine','VBG')]

Éliminer la voix passive des phrases

Une autre tâche utile consiste à éliminer la voix passive des phrases. Cela peut être fait en échangeant les mots autour d'un verbe. Par exemple,‘the tutorial was great’ peut être transformé en ‘the great tutorial’.

Exemple

Pour y parvenir, nous définissons une fonction nommée eliminate_passive()qui échangera le côté droit du bloc avec le côté gauche en utilisant le verbe comme point de pivot. Afin de trouver le verbe sur lequel pivoter, il utilisera également leindex_chunk() fonction définie ci-dessus.

def eliminate_passive(chunk):
   def vbpred(wt):
      word, tag = wt
      return tag != 'VBG' and tag.startswith('VB') and len(tag) > 2
   vbidx = index_chunk(chunk, vbpred)
   if vbidx is None:
      return chunk
   return chunk[vbidx+1:] + chunk[:vbidx]

Maintenant, appelons eliminate_passive() fonction sur un point de vente étiqueté the tutorial was great morceau -

from passiveverb import eliminate_passive
eliminate_passive(
   [
      ('the', 'DT'), ('tutorial', 'NN'), ('was', 'VBD'), ('great', 'JJ')
   ]
)

Production

[('great', 'JJ'), ('the', 'DT'), ('tutorial', 'NN')]

Échange de noms cardinaux

Comme nous le savons, un mot cardinal tel que 5, est étiqueté comme CD dans un morceau. Ces mots cardinaux apparaissent souvent avant ou après un nom, mais à des fins de normalisation, il est utile de toujours les placer avant le nom. Par exemple, la dateJanuary 5 peut être écrit comme 5 January. Comprenons-le avec l'exemple suivant.

Exemple

Pour y parvenir, nous définissons une fonction nommée swapping_cardinals()qui échangera tout cardinal qui se produit immédiatement après un nom avec le nom. Avec cela, le cardinal apparaîtra immédiatement avant le nom. Afin de faire une comparaison d'égalité avec la balise donnée, il utilise une fonction d'assistance que nous avons nomméetag_eql().

def tag_eql(tag):
   def f(wt):
      return wt[1] == tag
   return f

Maintenant, nous pouvons définir swapping_cardinals () -

def swapping_cardinals (chunk):
   cdidx = index_chunk(chunk, tag_eql('CD'))
   if not cdidx or not chunk[cdidx-1][1].startswith('NN'):
      return chunk
   noun, nntag = chunk[cdidx-1]
   chunk[cdidx-1] = chunk[cdidx]
   chunk[cdidx] = noun, nntag
   return chunk

Maintenant, appelons swapping_cardinals() fonction à une date “January 5” -

from Cardinals import swapping_cardinals()
swapping_cardinals([('Janaury', 'NNP'), ('5', 'CD')])

Production

[('10', 'CD'), ('January', 'NNP')]
10 January