Как извлечь название места, название страны, название города, туристические места, используя nlp или spacy в python - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь извлечь название места, название страны, название города, туристические места из txt файла с помощью библиотеки nlp или scapy в python.

Я пробовал ниже:

import spacy
en = spacy.load('en')

sents = en(open('subtitle.txt').read())
place = [ee for ee in sents.ents]

Получение результата:

[1, 
, three, London, 
, 
, 
, 
, first, 
, 
, 00:00:20,520, 
, 
, London, the

4
00:00:20,520, 00:00:26,130
, Buckingham Palace, 
, 

Я просто хочу только название места, название страны, название города и любое место в городе.

Я также попытался с помощью NLP:

import nltk
nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')

with open('subtitle.txt', 'r') as f:
    sample = f.read()


sentences = nltk.sent_tokenize(sample)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
chunked_sentences = nltk.ne_chunk_sents(tagged_sentences, binary=True)

def extract_entity_names(t):
    entity_names = []

    if hasattr(t, 'label') and t.label:
        if t.label() == 'NE':
            entity_names.append(' '.join([child[0] for child in t]))
        else:
            for child in t:
                entity_names.extend(extract_entity_names(child))

    return entity_names

entity_names = []
for tree in chunked_sentences:
    # Print results per sentence
    #print (extract_entity_names(tree))

    entity_names.extend(extract_entity_names(tree))

# Print all entity names
#print (entity_names)

# Print unique entity names
print (set(entity_names))

Вывод:

{'Okay', 'Buckingham Palace', 'Darwin Brasserie', 'PDF', 'London', 'Local Guide', 'Big Ben'}

Здесь также можно получить нежелательные слова, такие как «Хорошо», «PDF», «Местный гид »и некоторые места отсутствуют.

Пожалуйста, предложите.

Редактировать-1

Сценарий

import spacy
nlp = spacy.load('en_core_web_lg')

gpe = [] # countries, cities, states
loc = [] # non gpe locations, mountain ranges, bodies of water


doc = nlp(open('subtitle.txt').read())
for ent in doc.ents:
    if (ent.label_ == 'GPE'):
        gpe.append(ent.text)
    elif (ent.label_ == 'LOC'):
        loc.append(ent.text)

cities = []
countries = []
other_places = []
import wikipedia
for text in gpe:
    summary = str(wikipedia.summary(text))
    if ('city' in summary):
        cities.append(text)
        print (cities)
    elif ('country' in summary):
        countries.append(text)
        print (countries)
    else:
        other_places.append(text)
        print (other_places)

for text in loc:
    other_places.append(text)
    print (other_places)

Используя ответный сценарий: становится ниже выхода

['London', 'London']
['London', 'London', 'London']
['London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']

1 Ответ

0 голосов
/ 07 октября 2018

Вы ищете Именованные объекты.spaCy - это эффективная библиотека для поиска именованных объектов в тексте, но вы должны использовать ее в соответствии с документацией.

Вы ищете местоположения, страны и города.Эти места попадают в категории GPE и LOC в теге spaCy NER.В частности, GPE предназначен для стран, городов и штатов, а LOC предназначен для местоположений, не относящихся к GPE, гор, водоемов и т. Д.

Если вам просто нужны эти имена в списке, вы можете использовать тег NER и посмотретьтолько для этих тегов.Если вам нужно отделить города от стран, например, вы можете выполнить запрос в Википедии и проверить сводку, чтобы выяснить, является ли это город или страна.Для этого вам может пригодиться библиотека википедии для python.

Пример кода:

import spacy
nlp = spacy.load('en_core_web_lg')

gpe = [] # countries, cities, states
loc = [] # non gpe locations, mountain ranges, bodies of water


doc = nlp(open('subtitle.txt').read())
for ent in doc.ents:
    if (ent.label_ == 'GPE'):
        gpe.append(ent.text)
    elif (ent.label_ == 'LOC'):
        loc.append(ent.text)

cities = []
countries = []
other_places = []
import wikipedia
for text in gpe:
    summary = str(wikipedia.summary(text))
    if ('city' in summary):
        cities.append(text)
    elif ('country' in summary):
        countries.append(text)
    else:
        other_places.append(text)

for text in loc:
    other_places.append(text)

Если вы находите метод википедии недостаточным или медленным, вы также можете попробовать обучить тегер NER с помощьюсобственные теги NER.Для этого взгляните здесь .

...