TransWikia.com

文中の動詞で過去形にする方法について

スタック・オーバーフロー Asked on September 1, 2021

実現したいこと

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

As she leaves the kitchen, his voice follows her.

#出力
As she left the kitchen, his voice followed her.

困っていること

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

試したこと

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

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.'

環境

Python 3.7.0
spaCy version 2.3.1

One Answer

pattern.enconjugateを使えば任意の時制や人称に変換できます。

patternインストール

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

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

サンプルコード

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.

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

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"が置換されていない)

補足

conjugateの引数は本家SOの類似回答が詳しいです。
なおPyPIに入っているpatternpattern3はメンテナンスが滞っているようで、手元のPython 3.7.2 でpip installしてもエラーになりました。

Correct answer by payaneco on September 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP