2014-12-07 25 views
7

Muszę wyodrębnić wszystkie nazwy miast ze strony internetowej. Używałem beautifulSoup z RE w poprzednich projektach, ale na tej stronie nazwy miast są częścią zwykłego tekstu i nie mają określonego formatu. Znalazłem pakiet geograpy (https://pypi.python.org/pypi/geograpy/0.3.7), który spełnia moje wymagania."NotImplementedError: Użyj etykiety(), aby uzyskać dostęp do etykiety węzła"

Geograpy używa pakietu nltk. Zainstalowałem wszystkie modele i pakiety dla NLTK ale zachowuje rzuca ten błąd:

>>> import geograpy 
>>> places = geograpy.get_place_context(url="http://www.state.gov/misc/list/") 

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Python27\lib\site-packages\geograpy\__init__.py", line 6, in get_place_context 
e.find_entities() 
File "C:\Python27\lib\site-packages\geograpy\extraction.py", line 31, in find_entities 
if (ne.node == 'GPE' or ne.node == 'PERSON') and ne[0][1] == 'NNP': 
File "C:\Python27\lib\site-packages\nltk\tree.py", line 198, in _get_node 
raise NotImplementedError("Use label() to access a nod label.") 
NotImplementedError: Use label() to access a node label. 

Każda pomoc będzie mile widziane

Odpowiedz

2

Wygląda geograpy jest wywołanie metody node danego nltkTree obiektu:

nes = nltk.ne_chunk(nltk.pos_tag(text)) 
for ne in nes: 
    if len(ne) == 1: 
     if (ne.node == 'GPE' or ne.node == 'PERSON') and ne[0][1] == 'NNP': 

Pakiet nltk został oznaczony jako przestarzały:

def _get_node(self): 
    """Outdated method to access the node value; use the label() method instead.""" 
    raise NotImplementedError("Use label() to access a node label.") 
def _set_node(self, value): 
    """Outdated method to set the node value; use the set_label() method instead.""" 
    raise NotImplementedError("Use set_label() method to set a node label.") 
node = property(_get_node, _set_node) 

Pakiet jest uszkodzony. Możesz to naprawić samodzielnie lub użyć innego.

+0

Dzięki za odpowiedź. Sam to wymyśliłem. Miałem nadzieję, że ktoś pomoże mi "naprawić" ten pakiet. Może być kimś, kto ma doświadczenie z nltk. Jeśli chodzi o używanie innego pakietu, szukałem podobnego pakietu przez kilka dni, ale jeszcze niczego nie znalazłem. – Faisal

13

Można to rozwiązać, zastępując ".node" przez ".label()".

w was problem, można spróbować wymienić

if (ne.node == 'GPE' or ne.node == 'PERSON') and ne[0][1] == 'NNP': 

z

if (ne.label() == 'GPE' or ne.label() == 'PERSON') and ne[0][1] == 'NNP': 
+0

Może możesz nieco przedłużyć odpowiedź, mówiąc, dlaczego to konieczne. Czy była na przykład zmiana w API? –

4

Nie zakładaj każdy modyfikować pliki lib. Dla faceta lub każdego, kto potrzebuje pomocy, musisz uzyskać dostęp do miejsca, w którym jest zainstalowany pakiet. Chcesz zmodyfikować plik extraction.py. Jeśli używasz systemu Windows 10 lub czegoś podobnego, plik może znajdować się w C: \ Python27 \ Lib \ site-packages \ geograpy \ extraction.py. Zwykle znajduje się w tym samym katalogu instalacyjnym co Python. Jak ktoś jeszcze wspomniał wcześniej, zmień (linia 31)

, jeśli (ne.node == 'GPE' lub ne.node == 'PERSON') i ne [0] [1] == 'NNP':

do

if (ne.label() == 'i' GPE ne.label() == 'osoba') i NE [0] [1] == NNP '

Gotowe. Happy Coding.