我有一个主要用于自然语言工具包的脚本。它的工作原理是使用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 "不会得到一个标签。如果我处理的是成千上万的单词,那么找到所有会导致崩溃的单词并手动删除它们是不切实际的。理想情况下,我希望跳过有问题的行,但我不确定这是否可能。
谢谢你的帮助。
第一个建议是删除停顿词(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))
你也可以跳过去掉停顿词的部分,但一般情况下,最好总是去掉停顿词。希望对你有所帮助。