Подтвердить что ты не робот

Как найти количество слов в строке?

У меня есть строка "Hello I am going to I with hello am". Я хочу узнать, сколько раз в строке происходит слово. Пример hello происходит 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")

Я хочу узнать, как найти количество слов.

4b9b3361

Ответ 1

Если вы хотите найти счетчик отдельного слова, просто используйте count:

input_string.count("Hello")

Используйте collections.Counter и split() для подсчета всех слов:

from collections import Counter

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

Ответ 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})

Если вы планируете выполнять многие из этих запросов, это будет делать только O (N) один раз, а не O (N * # запросы).

Ответ 4

Учитывая Hello и Hello как те же слова, независимо от их случаев:

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

Ответ 5

Вектор числа совпадений слов называется bag-of-words.

Scikit-learn предоставляет хороший модуль для его вычисления, 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 о мешках слов.

FYI: Как использовать sklearn CountVectorizerand() для получения ngrams, которые включают любые знаки препинания в виде отдельных токенов?

Ответ 6

Вот альтернатива, не учитывающая регистр, подход

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

Он соответствует преобразованию строки и цели в нижний регистр.

ps: заботится о проблеме "am ham".count("am") == 2 с str.count(), указанной также с помощью @DSM:)

Ответ 7

Вы можете использовать библиотеку regex python re, чтобы найти все совпадения в подстроке и вернуть массив.

import re

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

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

Печать

2