Извлечь счетчик текста из списка элементов

У меня есть список, содержащий текстовые элементы.

text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two'] 

Мне нужно получить количество текста, который присутствует до "=". Я использовал CountVectorizer, как показано ниже, с шаблоном токена, но он не дает ожидаемых результатов.

print(text)
vectorizer = CountVectorizer()
vectorizer = CountVectorizer(token_pattern="^[^=]+")
vectorizer.fit(text)
print(vectorizer.vocabulary_)

Что дает вывод, как показано ниже

{'a for': 2, 'b for': 3, 'd for': 4, 'e for': 5, '1.': 0, '2.': 1}

Но ожидаемый результат должен быть

{'a for': 2, 'b for': 1, 'd for': 2, 'e for': 1, '1.': 1, '2.': 1}

Также мне нужно удалить "." от 1." чтобы мой вывод был

 {'a for': 2, 'b for': 1, 'd for': 2, 'e for': 1, '1': 1, '2': 1}

Есть ли способ сделать это?


person Balaji    schedule 20.01.2018    source источник
comment
перебрать список и заменить "." на "".   -  person MIftikharK    schedule 20.01.2018


Ответы (3)


Простым способом было бы использовать collections.Counter():

>>> from collections import Counter
>>> text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two']
>>> Counter(x.split('=')[0].replace('.', '') for x in text)
Counter({'a for': 2, 'd for': 2, 'b for': 1, 'e for': 1, '1': 1, '2': 1})

Который сначала разбивает каждую строку в тексте на "=" в список и берет из него первый элемент. Затем вызывается replace() для замены любых экземпляров "." на "". Затем, наконец, он возвращает Counter() объект счетчиков.

Примечание. Если вы хотите вернуть чистый словарь в конце, вы можете перенести dict() в последнюю строку.

person RoadRunner    schedule 20.01.2018

from collections import Counter

text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two']

text = [i.split('=')[0] for i in text]      #consider only the first part of the split
text = [i.split('.')[0] for i in text]
frequency = {}
for each in text:
    if each in frequency:
        frequency[each] += 1
    else:
        frequency[each] = 1
print(frequency)                        #if you want to use dict

counts =list(Counter(text).items())     #if you want to use collections module
print(counts)

Обратите внимание, что это будет работать только для того, что говорит ваш список text, т. е. содержит только один = , кроме этого, вам нужно немного его настроить.

person me.ydv.5    schedule 20.01.2018

Вы можете сделать это без CountVectorizer:

text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two'] 
left_sides = [pair.split('=')[0].replace('.','') for pair in text]
uniques = set(left_sides)
counts = {i:left_sides.count(i) for i in uniques}
print(counts)

который дает:

{'d for': 2, 'b for': 1, '1': 1, 'a for': 2, '2': 1, 'e for': 1}
person zdgriffith    schedule 20.01.2018