팟캐스트에서 브랜드에 대한 모든 언급 찾기

23719 단어 reportingpython
이 게시물에서는 팟캐스트 에피소드에서 브랜드 언급을 확인하는 방법을 다룹니다. 이는 후원 의무가 충족되었는지 확인하거나 경쟁자가 언급되는 시기를 확인하는 데 특히 유용할 수 있습니다.

팟캐스트 피드 URL, 시작/종료 날짜 및 브랜드 이름을 입력하면 스크립트는 Deepgram의 빠르고 정확한 음성 인식 API에서 감지한 모든 언급에 대한 보고서를 생성합니다.

시작하기 전에



컴퓨터에 Python이 설치되어 있어야 합니다. 저는 이 글을 쓰는 시점에 Python 3.10을 사용하고 있습니다. 또한 Deepgram API 키get one here가 필요합니다.

새 디렉터리를 만들고 터미널에서 해당 디렉터리로 이동합니다. Create a virtual environmentpython3 -m venv virtual_env로 활성화하고 source virtual_env/bin/activate로 활성화합니다. pip install deepgram_sdk asyncio python-dotenv feedparser로 종속성을 설치합니다.

코드 편집기에서 디렉토리를 열고 빈.env 파일을 만듭니다. Deepgram API 키를 가져와 .env에 다음 줄을 추가합니다.

DEEPGRAM_API_KEY="replace-this-bit-with-your-key"


종속성 및 파일 설정



script.py 파일을 만들고 종속성을 가져옵니다.

import os
import json
from datetime import datetime
from time import mktime
import asyncio
from dotenv import load_dotenv
from deepgram import Deepgram
import feedparser

.env 파일에서 값을 로드하고 Deepgram Python SDK를 초기화합니다.

load_dotenv()
deepgram = Deepgram(os.getenv('DEEPGRAM_API_KEY'))


마지막으로 스크립트가 실행될 때 자동으로 실행되는 main() 함수를 설정합니다.

async def main():
    print('Hello world')

if __name__ == '__main__':
    asyncio.run(main())


매개변수 정의


main() 함수 위에서 보고서에 대한 설정으로 변수 집합을 만듭니다.

podcast_feed = 'http://feeds.codenewbie.org/cnpodcast.xml' # CodeNewbie Podcast
brand_name = 'stellar'
required_confidence = 0.9
start_date = '2022-05-01' # Start of season 20
end_date = '2022-06-27' # End of season 20


Deepgram이 검색 결과를 반환할 때마다 신뢰도는 0과 1 사이입니다. required_confidence 값은 지정된 신뢰 수준 이상의 결과만 보고합니다.

Feedparser로 에피소드 가져오기


print() 함수에서 main() 문을 제거하고 팟캐스트를 가져온 다음 반환된 데이터를 예쁘게 인쇄하여 살펴봅니다.

async def main():
    rss = feedparser.parse(podcast_feed)
    print(json.dumps(rss.entries, indent=2))


사용해 보세요! 터미널에서 python3 script.py로 파일을 실행하면 각 에피소드에 대한 많은 데이터가 표시됩니다.

날짜 범위 내의 에피소드 필터링



Feedparser는 RSS 항목이 게시/업데이트될 때 다양한 날짜 형식을 취하고 이를 표준 형식으로 정규화합니다. 표준화된 출력을 사용하여 main() 함수 바로 아래에 도우미 함수를 만듭니다.

def check_if_in_date_range(episode):
    date_with_time = datetime.fromtimestamp(mktime(episode.published_parsed))
    date = date_with_time.replace(hour=0, minute=0, second=0)
    is_not_before_start = date >= datetime.fromisoformat(start_date)
    is_not_after_end = date <= datetime.fromisoformat(end_date)
    return is_not_before_start and is_not_after_end


이 함수는 에피소드를 가져와 (시간 없이) 날짜를 가져오고 Truestart_date 사이의 범위에 있으면 end_date 를 반환합니다.
print(json.dumps(rss.entries, indent=2))를 제거하고 다음으로 바꿉니다.

episodes = list(filter(check_if_in_date_range, rss.entries))

episodes 배열에는 이제 날짜 범위 내의 에피소드만 포함됩니다.

키워드 부스팅 및 검색으로 에피소드 기록


main() 함수 내에서 팟캐스트 미디어 URL을 추출하고 전사 옵션을 설정하고 Deepgram 전사를 요청합니다. 마지막으로 결과에서 검색 결과를 추출합니다.

for episode in episodes:
    # Get podcast episode URL
    source = { 'url': episode.enclosures[0].href }
    # Increase chance of hearing brand_name
    # Return search results for brand_name
    transcription_options = { 'keywords': f'{brand_name}:2', 'search': brand_name }
    # Request transcription
    response = await deepgram.transcription.prerecorded(source, transcription_options)
    # Extract search results
    search_results = response['results']['channels'][0]['search'][0]['hits']


신뢰도가 높은 결과만 필터링



아래에 다음 줄search_results을 추가하여 필수 신뢰도 미만인 값을 필터링합니다.

strong_results = list(filter(lambda x: x['confidence'] > required_confidence, search_results))


멘션 보고서 저장



아래strong_results에서 각 에피소드(및 에피소드 내의 각 결과)를 가져와 보고서 파일에 새 줄로 추가합니다.

# Define file name
filename = f'{brand_name}-mentions-{start_date}-to-{end_date}.txt'
with open(filename, 'a+') as f:
    # Format publish date
    pub = datetime.fromtimestamp(mktime(episode.published_parsed))
    # Create line per episode
    f.write(f'{pub}: "{episode.title}" ({len(strong_results)} mentions)\n')
    # Create line per result (indented two spaces)
    for result in strong_results:
        f.write(f'  Mention at {result["start"]}s of \"{result["snippet"]}\"\n')


그게 다야! python3 script.py로 스크립트를 다시 실행하고 완료되면 stellar-mentions-2022-05-01-to-2022-06-27.txt라는 새 파일이 표시되어야 합니다. 여러 보고서를 실행하려는 경우에 적합합니다.

이 프로젝트 확장



이 프로젝트는 여러 팟캐스트 에피소드에서 브랜드 언급이 발생하는지 여부와 발생 빈도를 이해하는 데 필요한 정보를 제공해야 합니다. 하나의 요청에서 여러 브랜드를 검색할 수 있도록 하거나 이 논리를 중심으로 UI를 구축하여 더 복잡한 보고서 또는 그래픽 보고서를 만들어 이를 더욱 확장해야 합니다.

여느 때와 마찬가지로 질문이 있으시면 언제든지 연락하시거나 community discussions 에 게시해 주십시오.

최종 코드는 다음과 같습니다.

import asyncio
import os
from datetime import datetime
from time import mktime
from dotenv import load_dotenv
from deepgram import Deepgram
import feedparser

load_dotenv()
deepgram = Deepgram(os.getenv('DEEPGRAM_API_KEY'))

podcast_feed = 'http://feeds.codenewbie.org/cnpodcast.xml'
brand_name = 'stellar'
required_confidence = 0.9
start_date = '2022-05-01'
end_date = '2022-06-27'

async def main():
    rss = feedparser.parse(podcast_feed)
    episodes = list(filter(check_if_in_date_range, rss.entries))
    print(len(episodes))

    for episode in episodes:
        source = { 'url': episode.enclosures[0].href }
        transcription_options = { 'keywords': f'{brand_name}:2', 'search': brand_name }
        response = await deepgram.transcription.prerecorded(source, transcription_options)
        search_results = response['results']['channels'][0]['search'][0]['hits']
        strong_results = list(filter(lambda x: x['confidence'] > required_confidence, search_results))

        filename = f'{brand_name}-mentions-{start_date}-to-{end_date}.txt'
        with open(filename, 'a+') as f:
            pub = datetime.fromtimestamp(mktime(episode.published_parsed))
            f.write(f'{pub}: "{episode.title}" ({len(strong_results)} mentions)\n')
            for result in strong_results:
                f.write(f'  Mention at {result["start"]}s of \"{result["snippet"]}\"\n')

def check_if_in_date_range(episode):
    date_with_time = datetime.fromtimestamp(mktime(episode.published_parsed))
    date = date_with_time.replace(hour=0, minute=0, second=0)
    is_not_before_start = date >= datetime.fromisoformat(start_date)
    is_not_after_end = date <= datetime.fromisoformat(end_date)
    return is_not_before_start and is_not_after_end

if __name__ == '__main__':
    asyncio.run(main())

좋은 웹페이지 즐겨찾기