Я воспроизвел ваш пример, и похоже, что вы получите пустые списки для article_terrorist_groups
и terrorist_common
. Следовательно, вы не получите выход (который я предполагаю), который вам требуется. Я изменил модель (для моей машины) на en_core_web_sm
и заметил, что ent.label
отличается от тех, которые вы указываете в операторе if
в своем списке. Я почти уверен, что в этом случае вы используете spacy.load('en')
или spacy.load('en_core_web_sm')
.
Вы используете if ent.label_=='PERSON' or ent.label_ =='ORG'
, что приводит к пустым спискам. Вы должны будете изменить это, чтобы это работало. По сути, в вашем понимании списка для article_terrorist_groups
и terrorist_common
, for l oop пытается перебрать пустой список.
Если вы посмотрите на вывод, который я опубликовал, вы увидите, что ent.label
не 'PERSON'
или 'ORG'
Примечание. Я бы рекомендовал добавить операторы печати (или использовать отладчик) в вашем коде время от времени проверять.
Мой код
import spacy
from collections import defaultdict, Counter
nlp = spacy.load('en_core_web_sm') # I changed this
def read_file_to_list(file_name):
with open(file_name, 'r') as file:
return file.readlines()
terrorism_articles = read_file_to_list('rand-terrorism-dataset.txt')
terrorism_articles_nlp = [nlp(art) for art in terrorism_articles]
common_terrorist_groups = [
'taliban',
'al - qaeda',
'hamas',
'fatah',
'plo',
'bilad al - rafidayn'
]
common_locations = [
'iraq',
'baghdad',
'kirkuk',
'mosul',
'afghanistan',
'kabul',
'basra',
'palestine',
'gaza',
'israel',
'istanbul',
'beirut',
'pakistan'
]
location_entity_dict = defaultdict(Counter)
for article in terrorism_articles_nlp:
print([(ent.lemma_, ent.label) for ent in article.ents])
Вывод
[('CHILE', 383), ('the Santiago Binational Center', 383), ('21,000', 394)]
[('ISRAEL', 384), ('palestinian', 381), ('five', 397), ('Masada', 384)]
[('GUATEMALA', 383), ('U.S. Marines', 381), ('Guatemala City', 384)]
усеченный вывод в интересах длины этого ответа