- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 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代码的一些约定。通常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(' ')
接下来,您可以使用 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)
检查号码。给定单词的同义词集,而不是
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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!