Un moyen efficace pour extraire les principaux thèmes d'une phrase, le Tokenizer

La semaine dernière, tout en travaillant sur les nouvelles fonctionnalités de notre produit. Je devais trouver un moyen rapide et efficace pour extraire les principaux sujets / objets à partir d'une phrase. Depuis que je suis en utilisant Python, je pensais d'abord que ça va être une tâche très facile à réaliser avec NLTK. Cependant, quand j'ai essayé ses outils par défaut (POS tagger, Parser ...), je en effet obtenu des résultats assez précis, mais la performance était assez mauvais. Donc, je devais trouver une meilleure façon.







Comme je l'ai fait dans mon post précédent. Je vais commencer par la ligne de fond - vous pouvez trouver ici mon code pour extraire les principaux sujets / phrases nominales d'une phrase donnée. Il fonctionne très bien avec de vraies phrases (d'un blog / article de nouvelles). Il est un peu moins précis par rapport aux outils de NLTK par défaut, mais il fonctionne beaucoup plus vite!

Je l'ai couru sur cette phrase -

« Swayy est un beau nouveau tableau de bord pour découvrir et curating contenu en ligne. »

Et a obtenu ce résultat -

Cette phrase est sur: Swayy, beau nouveau tableau de bord, le contenu en ligne

La première fois que vous exécutez le code, il charge le corpus brun en mémoire, il peut prendre quelques secondes.

Du point de vue linguistique, on dit généralement que les principaux « blocs de construction » d'une phrase sont Noun Phrases (NP) et le verbe Phrases (VP). Les Noun Phrases sont généralement les sujets ou d'objets dans la phrase, ou dans des mots simples - c'est ce que la phrase parle, alors que Verb phrases décrivent une action entre les objets dans la phrase. Prenez cet exemple:







« Facebook a acquis Instagram »
A propos de Qui / Quoi? - Facebook et Instagram> Noun Phrases
Qu'est-il arrivé? - acquise (= acquisition)> syntagme verbal

Maintenant, je crois que certains d'entre vous demandez probablement - « Attendez! Quelle? Pourquoi utilisez-vous pas l'analyse syntaxique? »
Alors, tout d'abord - vous avez raison! La méthode connue pour convertir une phrase en substantifs et des verbes phrases (ou en d'autres termes - un arbre ..) est l'analyse. Cependant, le problème avec des algorithmes d'analyse syntaxique est que leur complexité est tout à fait mauvais. Par exemple algorithme CYK a la complexité de O (n ^ 3 * | G |)!
Le deuxième problème est que plein parsing était un peu d'un surpuissant pour ce que je voulais réaliser.

Donc, dans une phrase - Mon code balises juste la phrase avec mon tagger, puis recherche des modèles NP dans la phrase.

Ici, je vais vous donner un aperçu rapide de mon code:

bigram_tagger - J'utilise les classes NLTK de taggers pour définir ma propre tagger. Comme vous pouvez le voir il est construit à partir de 3 différents tagueurs et il est formé avec le corps brun.

cfg - Ceci est mon « Semi-CFG ». Il comprend les règles de base pour correspondre à une expression régulière de Noun.

tokenize_sentence - Diviser la phrase en jetons (mots simples).

normalize_tags - Comme il y a beaucoup de balises dans le corpus brun, je renomme que quelques-uns d'entre eux.

extrait - Ceci est notre principale méthode. Diviser la phrase, étiqueter, et rechercher des modèles.

Lignes 96-97 - La différence entre ces lignes, est que la ligne 97 accepte également les noms simples. Le sens de cette condition est que vous aurez plus de résultats par phrase - mais certains des résultats seront faux positifs! Vous pouvez surmonter / ignorer les résultats faussement positifs en utilisant des fréquences de mots ou en définissant un certain dictionnaire spécial en fonction de vos besoins.

La ligne de fond

Comme je l'ai déjà dit, la meilleure façon d'extraire des phrases Nom / verbe d'une phrase en utilisant l'analyse syntaxique. Toutefois, si vous avez besoin de le faire rapidement et que vous voulez être en mesure de traiter de nombreuses phrases / documents complets dans un temps très court - je vous suggère de prendre une approche comme celle que j'illustré ci-dessus.