2012-07-02 14 views
13

मेरे पास एक स्ट्रिंग है "Hello I am going to I with hello am"। मैं यह खोजना चाहता हूं कि स्ट्रिंग में कितनी बार एक शब्द होता है। उदाहरण हैलो 2 बार होता है। मैंने इस दृष्टिकोण की कोशिश की जो केवल वर्णों को प्रिंट करता है -स्ट्रिंग में किसी शब्द की गिनती कैसे पाएं?

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

मैं सीखना चाहता हूं कि शब्द गणना कैसे प्राप्त करें।

+1

'Hello' और' hello' ही कर रहे हैं? –

+1

आपके उपयोग के मामले के आधार पर, एक और चीज है जिस पर आपको विचार करने की आवश्यकता हो सकती है: कुछ शब्दों का अर्थ उनके पूंजीकरण, जैसे 'पोलिश' और' पॉलिश 'के आधार पर बदलता है। शायद आपके लिए कोई फर्क नहीं पड़ता, लेकिन यह याद रखने लायक है। – DSM

+0

क्या आप हमारे लिए डेटा सेट को परिभाषित कर सकते हैं, क्या आप विराम चिह्न के बारे में चिंता करेंगे जैसे कि 'मैं', 'नहीं' आदि .. इनमें से कुछ नीचे टिप्पणियों में उठाए गए हैं। और मामले में मतभेद? पुनः के लिए – Levon

उत्तर

31

जब आप किसी निजी शब्द की गिनती को खोजने के लिए चाहते हैं, बस count का उपयोग करें:

input_string.count("Hello") 

उपयोग collections.Counter और split() सभी शब्दों का हिसाब करने के:

from collections import Counter 

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

क्या मूल पायथन स्थापना का संग्रह मॉड्यूल हिस्सा है? – Varun

+0

@ वरुण हां यह है। –

+1

मैं @DSM द्वारा एक टिप्पणी का हिस्सा कॉपी कर रहा हूं क्योंकि मैंने अपने शुरुआती समाधान के रूप में 'str.count() 'का भी उपयोग किया है - इसमें" हैम "के बाद से कोई समस्या है। गणना (" am ")' will 1 – Levon

3
from collections import * 
import re 

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

re.findall का उपयोग करना, split की तुलना में अधिक बहुमुखी है क्योंकि अन्यथा आप नहीं खाते संकुचन में जैसे कि "नहीं है", आदि ले जा सकते हैं और "मैं हूँ"

डेमो (अपने उदाहरण का उपयोग करते हुए):

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

तो आप उम्मीद कर इन प्रश्नों के कई लगा रहे हैं, यह केवल हे (एन) एक बार, काम काम करते हो जाएगा बल्कि हे की तुलना में (प्रश्नों एन * #)।

+2

+1। 'विभाजन' समाधान विराम चिह्न वाले वाक्यांशों के साथ काम नहीं करेंगे। – georg

1

यहां एक अल है ternative, केस-संवेदी, दृष्टिकोण

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

यह लोअर केस में स्ट्रिंग और लक्ष्य को परिवर्तित करके मेल खाता है।

पुनश्च: ध्यान "am ham".count("am") == 2 समस्या के साथ str.count() भी :)

+2

अपने आप में उपयोग करना गिनती, हालांकि अप्रत्याशित परिणाम के लिए नेतृत्व कर सकते हैं: '" हूँ हैम ".count (" हूँ ") == 2'। – DSM

+0

@DSM .. अच्छा बिंदु .. मैं वैसे भी इस समाधान के साथ खुश नहीं हूँ, क्योंकि यह मामला संवेदनशील है, एक विकल्प पर अभी देख ... – Levon

2

को ध्यान में रखते Hello और hello एक ही शब्द के रूप में नीचे @DSM से कहा, उनके मामलों पर ध्यान दिए बिना ले जाता है:

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

मैं 'काउंटर के साथ जाना होगा (strs.lower()। विभाजन()) '। एक तेज रनटाइम – inspectorG4dget

+0

@ इंस्पेक्टर G4dget धन्यवाद के लिए कुछ ओवरहेड को कम करता है :), आह! मैं 'कम() ' –

+1

भूल गया था, क्या यह अभी मार्टिजन पीटर का समाधान नहीं है, यद्यपि? – DSM

2

के वेक्टर शब्दों की घटना गणना bag-of-words कहा जाता है।

विज्ञान-सीखने की गणना करने के लिए एक अच्छा मॉड्यूल प्रदान करता है, sklearn.feature_extraction.text.CountVectorizer। उदाहरण:

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 

आउटपुट:

2 am 
1 going 
2 hello 
1 to 
1 with 

कोड का एक हिस्सा इस Kaggle tutorial on bag-of-words से लिया गया है।

FYI करें

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

0

आप अजगर regex पुस्तकालय re उपयोग कर सकते हैं-स्ट्रिंग में सभी मैचों खोजने के लिए और सरणी वापस जाने के लिए।

import re 

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

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

प्रिंटों:

2 
संबंधित मुद्दे