我正在尝试使用函数在python中做简单的'NLP'。
由于某种原因,每当我运行代码时,第一个字符串都可以正常工作,但是每当我运行第二个字符串时,我都会收到一条错误消息(“列表索引超出范围”)。
def sentence_to_words(s):
s=s.lower()
s=s.split(" ")
lst=["$", "#", "%", "!", "?", ".", ","]
for i in range(len(s)):
s[i]=list(s[i])
while s[i][0] in lst:
del s[i][0]
while s[i][-1]in lst:
del s[i][-1]
s[i]=''.join(s[i])
return (s)
print sentence_to_words("Will this work?")
print sentence_to_words("Mr. Stark ... I don't feel so good")
两者的最终结果应为:
['will' , 'this' , 'work']
["mr" , "stark" , "i" , "don't" , "feel" , "so" , "good"]
但是第二个实际上并没有运行,而是收到一条错误消息。
答案 0 :(得分:1)
两个while
循环中都有一个错误,乍一看并不清楚。
您要在第一个输入中删除s[i]
的索引:0,而...
在第二个输入中。
s[i]
列表在这种情况下为:['.', '.', '.']
。
因此,您的第一个while
将呼叫3次,并将s[i]
列表设为空白。然后,您尝试在第二个while条件中访问它的索引-1。现在猜怎么着?由于列表为空,因此不再有-1
索引。您唯一要做的就是向第二个while
添加另一个条件,以防止在空数组中这样做。这是您的代码:
def sentence_to_words(s):
s=s.lower()
s=s.split(" ")
lst=["$", "#", "%", "!", "?", ".", ","]
for i in range(len(s)):
s[i]=list(s[i])
while s[i][0] in lst:
del s[i][0]
if not s[i]:
break
while s[i] and s[i][-1]in lst:
del s[i][-1]
s[i]=''.join(s[i])
return (s)
print statement_to_words(“这行得通吗?”)
打印statement_to_words(“史塔克先生……我不太舒服”)
有2个变化。每次在第一个while
的结尾处,我们都会检查列表是否为空。如果是,我们将打破循环并避免出现第一个错误。
第二个更改位于第二个while
的开头。在这里,我们首先检查s[i]
是否为空。当处于循环状态时,Python会将一个空列表转换为False
。因此,现在我们不会再出现任何错误。
您可以在第一个循环的末尾删除if语句,然后执行与第二个循环相同的操作,我只是将其放在此处以向您显示可以以不同方式解决此问题。
答案 1 :(得分:0)
在第二个示例中,"..."
字符串给您带来了问题。
该字符串中的所有字符都在要删除的字符列表中。
这意味着在第一个while
中,所有字符都会被删除,但是当您尝试访问其“第一个”字符时,由于它为空而遇到了错误!
一种快速解决方案是仅添加一个附加条件:s[i]
,这意味着当字符串为空时,while循环将继续进行。
最后,您必须处理此结束字符串,因为您不能只将其留在输出中。
理想情况下,您应该将其从s
列表中删除,但是由于要遍历s
列表,因此无法使用。
相反,更有意义的是生成一个新的output
列表,将“解析的”单词发送到该列表。
这就是代码中的内容:
def sentence_to_words(s):
s = s.lower()
s = s.split(" ")
lst = ["$", "#", "%", "!", "?", ".", ","]
output = []
for i in range(len(s)):
s[i] = list(s[i])
while s[i] and s[i][0] in lst:
del s[i][0]
while s[i] and s[i][-1] in lst:
del s[i][-1]
if s[i]:
output.append(''.join(s[i]))
return output
print sentence_to_words("Will this work?")
print sentence_to_words("Mr. Stark ... I don't feel so good")
现在它可以按预期运行:
>>> sentence_to_words("Will this work?")
['will', 'this', 'work']
>>> sentence_to_words("Mr. Stark ... I don't feel so good")
['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']
答案 2 :(得分:-2)
尝试一下
def sentence_to_words(s):
mylist = []
s = s.lower()
s = s.split(' ')
for i in s:
mylist.append(''.join(ch for ch in i if ch.isalnum()))
return list(filter(None, mylist))