paint-brush
Омръзна ли ви Siri да бърка името ви? Ето едно просто решениеот@philhopkins
326 показания
326 показания

Омръзна ли ви Siri да бърка името ви? Ето едно просто решение

от Philip Hopkins6m2024/12/14
Read on Terminal Reader

Твърде дълго; Чета

Побеждавайки Apple и Siri в играта на транскрибиране и изпращане на текстове
featured image - Омръзна ли ви Siri да бърка името ви? Ето едно просто решение
Philip Hopkins HackerNoon profile picture
0-item

Имам iPhone от десет години и го харесвам. За разлика от някои хора, аз наистина се радвам на Siri и я използвам често. Но след десет години Siri не е разбрала, че когато преписва моите текстове, трябва да знае, че името на жена ми не е Аарон, а Ерин. Прощавам внедряването на говор към текст, което изисква много ресурси, но след като коригирах тази грешка веднъж и изпратих коригиран текст, тази корекция трябваше да бъде съхранена в хронологията на корекциите на моя телефон - малък файл, използван от публикация -обработващ модел на трансформатор, заедно с други улики, за да направите тази грешка много по-малко вероятно. Знам, че наричането на функцията за преобразуване на говор в текст на iPhone Siri е прекалено опростено, но децата ми така мислят за „AI в моя iPhone“.


Системите за преобразуване на говор в текст често се борят с омофони - думи, които звучат еднакво, но имат различен правопис и значения. Тези грешки могат да бъдат разочароващи, особено когато засягат лични имена или често използвани термини. Ключът към коригирането на този проблем не се крие в основното преразглеждане на механизма за разпознаване на реч, а в олекотен слой за обработка на текст след транскрипция, който се адаптира към потребителските корекции с течение на времето. Ето кода, базиран на PyTorch, който проектирах, за да се справя с това.


Той е супер компактен и лесен за инсталиране на телефон след компилиране за мобилно устройство. Знам, че зад Siri стои много сложен набор от верижни модели, така че този код може да се използва само за предоставяне на нова функция като вход към тези модели, резултат, който помага за персонализиране на транскрипцията, когато възникнат определени хомофони. Но би било по-лесно да използвате това като слой за последваща обработка.

Това не трябва да чака за внедряване на нова версия на телефона. Това би направило живота ми по-добър в следващата актуализация, която Apple пуска за моя iPhone.

Основната идея

Този подход се фокусира върху три основни елемента:

  • История на корекциите: Съхранява предишни потребителски корекции, като дава приоритет на думите, които потребителят изрично е коригирал преди.
  • Чести контакти: Проследява често използвани думи или имена, приписвайки по-голяма вероятност на тези, които се използват по-често.
  • Контекстуален анализ: Използва обработка на естествен език (NLP), за да анализира заобикалящия текст за улики, които помагат за разграничаване на омофони.


Системата изчислява оценка на вероятността за всеки хомофонен кандидат въз основа на тези три фактора и избира най-вероятната корекция. По-долу е изпълнението на Python, разделено на секции с обяснения.

Зареждане на базата данни за омофони

Първата стъпка е създаване или зареждане на база данни с омофони. Това са двойки думи (или групи), които е вероятно да бъдат объркани по време на транскрипция.


 # Homophones database homophones_db = { "Aaron": ["Erin"], "bare": ["bear"], "phase": ["faze"], "affect": ["effect"], }

Това е прост речник, където ключът е неправилно транскрибираната дума, а стойността е списък с хомофонни алтернативи. Например „phase“ може да се обърка с „faze“. По-късно тази база данни ще бъде запитвана, когато се срещне двусмислена дума.

Проследяване на историята на корекциите

Кодът проследява потребителските корекции в речник, където всеки ключ е кортеж от (оригинална_дума, коригирана_дума), а стойността е броят пъти, когато потребителят е коригирал тази грешка.

Проследяване на историята на корекциите

 # Correction history tracker correction_history = { ("phase", "Faye's"): 3, ("bear", "bare"): 2, }


Ако потребителят коригира "phase" на "Faye's" три пъти, системата приоритизира тази корекция за бъдещи транскрипции.

Чести контакти

Друг фактор, влияещ върху избора на хомофон е колко често се използва определена дума. Това може да са лични имена или термини, които потребителят често въвежда.

 # Frequent contact tracker frequent_contacts = { "faye": 15, "phase": 5, "erin": 10, "aaron": 2, }

Системата придава по-голяма тежест на често използваните думи при разграничаване на омофони. Например, ако "faye" се появи 15 пъти, но "phase" се появи само 5 пъти, "faye" ще бъде предпочитано.

Контекстуален анализ

Контекстните улики се извличат от заобикалящото изречение, за да се прецизира допълнително селекцията. Например, ако изречението съдържа местоимението „тя“, системата може да предпочете „Ерин“ пред „Аарон“. от тръбопровод за внос на трансформатори

Заредете NLP модел за анализ на контекста

 from transformers import pipeline # Load an NLP model for context analysis context_analyzer = pipeline("fill-mask", model="bert-base-uncased") def detect_context(sentence): """Detect context-specific clues in the sentence.""" pronouns = ["he", "she", "his", "her", "their"] tokens = sentence.lower().split() return [word for word in tokens if word in pronouns]

Тази функция сканира изречението за родово-специфични местоимения или други улики, които биха могли да посочат очакваното значение на думата.

Изчисляване на вероятностни резултати

На всеки хомофонен кандидат се присвоява оценка на вероятността въз основа на:

  1. Минали корекции : По-голямо тегло (напр. 3x).
  2. Честа употреба : Средно тегло (напр. 2x).
  3. Контекстно съвпадение : По-ниско тегло (напр. 1x).
 def calculate_likelihood(word, candidate, sentence): """Calculate a likelihood score for a homophone candidate.""" correction_score = correction_history.get((word, candidate), 0) * 3 frequency_score = frequent_contacts.get(candidate, 0) * 2 context = detect_context(sentence) context_clues = homophones_db.get(candidate, []) context_score = sum(1 for clue in context if clue in context_clues) return correction_score + frequency_score + context_score

Този резултат съчетава трите фактора, за да определи най-вероятния хомофон.

Разграничаване на омофони

С изчислените оценки на вероятността системата избира хомофона с най-висок резултат.

 def prioritize_homophones(word, candidates, sentence): """Prioritize homophones based on their likelihood scores.""" likelihoods = { candidate: calculate_likelihood(word, candidate, sentence) for candidate in candidates } return max(likelihoods, key=likelihoods.get) def disambiguate_homophone(word, sentence): """Disambiguate homophones using likelihood scores.""" candidates = homophones_db.get(word, []) if not candidates: return word return prioritize_homophones(word, candidates, sentence)


Този процес гарантира, че е избрана най-подходящата дума въз основа на история, честота и контекст.

Обработка на пълни транскрипции

Системата обработва цяло изречение, като прилага логиката за уточняване на многозначността към всяка дума.

 def process_transcription(transcription): """Process the transcription to correct homophones.""" words = transcription.split() corrected_words = [disambiguate_homophone(word, transcription) for word in words] return " ".join(corrected_words)

Пълен примерен работен процес

 # Example transcription and correction raw_transcription = "This is phase one plan." corrected_transcription = process_transcription(raw_transcription) print("Original Transcription:", raw_transcription) print("Corrected Transcription:", corrected_transcription) # Simulate user feedback update_correction_history("phase", "faye") print("Updated Correction History:", correction_history) print("Updated Frequent Contacts:", frequent_contacts)

Актуализиране на обратната връзка

Когато потребителят коригира грешка, историята на корекциите и честите контакти се актуализират, за да се подобрят бъдещите прогнози.


 def update_correction_history(original, corrected): """Update correction history and frequent contacts.""" correction_history[(original, corrected)] = correction_history.get((original, corrected), 0) + 1 frequent_contacts[corrected] = frequent_contacts.get(corrected, 0) + 1 frequent_contacts[original] = max(0, frequent_contacts.get(original, 0) - 1)

Пример за препис и корекция

 Original Transcription: This is phase one plan. Corrected Transcription: This is Faye's one plan. Updated Correction History: {('phase', 'Faye's'): 4} Updated Frequent Contacts: {'Faye's': 16, 'phase': 4}

Заключение

Този олекотен слой за обработка на текст подобрява точността на приложенията за реч към текст, като се учи от корекциите на потребителя, използва честото използване и анализира контекста. Той е достатъчно компактен, за да работи на мобилни устройства и се адаптира към индивидуалните потребителски нужди, като предлага по-интелигентна алтернатива на традиционните статични модели. С минимални усилия Apple или всяка друга компания може да интегрира тази функционалност, за да направи виртуални асистенти като Siri по-отзивчиви и персонализирани.

L O A D I N G
. . . comments & more!

About Author

Philip Hopkins HackerNoon profile picture
Philip Hopkins@philhopkins
I am a hacker, engineer, product manager, and researcher on LLMs, AI/ML, and the ethics of applied machine learning.

ЗАКАЧВАЙТЕ ЕТИКЕТИ

ТАЗИ СТАТИЯ Е ПРЕДСТАВЕНА В...