68695


# 実現したいこと

文中の動詞を全て過去形にしたいです。  
具体的には以下の入力をして、出力を得るイメージです。

[code]

    As she leaves the kitchen, his voice follows her.
    
    #出力
    As she left the kitchen, his voice followed her.
    
[/code]

# 困っていること

自然言語処理のライブラリを使って、現在形にできることは分かったのですが、過去形にするライブラリや方法がわからず困っています。

# 試したこと

以下の方法で、過去形の動詞を現在形（主語による変形は考慮しない）にできることは、試しました。  
[自然言語処理ライブラリspacy](https://spacy.io/usage/linguistic-
features)のサイトを参考に以下のプログラムを作成しました。

[code]

    text = "As she left the kitchen, his voice followed her."
    doc_dep = nlp(text)
    for i in range(len(doc_dep)):
        token = doc_dep[i]
        #print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_) 
        if token.pos_== 'VERB':
            print(token.text)
            print(token.lemma_)
            text = text.replace(token.text, token.lemma_)
    print(text)
    
    #出力
    'As she leave the kitchen, his voice follow her.'
    
[/code]

# 環境

Python 3.7.0  
spaCy version 2.3.1


CC BY-SA 4.0
2020-07-16T12:41:15.000
68645
2020-07-18T08:40:08.830
2020-07-16T12:51:23.243
3060
question
python python3 自然言語処理
文中の動詞で過去形にする方法について


[pattern.en](https://github.com/clips/pattern)の`conjugate`を使えば任意の時制や人称に変換できます。

### `pattern`の[インストール](https://stackoverflow.com/a/59419254/8248751)

[code]

    git clone -b development https://github.com/clips/pattern
    cd pattern
    python setup.py install
    
[/code]

※Windowsの場合は管理者権限のコンソールで実行してください。

### サンプルコード

[code]

    from pattern.en import tag, conjugate, PAST, PRESENT, SINGULAR
    
    raw = "OK, I see that she saw sea and I'm not sea."
    tags = tag(raw)
    print(tags) #[('OK', 'UH'), (',', ','), ('I', 'PRP'), ('see', 'VBP'), ('that', 'IN'), ('she', 'PRP'), ('saw', 'VBD'), ('sea', 'NN'), ('and', 'CC'), ('I', 'PRP'), ("'m", 'VBP'), ('not', 'RB'), ('sea', 'NN'), ('.', '.')]
    text = ""
    for t in tags:
        s = t[0]
        if t[1] == "VBP":
            s = conjugate(s, tense=PAST)
        #三単現に置換する場合
        #if "VB" in t[1]:
        #    s = conjugate(s, tense=PRESENT, person=3, number=SINGULAR)
        if not(s in ',.'):
            s = ' ' + s
        text += s
    
    print(text.strip()) # OK, I saw that she saw sea and I was not sea.
    #三単現に置換した場合 OK, I sees that she sees sea and I is not sea.
    
[/code]

### サンプルコード(spaCyと併用する場合)

[code]

    import spacy
    from pattern.en import conjugate, PAST
    
    nlp = spacy.load('en')
    text = "OK, I see that she saw sea and I'm not sea."
    doc_dep = nlp(text)
    for i in range(len(doc_dep)):
        token = doc_dep[i]
        if token.pos_== 'VERB':
            text = text.replace(token.text, conjugate(token.text, tense=PAST))
    
    print(text) # OK, I saw that she saw sea and I'm not sea. (※"I'm"が置換されていない)
    
[/code]

### 補足

`conjugate`の引数は[本家SOの類似回答](https://stackoverflow.com/a/42878967/8248751)が詳しいです。  
なおPyPIに入っている`pattern`や`pattern3`はメンテナンスが[滞っているよう](https://stackoverflow.com/a/49139945/8248751)で、手元のPython
3.7.2 で`pip install`してもエラーになりました。


CC BY-SA 4.0
2020-07-18T08:40:08.830
68695
2020-07-18T08:40:08.830
9820
68645
answer