【问题标题】:Porter Stemmer Algorithm Not returning the expected output? when modified into defPorter Stemmer 算法没有返回预期的输出?当修改成def
【发布时间】:2012-09-22 22:21:01
【问题描述】:

我正在使用PorterStemmer Python Port

Porter 词干算法(或“Porter stemmer”)是一种用于从英语单词中去除常见形态和屈折词尾的过程。它的主要用途是作为通常在设置信息检索系统时完成的术语规范化过程的一部分。

以下..

您需要做的另一件事是将每个单词简化为词干。例如,singsingssinging 都有相同的词干,即sing。有一种合理接受的方法可以做到这一点,称为 Porter's 算法。你可以从http://tartarus.org/martin/PorterStemmer/下载一些执行它的东西。

我已经修改了代码..

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()

input 读取而不是从预处理字符串读取文件并返回输出。

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

请注意,如果我将return output 定位到与while 1: 相同的缩进上,它会变成infinite loop

用法(示例)

import PorterStemmer as ps
ps.algorithm("Michael is Singing");

输出

迈克尔是

预期输出

迈克尔在唱歌

我做错了什么?

【问题讨论】:

    标签: python algorithm preprocessor artificial-intelligence normalization


    【解决方案1】:

    所以看起来罪魁祸首是它当前没有将输入的最后部分写入output(例如,尝试“Michael is Singing stuff” - 它应该正确写入所有内容并省略“stuff”) .可能有一种更优雅的方法来处理这个问题,但您可以尝试的一件事是在for 循环中添加一个else 子句。由于问题是最后一个词没有包含在output 中,我们可以使用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 没有问题 - 很高兴它有帮助!如果有什么奇怪的东西弹出,请告诉我,我会看看我是否可以帮助解决问题。
    • 嗯,我真的很确定问题出在哪里,但有些词不起作用,例如 purposes 变为 purpos 而不是 purpose。如果你能解决这个问题,我将不胜感激!
    • 是的,我注意到了同样的事情,但我认为它实际上与算法的端口有关(代码在其命名约定中有些不清楚)。你也可以尝试dancing 之类的东西,同样的事情也会发生。我说端口有问题,因为我确定实际算法已经正确处理了这个问题(我还针对算法中的原始代码对此进行了测试,并且发生了同样的事情)。我看看能不能快速解决。
    • 我实际上认为我们刚刚偶然发现了一些算法不正确的已知案例。您可以查看tartarus.org/martin/PorterStemmer 上的Common Errors 部分以获得更复杂的解释。简而言之,我认为所有词干分析器在尝试机械词干时都会出现一些错误。这是一个讨论构建已知错误列表的线程 - 也许它可以用作某种地图? lucene.472066.n3.nabble.com/…
    • 正在和另一个学生交谈,他们说,这并不重要,因为它只是使这些词对诸如wingrep之类的东西具有通用性。谢谢火箭驴
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多