Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在动词/名词/形容词形式之间转换单词_Python_Nlp_Nltk_Wordnet - Fatal编程技术网

Python 在动词/名词/形容词形式之间转换单词

Python 在动词/名词/形容词形式之间转换单词,python,nlp,nltk,wordnet,Python,Nlp,Nltk,Wordnet,我想要一个python库函数,可以跨不同的词类进行翻译/转换。有时它应该输出多个单词(例如,“coder”和“code”都是动词“to code”的名词,一个是主语,另一个是宾语) 对于我想写的笔记程序,我主要关心动词和名词。i、 我可以写“咖啡因拮抗A1”或“咖啡因是A1拮抗剂”,通过一些NLP它可以看出它们的意思是一样的。(我知道这并不容易,需要NLP进行解析,而不仅仅是标记,但我想构建一个原型) 类似的问题。。。 (这个答案只涉及到词根位置。我想在词根位置之间切换。) 我知道这并不能回答你

我想要一个python库函数,可以跨不同的词类进行翻译/转换。有时它应该输出多个单词(例如,“coder”和“code”都是动词“to code”的名词,一个是主语,另一个是宾语)

对于我想写的笔记程序,我主要关心动词和名词。i、 我可以写“咖啡因拮抗A1”或“咖啡因是A1拮抗剂”,通过一些NLP它可以看出它们的意思是一样的。(我知道这并不容易,需要NLP进行解析,而不仅仅是标记,但我想构建一个原型)

类似的问题。。。 (这个答案只涉及到词根位置。我想在词根位置之间切换。)


我知道这并不能回答你的全部问题,但它确实回答了大部分问题。我会退房 这个python库能够修饰动词,并识别单词是动词、名词还是形容词

示例代码

print en.verb.present("gave")
print en.verb.present("gave", person=3, negate=False)
>>> give
>>> gives
它还可以对单词进行分类

print en.is_noun("banana")
>>> True

下载在链接的顶部

一种方法可能是使用带有词性标记的单词词典和词形映射。如果您获得或创建这样的词典(如果您可以访问任何常规词典的数据,这是非常可能的,因为所有词典都列出了word的词性标记,以及所有派生形式的基本形式),您可以使用以下内容:

def is_verb(word):
    if word:
        tags = pos_tags(word)
        return 'VB' in tags or 'VBP' in tags or 'VBZ' in tags \
               or 'VBD' in tags or 'VBN' in tags:

def verbify(word):
    if is_verb(word):
        return word
    else:
       forms = []
       for tag in pos_tags(word):
           base = word_form(word, tag[:2])
           if is_verb(base):
              forms.append(base)
       return forms

这更像是一种启发式方法。我刚刚对它进行了编码,以使其符合风格。它使用wordnet中派生的与_相关的_forms()。我已经实现了nounify。我猜verbify的工作原理类似。从我测试的结果来看,效果非常好:

from nltk.corpus import wordnet as wn

def nounify(verb_word):
    """ Transform a verb to the closest noun: die -> death """
    verb_synsets = wn.synsets(verb_word, pos="v")

    # Word not found
    if not verb_synsets:
        return []

    # Get all verb lemmas of the word
    verb_lemmas = [l for s in verb_synsets \
                   for l in s.lemmas if s.name.split('.')[1] == 'v']

    # Get related forms
    derivationally_related_forms = [(l, l.derivationally_related_forms()) \
                                    for l in    verb_lemmas]

    # filter only the nouns
    related_noun_lemmas = [l for drf in derivationally_related_forms \
                           for l in drf[1] if l.synset.name.split('.')[1] == 'n']

    # Extract the words from the lemmas
    words = [l.name for l in related_noun_lemmas]
    len_words = len(words)

    # Build the result in the form of a list containing tuples (word, probability)
    result = [(w, float(words.count(w))/len_words) for w in set(words)]
    result.sort(key=lambda w: -w[1])

    # return all the possibilities sorted by probability
    return result

这是一个理论上能够在名词/动词/形容词/副词形式之间转换单词的函数,我更新了它(我相信它最初是由作者编写的),符合nltk 3.2.5,因为
synset.lemmas
sysnset.name
都是函数

from nltk.corpus import wordnet as wn

# Just to make it a bit more readable
WN_NOUN = 'n'
WN_VERB = 'v'
WN_ADJECTIVE = 'a'
WN_ADJECTIVE_SATELLITE = 's'
WN_ADVERB = 'r'


def convert(word, from_pos, to_pos):    
    """ Transform words given from/to POS tags """

    synsets = wn.synsets(word, pos=from_pos)

    # Word not found
    if not synsets:
        return []

    # Get all lemmas of the word (consider 'a'and 's' equivalent)
    lemmas = []
    for s in synsets:
        for l in s.lemmas():
            if s.name().split('.')[1] == from_pos or from_pos in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE) and s.name().split('.')[1] in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE):
                lemmas += [l]

    # Get related forms
    derivationally_related_forms = [(l, l.derivationally_related_forms()) for l in lemmas]

    # filter only the desired pos (consider 'a' and 's' equivalent)
    related_noun_lemmas = []

    for drf in derivationally_related_forms:
        for l in drf[1]:
            if l.synset().name().split('.')[1] == to_pos or to_pos in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE) and l.synset().name().split('.')[1] in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE):
                related_noun_lemmas += [l]

    # Extract the words from the lemmas
    words = [l.name() for l in related_noun_lemmas]
    len_words = len(words)

    # Build the result in the form of a list containing tuples (word, probability)
    result = [(w, float(words.count(w)) / len_words) for w in set(words)]
    result.sort(key=lambda w:-w[1])

    # return all the possibilities sorted by probability
    return result


convert('direct', 'a', 'r')
convert('direct', 'a', 'n')
convert('quick', 'a', 'r')
convert('quickly', 'r', 'a')
convert('hunger', 'n', 'v')
convert('run', 'v', 'a')
convert('tired', 'a', 'r')
convert('tired', 'a', 'v')
convert('tired', 'a', 'n')
convert('tired', 'a', 's')
convert('wonder', 'v', 'n')
convert('wonder', 'n', 'a')
正如你在下面看到的,它并没有那么好用。它无法在形容词和副词形式之间切换(我的具体目标),但在其他情况下它确实给出了一些有趣的结果

>>> convert('direct', 'a', 'r')
[]
>>> convert('direct', 'a', 'n')
[('directness', 0.6666666666666666), ('line', 0.3333333333333333)]
>>> convert('quick', 'a', 'r')
[]
>>> convert('quickly', 'r', 'a')
[]
>>> convert('hunger', 'n', 'v')
[('hunger', 0.75), ('thirst', 0.25)]
>>> convert('run', 'v', 'a')
[('persistent', 0.16666666666666666), ('executive', 0.16666666666666666), ('operative', 0.16666666666666666), ('prevalent', 0.16666666666666666), ('meltable', 0.16666666666666666), ('operant', 0.16666666666666666)]
>>> convert('tired', 'a', 'r')
[]
>>> convert('tired', 'a', 'v')
[]
>>> convert('tired', 'a', 'n')
[('triteness', 0.25), ('banality', 0.25), ('tiredness', 0.25), ('commonplace', 0.25)]
>>> convert('tired', 'a', 's')
[]
>>> convert('wonder', 'v', 'n')
[('wonder', 0.3333333333333333), ('wonderer', 0.2222222222222222), ('marveller', 0.1111111111111111), ('marvel', 0.1111111111111111), ('wonderment', 0.1111111111111111), ('question', 0.1111111111111111)]
>>> convert('wonder', 'n', 'a')
[('curious', 0.4), ('wondrous', 0.2), ('marvelous', 0.2), ('marvellous', 0.2)]

希望这能帮某人省去一点麻烦

我不知道它是否能做到这一点,但请看一下NLTK。你将如何处理模棱两可的案件?例如,
diguise
可以是动词,也可以是名词,具体取决于上下文。这没关系:
nounize('coverge')==['coverge']
verbify('coverge')==['coverage']
nounize(/code>想象为从任何词性到某些名词的模棱两可的转换。它不知道您想要的是“coder”还是“code”,但它提供了一个完整的超集,以后NLP可以消除歧义。您的标记中有NLTK,所以您是否正在寻找其他可以这样做的库?NLTK是否不足以完成此任务,或者您是否正在寻找NLTK中可以完成此任务的库?是的,我在这里看到了,但它只做POS中的事情。此答案不再有效,请参考下面@stuart更新的答案
>>> convert('direct', 'a', 'r')
[]
>>> convert('direct', 'a', 'n')
[('directness', 0.6666666666666666), ('line', 0.3333333333333333)]
>>> convert('quick', 'a', 'r')
[]
>>> convert('quickly', 'r', 'a')
[]
>>> convert('hunger', 'n', 'v')
[('hunger', 0.75), ('thirst', 0.25)]
>>> convert('run', 'v', 'a')
[('persistent', 0.16666666666666666), ('executive', 0.16666666666666666), ('operative', 0.16666666666666666), ('prevalent', 0.16666666666666666), ('meltable', 0.16666666666666666), ('operant', 0.16666666666666666)]
>>> convert('tired', 'a', 'r')
[]
>>> convert('tired', 'a', 'v')
[]
>>> convert('tired', 'a', 'n')
[('triteness', 0.25), ('banality', 0.25), ('tiredness', 0.25), ('commonplace', 0.25)]
>>> convert('tired', 'a', 's')
[]
>>> convert('wonder', 'v', 'n')
[('wonder', 0.3333333333333333), ('wonderer', 0.2222222222222222), ('marveller', 0.1111111111111111), ('marvel', 0.1111111111111111), ('wonderment', 0.1111111111111111), ('question', 0.1111111111111111)]
>>> convert('wonder', 'n', 'a')
[('curious', 0.4), ('wondrous', 0.2), ('marvelous', 0.2), ('marvellous', 0.2)]