如何在NLTK词性(POS)标记中仅获取所选标记的单词?

时间:2016-09-14 05:34:25

标签: python list pandas tuples nltk

对不起,我是Pandas和NLTK的新手。我正在尝试构建一组自定义返回的POS。我的数据内容:

        comment
0       [(have, VERB), (you, PRON), (pahae, VERB)]
1       [(radio, NOUN), (television, NOUN), (lid, NOUN)]
2       [(yes, ADV), (you're, ADJ)]
3       [(ooi, ADJ), (work, NOUN), (barisan, ADJ)]
4       [(national, ADJ), (debt, NOUN), (increased, VERB)]

知道如何才能获得与所选标记(VERBNOUN)匹配的字词,如下所示?如果没有匹配,则返回NaN

        comment
0       [(have), (pahae)]
1       [(radio), (television), (lid)]
2       [NaN]
3       [(work)]
4       [(debt), (increased)]

2 个答案:

答案 0 :(得分:1)

您可以使用list comprehension,然后将空list替换为[NaN]

df = pd.DataFrame({'comment': [
        [('have', 'VERB'), ('you', 'PRON'), ('pahae', 'VERB')],
        [('radio', 'NOUN'), ('television', 'NOUN'), ('lid', 'NOUN')],
        [('yes', 'ADV'), ("you're", 'ADJ')],
        [('ooi', 'ADJ'), ('work', 'NOUN'), ('barisan', 'ADJ')],
        [('national', 'ADJ'), ('debt', 'NOUN'), ('increased', 'VERB')]
    ]})

print (df)    
                                             comment
0         [(have, VERB), (you, PRON), (pahae, VERB)]
1   [(radio, NOUN), (television, NOUN), (lid, NOUN)]
2                        [(yes, ADV), (you're, ADJ)]
3         [(ooi, ADJ), (work, NOUN), (barisan, ADJ)]
4  [(national, ADJ), (debt, NOUN), (increased, VE...
df.comment = df.comment.apply(lambda x: [(t[0],) for t in x if t[1]=='VERB' or t[1]=='NOUN'])
df.ix[df.comment.apply(len) == 0, 'comment'] = [[np.nan]]
print (df)
                             comment
0                [(have,), (pahae,)]
1  [(radio,), (television,), (lid,)]
2                              [nan]
3                          [(work,)]
4            [(debt,), (increased,)]

答案 1 :(得分:1)

设置参考

s = pd.Series([
        [('have', 'VERB'), ('you', 'PRON'), ('pahae', 'VERB')],
        [('radio', 'NOUN'), ('television', 'NOUN'), ('lid', 'NOUN')],
        [('yes', 'ADV'), ("you're", 'ADJ')],
        [('ooi', 'ADJ'), ('work', 'NOUN'), ('barisan', 'ADJ')],
        [('national', 'ADJ'), ('debt', 'NOUN'), ('increased', 'VERB')]
    ], name='comment')

s

0           [(have, VERB), (you, PRON), (pahae, VERB)]
1     [(radio, NOUN), (television, NOUN), (lid, NOUN)]
2                          [(yes, ADV), (you're, ADJ)]
3           [(ooi, ADJ), (work, NOUN), (barisan, ADJ)]
4    [(national, ADJ), (debt, NOUN), (increased, VE...
Name: comment, dtype: object

解决方案

s1 = s.apply(pd.Series).stack().apply(pd.Series)
s2 = s1.loc[s1[1].isin(['VERB', 'NOUN']), 0]
s3 = s2.groupby(level=0).apply(zip).reindex_like(s)
s3.loc[s3.isnull()] = [[np.nan]]
s3

0                  [(have,), (pahae,)]
1    [(radio,), (television,), (lid,)]
2                                [nan]
3                            [(work,)]
4              [(debt,), (increased,)]
Name: 0, dtype: object

对于Python 3
按@jezrael

s1 = s.apply(pd.Series).stack().apply(pd.Series)
s2 = s1.loc[s1[1].isin(['VERB', 'NOUN']), 0]
s3 = s2.groupby(level=0).apply(lambda x: list(zip(x))).reindex_like(s)
s3.loc[s3.isnull()] = [[np.nan]]
s3