从列表中提取键和值

时间:2017-07-03 09:15:35

标签: python nlp nltk

我有一个字符串:

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]}

但是在下面的代码中,我正在编写代码并为提取值提供位置值。 有没有可能的方法,我不需要在列表中给出值的确切位置,并使代码更通用化。

3 个答案:

答案 0 :(得分:2)

此代码适用于此句,句子,您必须使用关键字进行游戏,您还需要设置一些条件来检查金额和年份是否为整数,如果不是附近的整数。这是一种方式

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]}

希望你能玩弄关键词..!

答案 1 :(得分:1)

简短回答:问题的解决方案在nltk book的前七章中有所描述。

换句话说,对于一个初级程序员来说,你要求的东西太难了(这个网站的问题太广泛了)。您需要全口径信息提取,而不是“从列表中提取密钥和值”。基本上你需要为你感兴趣的每个属性训练一个自定义分类器(你需要一个带注释的语料库),还有更多的东西。是的,一些答案会建议你们共同破解一些可以用于他们考虑的三个实例的例子,但他们不太可能对真实数据做任何有用的事情。

我建议你把这个项目放在一边,暂时至少。然后研究一个很好的Python教程,然后然后 nltk书。 (尽管他们的意图很好,但nltk书并不是该语言的最佳介绍。)

答案 2 :(得分:0)

可能是这样的

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代表nonsmoker.Now很容易打印出你想要的东西。