跳过没有属性的元组 Python NLTK

问题描述 投票:0回答:1

我有一个主要用于自然语言工具包的脚本。它的工作原理是使用NLTK对单个单词进行标记和标签(分类)。

当我的列表包括名称和实体时,它可以正常工作。

但如果列表中包含 "The"、"a"、"and "等语词,则会出现问题。

这些词不会从NLTK中接收标签(个人、组织、地理位置等)。

我的问题是,有什么方法可以跳过那些会给我带来错误的元组,因为它们不会返回标签属性?

示例数据框架。

Order   Text    results
0   0   John    
1   1   Paul    
2   2   George  
3   3   Ringo   

(显然不完美,但总比没有好)

代码:

for i in range(len(text)):
    SENT_DETECTOR = nltk.data.load('tokenizers/punkt/english.pickle')
    ne_tree = nltk.ne_chunk(pos_tag(word_tokenize(text[i])))
    df['results'][i] = ne_tree[0].label()
print(df)

输出。

   Order    Text results
0      0    John  PERSON
1      1    Paul  PERSON
2      2  George     GPE
3      3   Ringo     GPE

示例数据框2。

   Order    Text
0      0    John
1      1    Paul
2      2  George
3      3      to

错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-dff2775636f0> in <module>
      2     SENT_DETECTOR = nltk.data.load('tokenizers/punkt/english.pickle')
      3     ne_tree = nltk.ne_chunk(pos_tag(word_tokenize(text[i])))
----> 4     df['results'][i] = ne_tree[0].label()
      5 print(df)

AttributeError: 'tuple' object has no attribute 'label'

"to "导致它崩溃,因为 "to "不会得到一个标签。如果我处理的是成千上万的单词,那么找到所有会导致崩溃的单词并手动删除它们是不切实际的。理想情况下,我希望跳过有问题的行,但我不确定这是否可能。

谢谢你的帮助。

python python-3.x pandas jupyter-notebook nltk
1个回答
0
投票

第一个建议是删除停顿词(to、the、a等)。示例代码是。

from nltk.corpus import stopwords, wordnet    
stop_words = set(stopwords.words('english'))
df['TextRemovedStopWords'] = df['Text']
df.loc[df['Text'].isin(stop_words),'TextRemovedStopWords'] = None

然后你可以使用try和except来处理边缘情况

from nltk.tokenize import word_tokenize
from nltk import pos_tag
import nltk
nltk.download('maxent_ne_chunker')
def get_result(text):
    if text is not None:
        try:
            ne_tree = nltk.ne_chunk(pos_tag(word_tokenize(text)))
            return ne_tree[0]
        except Exception as e: 
            print(e, text)
            return None
    else:
        return None
df['results'] = df['TextRemovedStopWords'].apply(lambda x:get_result(x))

你也可以跳过去掉停顿词的部分,但一般情况下,最好总是去掉停顿词。希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.