1

我正在使用Python 端口PorterStemmer

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

对于以下..

您需要做的另一件事是将每个单词简化为词干。例如,单词sing, sings,singing 都有相同的词干,即sing。有一种合理接受的方法可以做到这一点,称为波特算法。你可以从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

请注意,如果我将 my放置return output在相同的缩进上,因为while 1:它变成了infinite loop.

用法(示例)

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

输出

迈克尔是

预期产出

迈克尔在唱歌

我究竟做错了什么?

4

1 回答 1

1

所以看起来罪魁祸首是它当前没有将输入的最后部分写入output(例如,尝试“Michael is Singing stuff” - 它应该正确写入所有内容并省略“stuff”)。可能有一种更优雅的方法来处理这个问题,但您可以尝试的一件事是在循环中添加一个else子句。for由于问题是最终单词未包含在 中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

这已经用两个测试用例进行了广泛的测试,所以很明显它是防弹的 :) 那里可能有一些边缘情况,但希望它能让你开始。

于 2012-10-02T03:41:19.773 回答