2016-03-28 22 views
0

Ich habe ein Dataset, in dem der Titel einer Spalte lautet: "Was ist Ihre Position und Zeitzone?"Extrahieren von Städtenamen aus Text mit Python

Dies hat dazu geführt, dass wir Einträge wie

haben
  1. Dänemark, CET
  2. Lage ist Devon, England, GMT Zeitzone
  3. Australien. Australische Eastern Standardzeit. + 10h UTC.

und sogar

  1. Mein Standort ist Eugene, Oregon die meiste Zeit des Jahres oder in Seoul, Südkorea abhängig von der Schulferien. Meine primäre Zeitzone ist die Pazifik-Zeitzone.
  2. Für den gesamten Mai werde ich in London, Vereinigtes Königreich (GMT + 1) sein. Für den gesamten Juni werde ich entweder in Norwegen (GMT + 2) oder Israel (GMT + 3) mit begrenztem Internetzugang sein. Für den gesamten Juli und August werde ich in London, Vereinigtes Königreich (GMT + 1) sein. Und dann von September 2015 werde ich in Boston, USA (EDT)

Gibt es sein, eine Möglichkeit, die Stadt, das Land und die Zeitzone von diesem zu extrahieren?

Ich dachte daran, ein Array (aus einem Open-Source-Datensatz) mit allen Ländernamen (einschließlich Kurzformen) und auch Städtenamen/Zeitzonen zu erstellen und dann, wenn ein Wort im Datensatz mit einer Stadt/Land übereinstimmt/Zeitzone oder Kurzform füllt es dies in eine neue Spalte im selben Datensatz und zählt sie.

Ist das praktisch?

=========== REPLT BASED ON NLTK ANTWORT ============

gleichen Code wie Alecxe Laufen I

Traceback (most recent call last): 
    File "E:\SBTF\ntlk_test.py", line 19, in <module> 
    tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences] 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\nltk\tag\__init__.py", line 110, in pos_tag 
    tagger = PerceptronTagger() 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\nltk\tag\perceptron.py", line 141, in __init__ 
    self.load(AP_MODEL_LOC) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\nltk\tag\perceptron.py", line 209, in load 
    self.model.weights, self.tagdict, self.classes = load(loc) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\nltk\data.py", line 801, in load 
    opened_resource = _open(resource_url) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\nltk\data.py", line 924, in _open 
    return urlopen(resource_url) 
    File "C:\Python27\ArcGIS10.4\lib\urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Python27\ArcGIS10.4\lib\urllib2.py", line 431, in open 
    response = self._open(req, data) 
    File "C:\Python27\ArcGIS10.4\lib\urllib2.py", line 454, in _open 
    'unknown_open', req) 
    File "C:\Python27\ArcGIS10.4\lib\urllib2.py", line 409, in _call_chain 
    result = func(*args) 
    File "C:\Python27\ArcGIS10.4\lib\urllib2.py", line 1265, in unknown_open 
    raise URLError('unknown url type: %s' % type) 
URLError: <urlopen error unknown url type: c> 

Antwort

4
bekommen

Ich würde verwenden, was Natural Language Processing und nltk anbieten muss, um Entitäten zu extrahieren.

Beispiel (stark basierend auf this gist), das jede Zeile aus einer Datei in Token zerlegt, in Blöcke zerlegt und NE (benannte Entitäten) für jeden Block rekursiv sucht. Weitere Erklärung here:

import nltk 

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 

with open('sample.txt', 'r') as f: 
    for line in f: 
     sentences = nltk.sent_tokenize(line) 
     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) 

     entities = [] 
     for tree in chunked_sentences: 
      entities.extend(extract_entity_names(tree)) 

     print(entities) 

Für die sample.txt enthält:

Denmark, CET 
Location is Devon, England, GMT time zone 
Australia. Australian Eastern Standard Time. +10h UTC. 
My location is Eugene, Oregon for most of the year or in Seoul, South Korea depending on school holidays. My primary time zone is the Pacific time zone. 
For the entire May I will be in London, United Kingdom (GMT+1). For the entire June I will be in either Norway (GMT+2) or Israel (GMT+3) with limited internet access. For the entire July and August I will be in London, United Kingdom (GMT+1). And then from September, 2015, I will be in Boston, United States (EDT) 

Er druckt:

['Denmark', 'CET'] 
['Location', 'Devon', 'England', 'GMT'] 
['Australia', 'Australian Eastern Standard Time'] 
['Eugene', 'Oregon', 'Seoul', 'South Korea', 'Pacific'] 
['London', 'United Kingdom', 'Norway', 'Israel', 'London', 'United Kingdom', 'Boston', 'United States', 'EDT'] 

Der Ausgang ist nicht ideal, aber vielleicht ein guter Start für Sie sein.

+2

Wie funktioniert das? scheint wie Zauberei – Keatinge

+2

@Racialz 'nltk' ist oft überraschend! Ich bin weit davon entfernt, Experte für NLP zu sein, habe aber versucht, weitere Erklärungen und Links zur weiteren Lektüre hinzuzufügen. Danke, dass Sie nach den Details gefragt haben! – alecxe

+0

Brilliant.Ich wusste nichts über NTLK - ich werde experimentieren und dann (hoffentlich) die Antwort akzeptieren :-) – GeorgeC