web-dev-qa-db-fra.com

Comment extraire des phrases courantes / significatives d'une série d'entrées de texte

J'ai une série d'éléments de texte - HTML brut à partir d'une base de données MySQL. Je veux trouver les phrases les plus courantes dans ces entrées (pas la phrase la plus courante et, idéalement, ne pas appliquer la correspondance mot à mot).

Mon exemple est un avis sur Yelp.com, qui montre 3 extraits de centaines d'avis d'un restaurant donné, au format:

"Essayez le hamburger" (dans 44 avis)

par exemple, la section "Examiner les points forts" de cette page:

http://www.Yelp.com/biz/sushi-gen-los-angeles/

J'ai installé NLTK et j'ai un peu joué avec, mais je suis franchement dépassé par les options. Cela semble être un problème assez courant et je n'ai pas été en mesure de trouver une solution simple en recherchant ici.

61
arronsky

Je soupçonne que vous ne voulez pas seulement les phrases les plus courantes, mais plutôt que vous voulez les collocations les plus intéressantes . Sinon, vous pourriez vous retrouver avec une surreprésentation de phrases composées de mots courants et moins de phrases intéressantes et informatives.

Pour ce faire, vous souhaiterez essentiellement extraire des n-grammes de vos données, puis trouver celles qui ont le plus haut informations mutuelles point par point (PMI). Autrement dit, vous voulez trouver les mots qui co-se produisent ensemble beaucoup plus que vous ne vous y attendriez par hasard.

Le NLTK collocations how-to explique comment procéder dans environ 7 lignes de code, par exemple:

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()
trigram_measures = nltk.collocations.TrigramAssocMeasures()

# change this to read in your data
Finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
Finder.apply_freq_filter(3)

# return the 10 n-grams with the highest PMI
Finder.nbest(bigram_measures.pmi, 10)
86
dmcer

Je pense que ce que vous cherchez c'est un gros morceau . J'ai recommandé de lire chapitre 7 du livre NLTK ou peut-être mon propre article sur extraction de morceaux . Les deux supposent une connaissance du balisage de partie de la parole, qui est couvert dans chapitre 5 .

4
Jacob

si vous voulez simplement atteindre plus de 3 ngrammes, vous pouvez essayer ceci. Je suppose que vous avez supprimé toutes les ordures comme le HTML, etc.

import nltk
ngramlist=[]
raw=<yourtextfile here>

x=1
ngramlimit=6
tokens=nltk.Word_tokenize(raw)

while x <= ngramlimit:
  ngramlist.extend(nltk.ngrams(tokens, x))
  x+=1

Probablement pas très Pythonic car je ne fais ça que depuis un mois moi-même, mais cela pourrait être utile!

3
Toby

Eh bien, pour commencer, vous devrez probablement supprimer toutes les balises HTML (recherchez "<[^>] *>" et remplacez-les par ""). Après cela, vous pouvez essayer l'approche naïve de la recherche des sous-chaînes communes les plus longues entre deux éléments de texte, mais je ne pense pas que vous obtiendrez de très bons résultats. Vous pourriez faire mieux en normalisant les mots (en les réduisant à leur forme de base, en supprimant tous les accents, en réglant tout en minuscules ou en majuscules) d'abord et puis analyse . Encore une fois, en fonction de ce que vous souhaitez accomplir, vous pourrez peut-être mieux regrouper les éléments de texte si vous autorisez une certaine flexibilité dans l'ordre des mots, c'est-à-dire que les éléments de texte sont traités comme des sacs de mots normalisés et mesurent la similitude du contenu du sac.

J'ai commenté un sujet similaire (mais pas identique) ici .