Пропуск кортежей без атрибутов Python NLTK - PullRequest
0 голосов
/ 06 мая 2020

У меня есть сценарий, который в основном работает с набором инструментов для естественного языка. Он работает с использованием NLTK для токенизации и маркировки (категоризации) отдельных слов.

Когда мой список включает имена и сущности, он работает нормально.

Это происходит в том случае, если в список входят речевые статьи, такие как «The», «a» и «et» c.

Это слова, которые не собираются получать метки от NLTK (Persons, Organization, Geographi c Location et c ..)

Мой вопрос, есть ли способ пропустить кортежи, которые будут давать мне ошибку, потому что они не вернут атрибут label?

Пример фрейма данных:

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» вызывает ошибку sh потому что «to» будет не получить ярлык. Если я имею дело с тысячами слов, было бы непрактично найти все слова, которые заставили бы его взломать sh, и удалить их вручную. В идеале я бы хотел пропустить проблемные c строк, но я не уверен, возможно ли это.

Спасибо за помощь.

1 Ответ

0 голосов
/ 06 мая 2020

Первое предложение - удалить стоп-слова (to, the, a, et c). Пример кода:

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))

Вы также можете пропустить часть удаления стоп-слов, но в целом это так. лучше всегда удалять стоп-слова. Надеюсь, это поможет.

...