gpt4 book ai didi

python - 注意使用 NLTK 和 Wordnet 进行程序不起作用,错误消息显示这是因为 wordnet

转载 作者:行者123 更新时间:2023-12-01 09:30:31 24 4
gpt4 key购买 nike

我正在尝试用 python 编写一个程序,它将记录我输入的段落。它将对该段落的第一句和最后一句以及带有日期和数字的句子进行排序。然后它会用同义词替换一些单词,并去掉无用的形容词。我知道 python 的通用知识,但我对 nltk 和 WordNet 很陌生。我已经启动了一个原型(prototype)程序,它将用所有随机同义词替换句子中的单词,但是我不断收到一条错误消息,表明 WordNet 有问题。我认为我安装的是正确的,但也可能是错误的。这是我的代码:

import random
import sys
from nltk.corpus import wordnet

print('Enter your passage')
Passage = sys.stdin.readline()
PassageList = Passage.split(' ')
wordCounter = 0
syns = []

def maxInt(list):
i = 0
for x in list:
i += 1
return i



for x in PassageList:
syns = wordnet.synsets(PassageList[wordCounter])
synLength = maxInt(syns)
PassageList[wordCounter] == syns[0]
print(PassageList[wordCounter])
wordCounter += 1

这是我不断收到的错误:

Traceback (most recent call last):
File "C:\Users\shoob\Documents\Programs\Python\Programs\NoteTake.py", line 22, in <module>
PassageList[wordCounter] == syns[0]
File "C:\Users\shoob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\nltk\corpus\reader\wordnet.py", line 198, in __eq__
return self._name == other._name
AttributeError: 'str' object has no attribute '_name'

如果你能帮忙的话,那对我帮助很大。 :-D

最佳答案

更长

另一个答案更多是在 NLP 方面,但这里是 OP 中代码的演练,看看发生了什么。

Python 约定

首先,Python代码的一些约定。通常CamelCase变量名不是实际变量而是类对象,因此避免使用诸如Passage之类的变量。

此外,使用更好的变量名称也有帮助,您可以将它们称为单词,而不是 PassageList

例如

import random
import sys
from nltk.corpus import wordnet

print('Enter your passage')
passage = sys.stdin.readline()

# The passage.split() is aka word tokenization
# note you've skipped sentence tokenization,
# so it doesn't fit the goal of getting first and last sentence
# that you've described in the OP
words = passage.split(' ')

收藏是你的 friend

接下来,您可以使用 native Python 中的计数器对象,它们将帮助您进行一些优化并提高代码的可读性。例如

from collections import Counter
word_counter = Counter()

看看https://docs.python.org/3/library/collections.html

同义词集不是同义词

正如另一个答案中所解释的,WordNet 按含义(又名同义词集)进行索引,它们不是同义词。要获取同义词,您可以使用 Synset.lemma_names() 函数。但它们确实很有限,在知道从任何不明确的单词中选择哪个同义词集的引理名称之前,您必须经历 WSD 的过程。

此外,显式优于隐式,使用人类可以理解的变量名称有助于理解和改进代码,因此不要使用 syn = [],而是使用同义词= []

否则,真的不清楚 syn 存储的是什么。

函数不应被滥用

忽略错误的缩进,目前还不清楚这里试图实现什么功能。您只需向列表中的每个项目添加 1,这本质上是长度函数,因此您可以简单地使用 len(x)

def maxInt(list):
i = 0
for x in list:
i += 1
return i

x = [1,2,3,4,5]
maxInt(x) == len(x)

要顺序访问列表中的项目,只需循环

继续,我们看到您以一种奇怪的方式循环了该段落单词列表中的每个单词。

简化你的操作,

Passage = sys.stdin.readline()
PassageList = Passage.split(' ')
wordCounter = 0

for x in PassageList:
syns = wordnet.synsets(PassageList[wordCounter])

你本可以轻松做到:

from nltk.corpus import wordnet as wn

passage =sys.stdin.readline()
words = passage.split(' ')
for word in words:
synsets_per_word = wn.synsets(word)

只需使用 len()

检查号码。给定单词的同义词集,而不是

synLength = maxInt(syns)

你可以这样做:

from nltk.corpus import wordnet as wn

passage =sys.stdin.readline()
words = passage.split(' ')
for word in words:
synsets_per_word = wn.synsets(word)
num_synsets_per_word = len(synsets_per_word)

现在到令人不安的地方

行:

PassageList[wordCounter] == syns[0]

考虑到正确的变量命名约定,我们有:

word == synsets_per_word[0]

现在这是令人困惑的部分,左侧是 word ,它是 str 类型。并且您尝试将其与 nltk.corpus.wordnet.Synset 类型的 synsets_per_word[0] 进行比较。

瞧瞧

因此,当比较两个不同类型的变量时,会弹出AttributeError...

更大的问题是您想在这里实现什么目标?我的假设是,您认为 synset 是一个 str 对象,但正如所解释的那样,它是一个 Synset 对象而不是字符串,即使您获得了 lemma_names 来自 Synset,它是一个字符串列表,而不是可以与 str 进行等价比较的 str

那么如何解决这个问题

首先阅读 NLP、Python 以及 WordNet API 在 NLTK 中的功能。

然后重新定义任务,因为对于含糊不清的单词,您不会从 WordNet 获得大量帮助。

关于python - 注意使用 NLTK 和 Wordnet 进行程序不起作用,错误消息显示这是因为 wordnet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50009296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com