1

Pythonポートを使用していますPorterStemmer

ポーターステミングアルゴリズム(または「ポーターステマー」)は、英語の単語から一般的な形態学的および非屈曲的な語尾を削除するためのプロセスです。その主な用途は、情報検索システムをセットアップするときに通常行われる用語正規化プロセスの一部としてです。

以下について..

あなたがする必要がある他のことは、各単語をその語幹に減らすことです。たとえば、単語、、singsingsすべて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

に変わる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」を省略する必要があります)。これを処理するためのより洗練された方法がある可能性がありますが、試すことができる1つのことは、ループelseに句を追加することです。for問題は、最後の単語がに含まれていないことであるため、ループの完了時に最後の単語が追加されることを確認するためにoutput使用できます。elsefor

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

これは2つのテストケースで広範囲にテストされているので、明らかに防弾です:)おそらくいくつかのエッジケースがそこを這い回っていますが、うまくいけば、それはあなたが始めるのに役立つでしょう。

于 2012-10-02T03:41:19.773 に答える