Skip to main content
 首页 » 编程设计

python之用python NLTK转换否定句中的语句

2025年05月04日14hnrainll

关于过去发生的事件,我有成千上万的句子。例如

sentence1 = 'The Knights Templar are founded to protect Christian pilgrims in Jerusalem.' 
sentence2 = 'Alfonso VI of Castile captures the Moorish Muslim city of Toledo, Spain.' 
sentence3 = 'The Hindu Medang kingdom flourishes and declines.' 

我想将它们转化为以下形式的问题:

question1 = 'When were the Knights Templar founded to protect Christian pilgrims in Jerusalem?' 
question2 = 'When did Alfonso VI of Castile capture the Moorish Muslim city of Toledo, Spain?' 
question3 = 'When did the Hindu Medang kingdom flourish and decline?' 

我意识到这是一个复杂的问题,我对 80% 的成功率感到满意。

据我在网络上的搜索了解,NTLK 是解决此类问题的方法。 我开始尝试一些东西,但这是我第一次使用这个库,我不能再进一步了:

import nltk 
question = 'The Knights Templar are founded to protect Christian pilgrims in Jerusalem.' 
tokens = nltk.word_tokenize(question) 
tagged = nltk.pos_tag(tokens) 

这听起来应该是很多人都遇到过并解决过的问题。 有什么建议吗?

请您参考如下方法:

NLTK 绝对是在这里使用的正确工具。但是分词器和后置标注器输出的质量取决于你的语料库和句子类型。此外,通常没有真正开箱即用的解决方案(afaik),它需要一些调整。如果你没有太多时间投入到这上面,我怀疑你的成功率连80%都达不到。

话虽如此;这是一个基于列表插入的基本示例,可以帮助您捕获并成功转换您的一些句子。

import nltk 
 
question_one = 'The Knights Templar are founded to protect Christian     pilgrims in Jerusalem.' 
question_two = 'Alfonso VI of Castile captures the Moorish Muslim city of Toledo, Spain.' 
 
def modify(inputStr): 
 
    tokens = nltk.PunktWordTokenizer().tokenize(inputStr) 
    tagged = nltk.pos_tag(tokens) 
    auxiliary_verbs = [i for i, w in enumerate(tagged) if w[1] == 'VBP'] 
    if auxiliary_verbs: 
        tagged.insert(0, tagged.pop(auxiliary_verbs[0])) 
    else: 
        tagged.insert(0, ('did', 'VBD')) 
    tagged.insert(0, ('When', 'WRB')) 
 
    return ' '.join([t[0] for t in tagged]) 
 
question_one = modify(question_one) 
question_two = modify(question_two) 
 
print(question_one) 
print(question_two) 

输出:

When are The Knights Templar founded to protect Christian pilgrims in Jerusalem. 
When did Alfonso VI of Castile captures the Moorish Muslim city of Toledo , Spain. 

如您所见,您仍然需要修复正确的大小写('The' 仍然是大写),'captures' 现在的时态错误,您将需要扩展 auxiliary_verbs 类型(可能是单独的 'VBP'太有限了)。但这是一个开始。希望这对您有所帮助!