Подсчитайте вхождения биграмм в строку и сохраните их в словарь - PullRequest
1 голос
/ 09 марта 2020

Я кодирую в Python, и у меня есть строка, в которую я хочу подсчитать количество вхождений биграмм в этой строке. Под этим я подразумеваю то, что, например, у меня есть строка "test string", и я хотел бы перебрать эту строку в подстроках размера 2 и создать словарь каждой биграммы и количество ее вхождений в исходной строке. .
Таким образом, я хотел бы получить вывод вида {te: 1, es : 1, st: 2, ...}.

Не могли бы вы помочь мне начать это?
С уважением!

Ответы [ 3 ]

3 голосов
/ 09 марта 2020

Дано

s = "test string"

do

from collections import Counter
Counter(map(''.join, zip(s, s[1:])))

или

from collections import Counter
Counter(s[i:i+2] for i in range(len(s)-1))

Результат любого равен

Counter({'st': 2, 'te': 1, 'es': 1, 't ': 1, ' s': 1, 'tr': 1, 'ri': 1, 'in': 1, 'ng': 1})
1 голос
/ 09 марта 2020

Я думаю, что-то вроде этого просто и легко сделать, и нет необходимости import какой-либо библиотеки.

Сначала мы удаляем все пробелы из строки, используя join().
Затем мы создаем list, содержащий все подстроки с шагом 2.
Наконец, мы создаем и print() dictionary, который имеет все подстроки в качестве ключей и их соответствующие вхождения в исходной строке в качестве значений.

substr = [] # Initialize empty list that contains all substrings.
step = 2 # Initialize your step size.
s = ''.join('test string'.split()) # Remove all whitespace from string.
for i in range(len(s)):
    substr.append(s[i: i + step])
# Construct and print a dictionary which counts all occurences of substrings.
occurences = {k: substr.count(k) for k in substr if len(k) == step}
print(occurences) 

При запуске он выводит словарь, как вы просили:

{'te': 1, 'es': 1, 'st': 2, 'ts': 1, 'tr': 1, 'ri': 1, 'in': 1, 'ng': 1}
1 голос
/ 09 марта 2020

Как примечание, вы ищете биграммы . Для большего масштаба - есть надежные реализации в различных комплектах машинного обучения / НЛП.

В качестве ad-ho c решения, проблема должна быть разложена до

  1. Итерировать по "текущему и следующие элементы "в последовательности
  2. Количество уникальных пар.

Решением для задачи № 1 является pairwise из рецептов itertools

Решение проблемы № 2 - Счетчик


Собрать все вместе -

from itertools import tee

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

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