如何用Python实现语境化多义单词翻译及发音显示?
多义词语境翻译+发音显示的Python实现方案
googletrans本身不支持词义消歧(WSD),也无法返回单词音标,要满足你的需求,需要结合词义消歧工具、发音处理库和翻译工具来实现。以下是具体的代码方案:
步骤1:安装依赖库
首先安装所需的Python库:
pip install nltk googletrans==4.0.0-rc1
然后在Python环境中下载NLTK所需的语料库(仅需执行一次):
import nltk nltk.download(['wordnet', 'averaged_perceptron_tagger', 'punkt', 'cmudict'])
步骤2:完整实现代码
from nltk.corpus import wordnet, cmudict from nltk.wsd import lesk from nltk.tokenize import word_tokenize from nltk.tag import pos_tag from googletrans import Translator # 初始化翻译器和CMU音标字典 translator = Translator() cmu_dict = cmudict.dict() def get_ipa_pronunciation(word): """将CMU音标转换为国际音标(美式)""" word_lower = word.lower() if word_lower not in cmu_dict: return "发音未找到" # CMU音标到国际音标的映射表 phoneme_map = { 'AH0': 'ə', 'AH1': 'ʌ', 'AH2': 'ʌ', 'AE0': 'æ', 'AE1': 'æ', 'AE2': 'æ', 'EY0': 'eɪ', 'EY1': 'eɪ', 'EY2': 'eɪ', 'IH0': 'ɪ', 'IH1': 'ɪ', 'IH2': 'ɪ', 'IY0': 'iː', 'IY1': 'iː', 'IY2': 'iː', 'AA0': 'ɑː', 'AA1': 'ɑː', 'AA2': 'ɑː', 'AO0': 'ɔː', 'AO1': 'ɔː', 'AO2': 'ɔː', 'OW0': 'oʊ', 'OW1': 'oʊ', 'OW2': 'oʊ', 'UH0': 'ʊ', 'UH1': 'ʊ', 'UH2': 'ʊ', 'UW0': 'uː', 'UW1': 'uː', 'UW2': 'uː', 'B': 'b', 'CH': 'tʃ', 'D': 'd', 'DH': 'ð', 'F': 'f', 'G': 'ɡ', 'HH': 'h', 'JH': 'dʒ', 'K': 'k', 'L': 'l', 'M': 'm', 'N': 'n', 'NG': 'ŋ', 'P': 'p', 'R': 'r', 'S': 's', 'SH': 'ʃ', 'T': 't', 'TH': 'θ', 'V': 'v', 'W': 'w', 'Y': 'j', 'Z': 'z', 'ZH': 'ʒ' } cmu_pron = cmu_dict[word_lower][0] ipa_chars = [] for phoneme in cmu_pron: # 移除重音数字 clean_phoneme = phoneme[:-1] if phoneme[-1].isdigit() else phoneme ipa_chars.append(phoneme_map.get(clean_phoneme, clean_phoneme)) return f"/{' '.join(ipa_chars).replace(' ', '')}/" def translate_word_with_context(sentence, target_word, target_lang='fa'): """结合语境翻译单词,返回发音、词义和波斯语翻译""" # 分词并标注词性 tokens = word_tokenize(sentence) tagged_tokens = pos_tag(tokens) # 匹配WordNet的词性标记 pos_mapping = {'N': wordnet.NOUN, 'V': wordnet.VERB, 'J': wordnet.ADJ, 'R': wordnet.ADV} target_pos = None for token, tag in tagged_tokens: if token.lower() == target_word.lower(): target_pos = pos_mapping.get(tag[0], None) break # 使用Lesk算法进行词义消歧 target_synset = lesk(tokens, target_word, pos=target_pos) if not target_synset: # 消歧失败时返回默认翻译 default_trans = translator.translate(target_word, dest=target_lang).text return f"{target_word} {get_ipa_pronunciation(target_word)} - 默认翻译:{default_trans}" # 获取义项定义和翻译 eng_definition = target_synset.definition() fa_definition = translator.translate(eng_definition, dest=target_lang).text # 获取对应义项的单词翻译 lemma_word = target_synset.lemma_names()[0] fa_translation = translator.translate(lemma_word, dest=target_lang).text return (f"{target_word} {get_ipa_pronunciation(target_word)} - " f"词义:{eng_definition}(波斯语:{fa_definition});翻译:{fa_translation}")
步骤3:测试代码
# 测试"季节"语境 sentence1 = "My favorite season is winter." print(translate_word_with_context(sentence1, "season")) # 测试"调味"语境 sentence2 = "The recipe says to season the dish with plenty of salt." print(translate_word_with_context(sentence2, "season"))
预期输出
season /ˈsiːzən/ - 词义:one of the natural periods into which the year is divided by the equinoxes and solstices or atmospheric conditions(波斯语:یکی از دورههای طبیعی که سال توسط تقاطعانی و سستیس یا شرایط اتمسفری تقسیم میشود);翻译:فصل season /ˈsiːzən/ - 词义:lend flavor to(波斯语:طعم دادن به);翻译:طعم دادن
注意事项
- Lesk算法的词义消歧准确率并非100%,如果需要更高精度,可以考虑使用基于BERT的WSD模型(如
transformers库中的预训练模型),但本地运行资源消耗会更高。 - 音标转换为简化映射,若需要更精准的国际音标,可考虑使用专门的音标处理库或付费词典API。
- googletrans的稳定性受网络影响,若频繁出错,可替换为
translatepy等更稳定的翻译库,或使用谷歌翻译官方API。
内容的提问来源于stack exchange,提问作者Abbas Taheri
相关产品推荐
相关产品推荐

