2012-07-02 11 views
13

Ich habe eine Zeichenfolge "Hello I am going to I with hello am". Ich möchte herausfinden, wie oft ein Wort in der Zeichenfolge vorkommt. Beispiel hallo kommt 2 mal vor. Ich versuchte diesen Ansatz, der nur Zeichen druckt -Wie finde ich die Anzahl eines Wortes in einer Zeichenfolge?

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") 

Ich möchte lernen, wie man die Wortzahl findet.

+1

'Hello' und' hello' sind gleich? –

+1

Abhängig von Ihrem Anwendungsfall gibt es noch eine weitere Sache, die Sie beachten sollten: Manche Wörter haben ihre Bedeutungen, je nach ihrer Großschreibung, wie "Polnisch" und "Polnisch". Wahrscheinlich ist das für Sie nicht wichtig, aber es lohnt sich, daran zu erinnern. – DSM

+0

Könnten Sie Ihren Datensatz für uns genauer definieren, werden Sie sich über Interpunktionen wie "Ich", "Nicht" usw. Sorgen machen. Einige davon sind in den Kommentaren unten aufgeführt. Und Unterschiede im Fall? – Levon

Antwort

31

Wenn Sie die Zählung eines einzelnen Wortes zu finden, verwenden Sie nur count:

input_string.count("Hello") 

Verwenden collections.Counter und split() Tally alle Wörter:

from collections import Counter 

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

Ist das Modul Sammlungen Teil der grundlegenden Python-Installation? – Varun

+0

@ Varun ja ist es. –

+1

Ich kopiere einen Teil eines Kommentars von @DSM links für mich, da ich auch 'str.count()' als meine anfängliche Lösung verwendet habe - das hat ein Problem seit '" am ham ".count (" am ")' wird Ausbeute 2 statt 1 – Levon

3
from collections import * 
import re 

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

re.findall Verwendung ist vielseitiger als split, denn sonst können Sie nicht berücksichtigt Kontraktionen nehmen wie „nicht“ und „Ich werde“, usw.

Demo (Ihrem Beispiel verwenden):

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

Wenn Sie erwarten, dass viele dieser Abfragen machen zu werden, wird dies nur tun O (N) arbeiten einmal, anstatt O (N * # Abfragen) Arbeit.

+2

+1 für re. Split-Lösungen funktionieren nicht mit Phrasen, die Interpunktionen enthalten. – georg

6

Counter from collections ist dein Freund:

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

Hier ist ein al ternativ, Groß-/Kleinschreibung wird nicht beachtet, Ansatz

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

Es passt, indem die Zeichenfolge und das Ziel in Kleinbuchstaben konvertiert werden.

ps: Kümmert sich um die "am ham".count("am") == 2 Problem mit str.count() von @DSM unten zu spitz aus :)

+2

Die Verwendung von count selbst kann jedoch zu unerwarteten Ergebnissen führen: '" am ham ".count (" am ") == 2'. – DSM

+0

@DSM .. guter Punkt .. Ich bin sowieso nicht glücklich mit dieser Lösung, da es Groß-und Kleinschreibung ist, schaue jetzt eine Alternative ... – Levon

2

Unter Berücksichtigung Hello und hello als dieselben Worte, und zwar unabhängig von ihrer Fälle:

>>> 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

Ich würde mit 'Counter (strs.lower(). Split()) gehen '. Reduziert einige der Overhead für eine schnellere Laufzeit – inspectorG4dget

+0

@ InspectorG4dget Dank :), ah! Ich habe 'lower() ' –

+1

vergessen. Ist das nicht jetzt nur die Lösung von Martijn Pieters? – DSM

2

Der Vektor Vorkommenszählungen von Wörtern werden bag-of-words genannt.

Scikit-lernen bietet ein schönes Modul, um es zu berechnen, sklearn.feature_extraction.text.CountVectorizer. Beispiel:

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 

Ausgang:

2 am 
1 going 
2 hello 
1 to 
1 with 

Teil des Codes aus dieser Kaggle tutorial on bag-of-words genommen wurde.

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

0

können Sie die Regex Python-Bibliothek re alle Spiele in der Teilkette zu finden und das Array zurück.

import re 

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

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

Drucke:

2 
Verwandte Themen