Question

Sans obtenir un diplôme en recherche d’informations, j'aimerais savoir s’il existe un algorithme permettant de compter la fréquence à laquelle des mots apparaissent dans un corps de texte donné. L’objectif est d’obtenir une "sensation générale". de ce que les gens disent sur un ensemble de commentaires textuels. Dans la lignée de Wordle .

Ce que je voudrais:

  • ignorer les articles, pronoms, etc. ('a', 'une', 'le', 'lui', 'eux' etc.)
  • conservez les noms propres
  • ignorer la césure, sauf pour le type souple

Atteindre les étoiles ne serait que pêche:

  • traitement de stemming & amp; les pluriels (comme, aime, aime, aime correspondent au même résultat)
  • regroupement d'adjectifs (adverbes, etc.) avec leurs sujets ("excellent service" par opposition à "excellent", "service")

J'ai essayé quelques trucs de base en utilisant Wordnet mais je peaufine les choses à l'aveuglette en espérant que cela fonctionne pour mes données spécifiques. Quelque chose de plus générique serait génial.

Était-ce utile?

La solution

Vous n'aurez pas besoin d'un, mais de plusieurs beaux algorithmes, à l'instar de ce qui suit.

  • ignorer les pronoms se fait via une liste de contrôle .
  • conserver les noms propres? Vous voulez dire, détecter des entités nommées, comme Hoover Dam , et dire "c'est un mot" ou des noms composés, comme programmation langage ? Je vais vous donner un indice: c'est difficile, mais il existe des bibliothèques pour les deux. Recherchez NER (reconnaissance des droits nommés) et segmentation lexicale. OpenNLP est une boîte à outils Java qui utilise les deux.
  • ignorer la césure? Tu veux dire, comme au saut de ligne? Utilisez des expressions régulières et vérifiez le mot obtenu via la recherche dans le dictionnaire.
  • traitement des pluriels / dérivés: vous pouvez consulter le arrêteur de Snowball . Il fait bien l'affaire.
  • " grouping " Les adjectifs avec leurs noms sont généralement une tâche de analyse superficielle . Mais si vous recherchez spécifiquement des adjectifs qualitatifs (bons, mauvais, merdes, étonnants ...), vous pouvez être intéressé par analyse des sentiments . LingPipe le fait, et bien plus encore.

Je suis désolé, je sais que vous avez dit que vous vouliez KISS, mais malheureusement, vos demandes ne sont pas si faciles à satisfaire. Néanmoins, il existe des outils pour tout cela, et vous devriez pouvoir les lier ensemble sans avoir à exécuter aucune tâche vous-même, si vous ne le souhaitez pas. Si vous souhaitez effectuer une tâche vous-même, je vous suggère de vous en occuper, c'est la plus facile de toutes.

Si vous utilisez Java, combinez Lucene avec Boîte à outils OpenNLP . Vous obtiendrez de très bons résultats, car Lucene a déjà un stemmer intégré et de nombreux tutoriels. En revanche, la boîte à outils OpenNLP est mal documentée, mais vous n’en aurez pas besoin beaucoup. Vous pouvez également être intéressé par la NLTK , écrite en Python.

Je dirais que vous laissez tomber votre dernière exigence, car elle implique une analyse syntaxique superficielle et n'imposera en aucun cas vos résultats.

Ah, au fait. le terme exact du document-terme-fréquence-chose que vous recherchiez s'appelle tf-idf . C'est à peu près la meilleure façon de rechercher la fréquence des documents pour les termes. Pour le faire correctement, vous n’utiliserez pas de matrices vectorielles multidimensionnelles.

... Oui, je sais. Après avoir suivi un séminaire sur les relations internationales, mon respect pour Google était encore plus grand. Après avoir fait quelques choses dans les relations internationales, mon respect pour eux est tombé tout aussi rapidement, cependant.

Autres conseils

Bienvenue dans le monde de la PNL ^ _ ^

Vous n'avez besoin que de quelques connaissances de base et de quelques outils.

Il existe déjà des outils qui vous indiqueront si un mot dans une phrase est un nom, un adjectif ou un verbe. Ils s'appellent marqueurs de partie du discours . Généralement, ils utilisent l'anglais en texte brut comme entrée et sortent le mot, sa forme de base et la partie du discours. Voici la sortie d'un tagueur de partie de discours UNIX populaire sur la première phrase de votre message:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

Comme vous pouvez le constater, il a identifié les "algorithmes". comme étant la forme plurielle (NNS) de "algorithme" et " existe " en tant que conjugaison (VBZ) de "existent". Il a également identifié " un " et " le " comme "déterminants (DT)" - un autre mot pour l'article. Comme vous pouvez le constater, l’étiqueteur POS a également marqué la ponctuation.

Pour tout faire sauf le dernier point de votre liste, il vous suffit de passer le texte dans un étiqueteur de point de vente, de filtrer les catégories qui ne vous intéressent pas (déterminants, pronoms, etc.) et de compter les fréquences des formes de base des mots.

Voici quelques marqueurs POS populaires:

TreeTagger (binaire uniquement: Linux, Solaris, OS- X)
GENIA Tagger (C ++: compilez vous-même)

étiqueteuse Stanford POS (Java)

Pour faire la dernière chose de votre liste, vous avez besoin de plus que des informations au niveau des mots. Une façon simple de commencer est de compter les séquences de mots plutôt que les mots eux-mêmes. Celles-ci s'appellent n-grammes . Un bon endroit pour commencer est UNIX pour les poètes . Si vous êtes prêt à investir dans un livre sur la PNL, je vous recommanderais Fondements du traitement statistique du langage naturel .

Voici un exemple de la façon dont vous pourriez procéder en Python. Les concepts sont similaires dans toutes les langues.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

La première ligne contient uniquement les bibliothèques qui aident à résoudre certaines parties du problème, comme dans la deuxième ligne, où urllib2 télécharge une copie du "Dictionnaire du diable" d'Ambrose Bierce. Les lignes suivantes font une liste de tous les mots du texte, sans ponctuation. Ensuite, vous créez une table de hachage, qui dans ce cas est comme une liste de mots uniques associés à un nombre. La boucle for parcourt chaque mot du livre de Bierce. S'il existe déjà un enregistrement de ce mot dans la table, chaque nouvelle occurrence ajoute un à la valeur associée à ce mot dans la table. si le mot n'apparaît pas encore, il est ajouté au tableau, avec une valeur de 1 (ce qui signifie une occurrence.) Pour les cas dont vous parlez, vous voudriez accorder beaucoup plus d'attention aux détails, par exemple en utilisant la capitalisation. pour aider à identifier les noms propres uniquement au milieu de phrases, etc., ceci est très grossier mais exprime le concept.

Pour entrer dans le vif du sujet et de la pluralisation, expérimenter, puis examiner le travail de tierces parties, j’ai aimé certaines parties de NLTK, un projet académique open source, également en python.

J'ai écrit un programme complet pour le faire il y a longtemps. Je peux télécharger une démo plus tard quand je rentrerai à la maison.

Voici le code (asp.net/c#): h ttp: //naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

La première partie de votre question ne semble pas si mauvaise. Tout ce que vous avez à faire est de lire chaque mot du fichier (ou du flux w / e) et de le placer dans une arborescence de préfixes. Chaque fois que vous rencontrez un mot déjà existant, vous incrémentez la valeur qui lui est associée. Bien sûr, vous auriez une liste de tout ce que vous aimeriez ignorer dans vos calculs.

Si vous utilisez un arbre de préfixes, vous devez vous assurer que tout mot qui passe va à O (N), N étant la longueur maximale d’un mot dans votre ensemble de données. L'avantage d'un arbre de préfixes dans cette situation est que si vous voulez rechercher des pluriels et des racines, vous pouvez vérifier dans O (M + 1) si c'est même possible pour le mot, où M est la longueur du mot sans tige ni pluralité. (est-ce un mot? hehe). Une fois que vous avez construit votre arbre de préfixes, je le réanalyserais pour les tiges et autres éléments, et le condenser afin que le mot racine soit ce qui retient les résultats.

Lors de la recherche, vous pouvez avoir quelques règles simples en place pour que le résultat du match soit positif en cas de racine, de tige ou autre.

La deuxième partie semble extrêmement difficile. Mon penchant naïf serait d’obtenir des résultats séparés pour les groupements adjectif-sujet. Utilisez les mêmes principes que ci-dessus, mais gardez-les séparés.

Une autre option pour l’analyse sémantique pourrait être de modéliser chaque phrase comme un arbre de relations sujet, verbe, etc. (phrase a un sujet et un verbe, sujet a un nom et un adjectif, etc.). Une fois que vous avez divisé tout votre texte de cette manière, il semble qu'il soit assez facile de parcourir et de compter rapidement les différents appariements appropriés qui ont eu lieu.

Juste quelques divagations, je suis sûr qu'il y a de meilleures idées, mais j'adore penser à ça.

L'algorithme que vous venez de décrire. Un programme qui le sort de la boîte avec un gros bouton disant "Fais-le" ... Je ne sais pas.

Mais laissez-moi être constructif. Je vous recommande ce livre Programmation de l'intelligence collective . Les chapitres 3 et 4 contiennent des exemples très pragmatiques (en réalité, pas de théories complexes, mais des exemples).

Vous pouvez utiliser le dictionnaire worldnet pour obtenir les informations de base du mot clé question, comme son passé de parole, extrait de synonyme, u pouvez également faire de même pour votre document afin de créer l’index correspondant. alors vous pouvez facilement faire correspondre le mot clé avec le fichier index et classer le document. puis le résumer.

Tout ce que vous avez répertorié est bien géré par spacy .

  1. Ignorer des mots - utilisez des mots vides
  2. Extraire le sujet - utilisez une partie du marquage vocal pour l’identifier (fonctionne immédiatement). Après l’analyse d’une phrase, recherchez "ROOT". - le verbe principal de la phrase. En en parcourant l’arbre d’analyse , vous trouverez un nom qui se rapporte à ce verbe. Ce sera le sujet.
  3. Ignorer la césure - leur générateur de jetons gère les traits d'union dans la plupart des cas. Il peut être facilement étendu pour traiter des cas plus spéciaux.

Si la liste des sujets est prédéterminée et qu’elle n’est pas énorme, vous pouvez même aller plus loin: créez un modèle de classification qui prédit le sujet. Disons que vous avez 10 sujets. Vous collectez des exemples de phrases ou de textes. Vous les chargez dans un autre produit: prodige . En utilisant cette interface géniale, vous assignez rapidement des sujets aux échantillons. Enfin, à l'aide des échantillons catégorisés, vous entraînez le modèle spacy à prédire le sujet des textes ou des phrases.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top