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