TypeError: должно быть str, а не list - список слов - PullRequest
2 голосов
/ 21 июня 2020

Для текущего проекта я планирую подсчитать количество определенных c слов в наборе данных.

Для строки кода count = word.count(wordlist), однако, я получаю следующую ошибку TypeError: must be str, not list. Есть ли какой-нибудь умный способ заставить Python принимать список слов, чтобы проверять не только одно конкретное c, но и несколько слов?

Соответствующий код выглядит так:

# Word frequency analysis
def get_top_n_bigram(corpus, n=None):
    vec = CountVectorizer(ngram_range=(2, 2), stop_words='english').fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0)
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]


# Analysis loops running through different string sections
for i in ['Text_Pro','Text_Con','Text_Main']:
    common_words = get_top_n_bigram(df[i], 500)
    for word, freq in common_words:
        print(word, freq)


# Analysis loops checking if specific words are found
    for word in common_words:
        wordlist = ['good', 'management', 'bad']
        count = word.count(wordlist)
        print(count)

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Я бы go более эффективный, но более подробный способ проверки по набору в старомодном l oop:

from typing import Iterable

def count_many(string: str, words: Iterable[str]) -> int:
    search_set = set(words)  # To ease lookups
    split = string.split()  # Cut into words

    count = 0
    for word in split:
        if word in search_set:
            count += 1

    return count

>>> count_many("hello world hello no world hello", ["hello", "world"])
5

Поместите слова для поиска в набор для более быстрый поиск, разделение исходного текста на слова, затем просто l oop и подсчет.

Это должно сделать, независимо от длины words, две итерации исходного текста.

1 голос
/ 21 июня 2020

Поскольку нам необходимо независимо проверять каждое слово, мы можем также построить всю гистограмму частоты встречаемости слов, а затем извлечь количество слов, которое нас интересует:

from collections import Counter

def words_matching(sentence, candidates):
    histogram = Counter(sentence.split())
    return sum(histogram[word] for word in candidates)
1 голос
/ 21 июня 2020

Используйте понимание списка:

count = 0
for word in common_words:
    wordlist = ['good', 'management', 'bad']
    count += sum([word.count(i) for i in wordlist])

print(count)

В качестве словаря на запрос из раздела комментариев к этому ответу:

count = {}
for word in common_words:
    wordlist = ["good", "management", "bad"]
    count[word] = sum([word.count(i) for i in wordlist])

print(count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...