Объединение триграмм из кортежа в словаре - PullRequest
0 голосов
/ 20 февраля 2019

Хорошо, я работаю над заданием для курса в моей лингвистической БА, где мы работаем с python для обработки текстов.Вот что мне нужно было сделать:

Создать скрипт, который подсчитывает частоты триграмм

  • Не добавлять фиктивные токены
  • Строчные буквы каждого токена и триграммы сцепленияединицы с подчеркиванием
  • Каковы пропущенные значения в поле вывода?
  • Бонус: попробуйте решить задачу, сохранив триграммы кортежей в словаре

Вот как я решил большинство, если это так:

lyrics = "Do you remember 21st night of September ? Love was changing the mind of pretenders While chasing the clouds away Our hearts were ringing In the key that our souls were singing As we danced in the night Remember how the stars stole the night away yeah yeah yeah Hey hey hey Ba de ya say do you remember ? Ba de ya dancing in September Ba de ya never was a cloudy day Ba duda ba duda ba duda badu Ba duda badu ba duda badu Ba duda badu ba duda yeah My thoughts are with you Holding hands with your heart to see you Only blue talk and love Remember how we knew love was here to stay Now December Found the love we shared in September Only blue talk and love Remember the true love we share today Hey hey hey Ba de ya say do you remember ? Ba de ya dancing in September Ba de ya never was a cloudy day There was a Ba de ya say do you remember ? Ba de ya dancing in September Ba de ya golden dreams were shiny days Now our bell was ringing aha Our souls was singing Do you remember every cloudy day yau There was a Ba de ya say do you remember ? Ba de ya dancing in September Ba de ya never was a cloudy day There was a Ba de ya say do you remember ? Ba de ya dancing in September Ba de ya golden dreams were shiny days Ba de ya de ya de ya Ba de ya de ya de ya Ba de ya de ya de ya de ya Ba de ya de ya de ya Ba de ya de ya de ya Ba de ya de ya de ya de ya"

lyric = lyrics.lower()
listText = lyric.split(" ")
freq = {}



while len(listText) > 2:
    trigram = (listText[0], listText[1], listText[2])
    if trigram in freq.keys():
        freq[trigram] += 1
    else:
        freq[trigram] = 1
    listText.pop(0)

sorted_data = sorted(freq.items() , key=lambda x: x[1], reverse = True) 

for entry in sorted_data:
    print(str(entry[0])+"\t"+str(entry[1]))

Единственная часть, которую я пропускаю, - это объединить триграммы с подчеркиванием.Это должно быть так просто, но я не могу понять, как это сделать.Предполагается, что выходными данными являются каскадные триграммы, за которыми следует частота упомянутой триграммы.Учитель сказал, что это можно решить так легко, но я не могу понять это.Что забавно, потому что все остальное, что я сделал здесь, было очень быстро и легко (относительно).

Я пробовал много вещей, но по какой-то причине не могу заставить его работать.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

если вам нужно просто связаться с ними, вы можете использовать str.join

trigram = (listText[0], listText[1], listText[2])
c_trigram = '_'.join(*trigram)

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

0 голосов
/ 20 февраля 2019

Вы можете использовать строковый метод join .Все, что вам нужно сделать, это вызвать '_'.join для набора триграмм при печати. ​​

print(str('_'.join(entry[0]))+"\t"+str(entry[1]))

Другие примечания:

(1) Вы можете быть более питоническим и генерировать свой listText с использованием понимания списка следующим образом: listText = [word.lower() for word in lyrics.split()]

(2) Вы можете использовать setdefault словаря вместо if/else, чтобы увеличивать / инициализировать триграмму следующим образом: freq.setdefault(trigram, 0), а затем увеличиватьfreq[trigram] += 1 без использования какого-либо блока if / else.Прямо сейчас вы перебираете freq.keys() в поиске trigram в вашем операторе if, который постоянен во времени в Python 3 (эквивалентно высказыванию trigram in freq), но линейен во времени в Python 2.

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