从lis中提取键和值

2024-04-19 23:46:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串:

fmt_string="I am a non-smoker female with a sum assured amount of 
1000000 and a policy term for 20 years"

在此之后,我删除了停止语

from nltk.corpus import stopwords
stop = set(stopwords.words('english'))
d = [i for i in fmt_string.lower().split() if i not in stop]

现在我希望我的输出为:

{'gender': 'female', 'Sum assured amount': '1000000', 'smoke': 'non-
 smoker', 'Policy term': '20'}

为了达到同样的效果,我运行了以下代码:

print {'smoke':d[0], 'gender':d[1], 'Sum assured amount': d[5], 
'Policy term': d[8]}

但在下面的代码中,我硬编码我的代码,并给出用于提取值的位置值。 有没有一种可能的方法,我不需要给出值在我的列表中的确切位置,并使代码更一般化。你知道吗


Tags: 代码inforstringgenderamountfemalestop
3条回答

简而言之:问题的解决方案在nltk book的前七章中有描述。你知道吗

换句话说,对于一个刚开始的程序员来说,你所要求的太难了(对于这个网站来说,这个问题太宽泛了)。你需要全通径的信息提取,而不是“从列表中提取键和值”。基本上,你需要为你感兴趣的每个属性(为此你需要一个带注释的语料库)训练一个自定义分类器,除此之外还有其他一些事情。是的,一些答案会建议你把他们考虑过的三个虚构的例子结合起来,但是他们不太可能对真实数据做任何有用的事情。你知道吗

我建议你至少暂时把这个项目搁置一边。然后学习一个好的Python教程,然后学习nltk书籍。(尽管他们的用意很好,nltk的书并不是最好的语言入门。)

可能是这样的

from nltk.tokenize import word_tokenize
fmt = "I am a non-smoker female with a sum assured amount of 1000000 and a policy term for 20 years"
wt = word_tokenize(fmt)

现在是词性标注

nltk.pos_tag(wt)
[('I', 'PRP'), ('am', 'VBP'), ('a', 'DT'), ('non-smoker', 'JJ'), ('female', 'NN'), ('with', 'IN'), ('a', 'DT'), ('sum', 'NN'), ('assured', 'JJ'), ('amount', 'NN'), ('of', 'IN'), ('1000000', 'CD'), ('and', 'CC'), ('a', 'DT'), ('policy', 'NN'), ('term', 'NN'), ('for', 'IN'), ('20', 'CD'), ('years', 'NNS')]

然后你可以使用列表理解来搜索你想要的东西

p1 = nltk.pos_tag(wt)
[i for i, v in enumerate(p1) if v[1] == 'NN']
[4, 7, 9, 14, 15]
[i for i, v in enumerate(p1) if v[1] == 'CD']
[11, 17]

我想你会有不同的句子

CD: numeral
JJ: adjective

你只有两个数字,JJ代表非-吸烟者。现在你想打印什么就打印什么。你知道吗

这段代码将适用于这个,句子,你必须玩关键字,你还需要设置一些条件来检查金额和年份是否是整数,如果不是去附近的整数。只是这是一种方式

def compare(s1,s2):
        slen = len(s1)
        y=0
        while y<slen:
            if s1[y] in words:
                key=words.index(s1[y])
                return key;
            else:
                key=-1
            y+=1

    fmt_string="I am a non-smoker female with a sum assured amount of 1000000 and a policy term for 20 years"
    words = fmt_string.split()
    length=len(words)
    x=0
    gen=["male","female"];
    yrs = ["years","year","annum","per annum"];
    value=["amount","rupees"]
    ske = ["smoke","smoker","non-smoker"]
    gen_value = compare(gen,words)
    yrs_value = compare(yrs,words)
    vlue_value = compare(value,words)
    ske_value = compare(ske,words)
    yrs_value= yrs_value-1;
    amount_value = vlue_value + 2;

    print {'smoke':words[ske_value], 'gender':words[gen_value], 'Sum assured amount': words[amount_value], 'Policy term': words[yrs_value]}

希望你能玩关键字。。!你知道吗

相关问题 更多 >