Как найти количество слов в строке?
У меня есть строка "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")
Я хочу узнать, как найти количество слов.
Ответы
Ответ 1
Если вы хотите найти счетчик отдельного слова, просто используйте count
:
input_string.count("Hello")
Используйте collections.Counter
и split()
для подсчета всех слов:
from collections import Counter
words = input_string.split()
wordCount = Counter(words)
Ответ 2
Counter
из коллекций - ваш друг:
>>> from collections import Counter
>>> counts = Counter(sentence.lower().split())
Ответ 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