【问题标题】:How to change NLTK default wordnet language to zsm?如何将 NLTK 默认 wordnet 语言更改为 zsm?
【发布时间】:2023-03-23 07:40:01
【问题描述】:

我是 NLTK 新手,我正在使用 NLTK 3 Cookbook:第 4 章进行 Python 3 文本处理。我已经完成了“使用 WordNet 进行标记”,并且在默认语言英语中工作正常。我已将 Language Bahasa (zsm) 下载到 omw 并想使用其他数据集在 Bahasa 中尝试。使用相同的方法,我现在如何将默认语言从英语更改为 zsm?

我正在使用的代码:

class WordNetTagger(SequentialBackoffTagger):

    def __init__(self, *args, **kwargs):
        SequentialBackoffTagger.__init__(self, *args, **kwargs)

        self.wordnet_tag_map = {
            'n': 'NN',
            's': 'JJ',
            'a': 'JJ',
            'r': 'RB',
            'v': 'VB'
        }

    def choose_tag(self, tokens, index, history):
        word = tokens[index]
        fd = FreqDist()

        for synset in wordnet.synsets(word):
            fd[synset.pos()] += 1

        if not fd: return None
        return self.wordnet_tag_map.get(fd.max())

提前致谢。

【问题讨论】:

    标签: python nltk


    【解决方案1】:

    您似乎已经明白,您不会更改 默认 语言;只要您不想要默认语言,您就可以明确指定所需的语言。如果您觉得这很麻烦,您可以将wordnet 对象包装在您自己的自定义类中,该类提供自己的默认值。

    class MyWordNet:
        def __init__(self, wn):
            self._wordnet = wn
    
        def synsets(self, word, pos=None, lang="zsm"):
            return self._wordnet.synsets(word, pos=pos, lang=lang)
    
        # and similarly for any other methods you need
    

    然后你初始化一个包装器对象,将它传递给 nltk 的wordnet 读取器对象,然后你使用它而不是原来的:

    wn = MyWordNet(wordnet)
    ...
    
    for synset it wn.synsets(word):
       ...
    

    【讨论】:

    • 感谢@alexis 的帮助。它有效,我一直在寻找,但结果与我的不同。大多数使用您的建议标记为无的单词。与我的明确指定相比,这就像转义很多单词。嗯,有趣。知道这是怎么发生的。
    • 嗯...我的回答显示了如何使用包装类覆盖默认参数,但没有显示如何实际上使用 wordnet 来做到这一点!哎呀...现在检查并修复,再看看。 (主要是匹配原始synsets()方法的签名。)
    • 再次感谢@alexis 的反馈。我已经尝试过了,仍然返回相同的。但是,我们将留给其他人稍后使用他们的数据集测试这两种方法。至于现在你的建议回答了我的主要问题:-) ps:我的使用的是link
    • 我测试了这个解决方案,它工作正常。由于我不知道您实际上在用它做什么,因此我无法谈论您剩下的问题。 (顺便说一句,我不确定您评论中指向 howto 的链接是什么意思。)
    【解决方案2】:

    经过一番尝试,我才发现:

    def choose_tag(self, tokens, index, history):
        word = tokens[index]
        fd = FreqDist()
    
        for synset in wordnet.synsets(word, lang='zsm'):
            fd[synset.pos()] += 1
    
        if not fd: return None
        return self.wordnet_tag_map.get(fd.max())
    

    关键是 wordnet.synsets(word, lang='zsm') 现在对我有用。我仍然愿意接受任何其他建议或更正。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 2019-04-21
      • 2012-08-17
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多