Python Porter Stemmer算法未返回预期输出?当修改为def时
我在用电话 波特词干算法(或“波特词干分析器”)是一种从英语单词中去除常见词形和屈折词尾的过程。它的主要用途是作为术语规范化过程的一部分,通常在建立信息检索系统时进行 以下是 你需要做的另一件事是把每个单词缩成词干。例如,单词Python Porter Stemmer算法未返回预期输出?当修改为def时,python,algorithm,preprocessor,artificial-intelligence,normalization,Python,Algorithm,Preprocessor,Artificial Intelligence,Normalization,我在用电话 波特词干算法(或“波特词干分析器”)是一种从英语单词中去除常见词形和屈折词尾的过程。它的主要用途是作为术语规范化过程的一部分,通常在建立信息检索系统时进行 以下是 你需要做的另一件事是把每个单词缩成词干。例如,单词唱,唱,唱 它们都有相同的茎,即sing。有一种被合理接受的方法,叫做波特法 算法。您可以从下载执行它的内容 我已经修改了代码 if __name__ == '__main__': p = PorterStemmer() if len(sys.argv) &
唱
,唱
,唱
它们都有相同的茎,即sing
。有一种被合理接受的方法,叫做波特法
算法。您可以从下载执行它的内容
我已经修改了代码
if __name__ == '__main__':
p = PorterStemmer()
if len(sys.argv) > 1:
for f in sys.argv[1:]:
infile = open(f, 'r')
while 1:
output = ''
word = ''
line = infile.readline()
if line == '':
break
for c in line:
if c.isalpha():
word += c.lower()
else:
if word:
output += p.stem(word, 0,len(word)-1)
word = ''
output += c.lower()
print output,
infile.close()
从预处理字符串中读取输入
而不是文件并返回输出
def algorithm(input):
p = PorterStemmer()
while 1:
output = ''
word = ''
if input == '':
break
for c in input:
if c.isalpha():
word += c.lower()
else:
if word:
output += p.stem(word, 0,len(word)-1)
word = ''
output += c.lower()
return output
注意:如果我将我的返回输出
放置在与相同的缩进上,而1:
则会变成一个无限循环
用法(示例)
输出
迈克尔是
预期产出
迈克尔正在唱歌
我做错了什么?因此,罪魁祸首似乎是它当前没有将输入的最后一部分写入到
输出中(例如,尝试“Michael正在唱歌”,它应该正确地写入所有内容并省略“stuff”)。可能有一种更优雅的方法来处理这个问题,但您可以尝试的一件事是在for
循环中添加else
子句。由于问题在于,输出中没有包含最后一个单词
,我们可以使用else
确保在完成for
循环后添加最后一个单词:
def algorithm(input):
print input
p = PorterStemmer()
while 1:
output = ''
word = ''
if input == '':
break
for c in input:
if c.isalpha():
word += c.lower()
elif word:
output += p.stem(word, 0,len(word)-1)
word = ''
output += c.lower()
else:
output += p.stem(word, 0, len(word)-1)
print output
return output
这已经用两个测试用例进行了广泛的测试,所以很明显它是防弹的:)可能有一些边缘用例在那里爬行,但希望它能让你开始。所以看起来罪魁祸首是它目前没有将输入的最后部分写入输出
(试试“Michael正在唱歌的东西”例如,它应该正确地写出所有内容并省略“stuff”)。可能有一种更优雅的方法来处理这个问题,但您可以尝试的一件事是在for
循环中添加else
子句。由于问题在于,输出中没有包含最后一个单词
,我们可以使用else
确保在完成for
循环后添加最后一个单词:
def algorithm(input):
print input
p = PorterStemmer()
while 1:
output = ''
word = ''
if input == '':
break
for c in input:
if c.isalpha():
word += c.lower()
elif word:
output += p.stem(word, 0,len(word)-1)
word = ''
output += c.lower()
else:
output += p.stem(word, 0, len(word)-1)
print output
return output
这已经用两个测试用例进行了广泛的测试,所以很明显它是防弹的:)可能有一些边缘用例在那里爬行,但希望它能让您开始。@Killrawr无问题-很高兴它有帮助!如果出现任何奇怪的情况,请告诉我,我会看看是否可以帮助排除故障。嗯,我确实确定问题出在哪里,但有些单词的工作方式不同于目的
变成目的
而非目的
。如果你能解决这个问题,我将不胜感激!是的,我注意到了同样的事情,但我认为这实际上与算法的端口有关(代码在命名约定中有点不清楚)。你也可以尝试跳舞,同样的事情也会发生。我说端口有问题,因为我确信实际的算法已经正确地处理了这个问题(我还根据算法的原始代码测试了这个问题,同样的事情也发生了)。我会看看是否能找到一个快速的解决方法。实际上,我认为我们刚刚偶然发现了一些已知的算法不正确的情况。有关更复杂的解释,请参见上的常见错误
部分。简言之,我认为所有的词干分析器在尝试机械词干时都会有一些错误。这里有一个讨论构建已知错误列表的线程-也许它可以作为某种类型的映射?在和另一个学生谈话时,他们说,这其实并不重要,因为这只是让wingrep这样的词变得通用而已。谢谢RocketDonkey@Killrawr没问题-很高兴它有帮助!如果出现任何奇怪的情况,请告诉我,我会看看是否可以帮助排除故障。嗯,我确实确定问题出在哪里,但有些单词的工作方式不同于目的
变成目的
而非目的
。如果你能解决这个问题,我将不胜感激!是的,我注意到了同样的事情,但我认为这实际上与算法的端口有关(代码在命名约定中有点不清楚)。你也可以尝试跳舞,同样的事情也会发生。我说端口有问题,因为我确信实际的算法已经正确地处理了这个问题(我还根据算法的原始代码测试了这个问题,同样的事情也发生了)。我会看看是否能找到一个快速的解决方法。实际上,我认为我们刚刚偶然发现了一些已知的算法不正确的情况。有关更复杂的解释,请参见上的常见错误
部分。简言之,我认为所有的词干分析器在尝试机械词干时都会有一些错误。这里有一个讨论构建已知错误列表的线程-也许它可以作为某种类型的映射?在和另一个学生谈话时,他们说,这其实并不重要,因为这只是让wingrep这样的词变得通用而已。谢谢RocketDonkey