2012-07-02 13 views
13

Ho una stringa "Hello I am going to I with hello am". Voglio trovare quante volte una parola si verifica nella stringa. Esempio ciao si verifica 2 volte. Ho provato questo approccio che stampa solo caratteri -Come trovare il conteggio di una parola in una stringa?

def countWord(input_string): 
    d = {} 
    for word in input_string: 
     try: 
      d[word] += 1 
     except: 
      d[word] = 1 

    for k in d.keys(): 
     print "%s: %d" % (k, d[k]) 
print countWord("Hello I am going to I with Hello am") 

Voglio imparare come trovare il conteggio delle parole.

+1

'' Hello' e hello' sono gli stessi? –

+1

A seconda del caso d'uso, c'è un'altra cosa che potrebbe essere necessario prendere in considerazione: alcune parole hanno i loro significati che cambiano a seconda della loro maiuscola, come "polacco" e "lucido". Probabilmente questo non avrà importanza per te, ma vale la pena ricordare. – DSM

+0

Puoi definire il set di dati in più per noi, ti preoccuperai della punteggiatura come in "I'll',' don't' ecc. Alcuni di questi sollevati nei commenti qui sotto. E le differenze nel caso? – Levon

risposta

31

Se si vuole trovare il conteggio di una singola parola, basta usare count:

input_string.count("Hello") 

Usa collections.Counter e split() coincidere tutte le parole:

from collections import Counter 

words = input_string.split() 
wordCount = Counter(words) 
+0

Il modulo delle collezioni fa parte dell'installazione python di base? – Varun

+0

@Varun si lo è. –

+1

Sto copiando parte di un commento di @DSM lasciato da me poiché ho anche usato 'str.count()' come soluzione iniziale - questo ha un problema poiché '" am ham ".count (" am ")' yield 2 piuttosto che 1 – Levon

3
from collections import * 
import re 

Counter(re.findall(r"[\w']+", text.lower())) 

Utilizzando re.findall è più versatile di split, perché altrimenti non si può prendere in considerazione le contrazioni come "non" e "ci penso io", ecc

Demo (usando il vostro esempio):

>>> countWords("Hello I am going to I with hello am") 
Counter({'i': 2, 'am': 2, 'hello': 2, 'to': 1, 'going': 1, 'with': 1}) 

Se vi aspettate di essere fare molte di queste domande, questo sarà solo do O (N) funzionerà una volta, invece di O (N * # query) di lavoro.

+2

+1 per re. Le soluzioni 'split' non funzioneranno con frasi contenenti punteggiature. – georg

6

Counter from collections è tuo amico:

>>> from collections import Counter 
>>> counts = Counter(sentence.lower().split()) 
1

Ecco un al approccio, senza distinzione tra maiuscole e minuscole,

sum(1 for w in s.lower().split() if w == 'Hello'.lower()) 
2 

Corrisponde convertendo stringa e destinazione in minuscolo.

ps: prende cura del problema "am ham".count("am") == 2 con str.count() indicate da @DSM seguito troppo :)

+2

L'utilizzo del conteggio può portare a risultati imprevisti, tuttavia: '" am ham ".count (" am ") == 2'. – DSM

+0

@DSM .. buon punto .. Non sono felice con questa soluzione in ogni caso dal momento che è case sensitive, guardando un'alternativa in questo momento ... – Levon

2

Considerando Hello e hello come stesse parole, indipendentemente dalla loro casi:

>>> from collections import Counter 
>>> strs="Hello I am going to I with hello am" 
>>> Counter(map(str.lower,strs.split())) 
Counter({'i': 2, 'am': 2, 'hello': 2, 'to': 1, 'going': 1, 'with': 1}) 
+0

Vorrei andare con 'Counter (strs.lower(). Split()) '. Riduce parte del sovraccarico per un runtime più veloce – inspectorG4dget

+0

@ inspectorG4dget grazie :), ah! Ho dimenticato 'lower()' –

+1

Non è questa la soluzione di Martijn Pieters adesso? – DSM

2

Il vettore di il conteggio delle occorrenze delle parole è chiamato bag-of-words.

Scikit-learn fornisce un buon modulo per calcolarlo, sklearn.feature_extraction.text.CountVectorizer. Esempio:

import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 

vectorizer = CountVectorizer(analyzer = "word", \ 
          tokenizer = None, \ 
          preprocessor = None, \ 
          stop_words = None, \ 
          min_df = 0,   \ 
          max_features = 50) 

text = ["Hello I am going to I with hello am"] 

# Count 
train_data_features = vectorizer.fit_transform(text) 
vocab = vectorizer.get_feature_names() 

# Sum up the counts of each vocabulary word 
dist = np.sum(train_data_features.toarray(), axis=0) 

# For each, print the vocabulary word and the number of times it 
# appears in the training set 
for tag, count in zip(vocab, dist): 
    print count, tag 

uscita:

2 am 
1 going 
2 hello 
1 to 
1 with 

Parte del codice è stato preso da questo Kaggle tutorial on bag-of-words.

FYI: How to use sklearn's CountVectorizerand() to get ngrams that include any punctuation as separate tokens?

0

È possibile utilizzare la libreria regex di Python re per trovare tutte le partite della stringa e restituire l'array.

import re 

input_string = "Hello I am going to I with Hello am" 

print(len(re.findall('hello', input_string.lower()))) 

Stampe:

2 
Problemi correlati