У меня есть некоторые данные с названиями предложений путешествий.
import pandas as pd
import nltk
import numpy as np
datadict = {'deals_raw_text': {0: 'Cheap flights from Moscow to NEW DELHI, INDIA from €255',
1: '5* Qatar Airways flights from the UK to India (Kochi, Chennai, Ahmedabad, Bangalore, Kozhikode) from £340!',
2: "What a corker: 2nts in Portugal's wine country from £155pp incl. design hotel, flights & breakfast",
3: 'WIZZ AIR New Route from Budapest to KAZAN, RUSSIA',
4: 'Weekend in Venice from only 105 € with flights and hotel',
5: 'Oslo, Norway to New York, USA for only €184 roundtrip',
6: 'Wizz Air announces new route between Budapest and Kazan!',
7: 'Backpacking in 2019: 3 weeks by Costa Rica & Panama City for 640 € with accommodation flights',
8: 'Vacaciones en Croacia: 3/7 noches de hotel + vuelos directos desde solo 259€',
9: 'Business Class from Stockholm, Sweden to Singapore for only €1196 roundtrip (lie-flat seats)'}}
testdf = pd.DataFrame(datadict)
цель состоит в том, чтобы в конечном итоге получить проанализированные источники и назначения из каждой строки в кадре данных. Итак, в идеале я хотел бы получить фрейм данных со следующим
1: Origin: 'UK', Destination: 'India'
2: Origin: np.nan, Destination: 'Portugal'
3: Origin: 'Budapest', Destination: 'Kazan, Russia'
...
9: Origin: 'Stockholm, Sweden', Destination: 'Singapore'
Как видите, строки не согласованы, но иногда следуют структуре от f '{Origin} до {Destination} для {Price}'. Это недостаточно согласованно для написания функции на основе правил, поэтому я обратился к NLTK и попытался токенизировать элементы для идентификации городов. Правда, я не очень знаком с regex и nltk.
Написал функцию токенизации укусов:
def ie_preprocess(text=df.deals_raw_text[0]):
sentences = nltk.sent_tokenize(text)
sentences = [nltk.word_tokenize(sent) for sent in sentences]
sentences = [nltk.pos_tag(sent) for sent in sentences]
return sentences
Теперь мы применяем функцию: (Я уверен, что грамматическая строка неверна, но это то, что я придумал)
grammar = "NP: {<NNP>?<TO>*<NNP>}"
results = []
for i in enumerate(testdf):
print (i[1])
cp = nltk.RegexpParser(grammar)
r = cp.parse(ie_preprocess(i[1])[0])
results.append(r)
Но я застрял здесь. Как я могу превратить эти токенизированные кортежи в желаемый результат городов происхождения / назначения? Спасибо.