Как стандартизировать ярлыки в списке питонов? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь проанализировать разговоры и мне нужен метод стандартизации меток динамиков. Каждый разговор представляет собой список подсписков, каждый подсписок состоит из двух строк: одна для идентификатора говорящего, а другая для фактического высказывания:

myconvo = [['bob','hello alice'],['alice','hello bob'],['bob','goodbye alice'],['alice','goodbye bob']]

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

myconvo = [['speaker1','hello alice'],['speaker2','hello bob'],['speaker1','goodbye alice'],['speaker2','goodbye bob']]

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

Пока я получилчто касается определения ...

# empty list to store speaker labels
speakers = set()

# iterate through convo adding speaker names
for sub in myconvo:
    if sub[0] not in speakers:
        speakers.add(sub[0])

# convert to list to access index (where position 0 will be the first speaker, position 1 will be second speaker etc.)
speakers = list(speakers)

Я не уверен, куда идти дальше, или даже если есть более короткий путь решения этой проблемы.

Ответы [ 4 ]

2 голосов
/ 25 октября 2019
myconvo = [['bob','hello alice'],['alice','hello bob'],['bob','goodbye alice'],['alice','goodbye bob']]

speakers = {}
count = 1
# geeting the unique user name and assigning speaker numbers to them
for i in myconvo:
    if i[0] not in speakers:
        speakers.update({i[0]:'speaker{}'.format(count)})
        count+=1

# changing the name with the speaker number
for i in range(len(myconvo)):
    name = myconvo[i][0]
    myconvo[i][0] = speakers[name]

print(myconvo)        

выход

[['speaker1', 'hello alice'], ['speaker2', 'hello bob'], ['speaker1', 'goodbye alice'], ['speaker2', 'goodbye bob']]
1 голос
/ 25 октября 2019
myconvo = [['bob','hello alice'],['alice','hello bob'],['bob','goodbye alice'],['alice','goodbye bob']]

speakers = set([x[0] for x in myconvo])

speaker_ids = {speaker: i + 1 for i, speaker in enumerate(speakers)}

myconvo = [[f"speaker{speaker_ids[x[0]]}", x[1]] for x in myconvo]

print(myconvo)

Дает:

[['speaker1', 'hello alice'], ['speaker2', 'hello bob'], ['speaker1', 'goodbye alice'], ['speaker2', 'goodbye bob']]
1 голос
/ 25 октября 2019

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

speakers = {sub[0] for sub in myconvo}

, затем вам нужно назначить их "ники", например,

nicks = {
    original_name: f'speaker{i}'
    for i, original_name in enumerate(speakers):    
}

После этого становится просто перебирать ваши разговоры и заменять имена никами

for conv in myconvo:
   conv[0] = nicks[conv[0]]
1 голос
/ 25 октября 2019

Вы можете попробовать сохранить dict, который сопоставляет каждый динамик с его стандартизированным именем:

def standardize(conv):
    speakers = {}
    i = 1
    end_conv = []
    for speaker, sentence in conv: # iterate over speakers
        if speaker not in speakers:
            speakers[speaker] = f"speaker{i}"
            i += 1
        end_conv.append([speakers[speaker], sentence])
    return end_conv


>>> standardize(myconvo)
[['speaker1', 'hello alice'], ['speaker2', 'hello bob'], ['speaker1', 'goodbye alice'], ['speaker2', 'goodbye bob']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...