Поиск подходящих слов с помощью нграмм
Dataset:
df['bigram'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 2)))
df[:,0:1]
Id bigram
1952043 [(Swimming,Pool),(Pool,in),(in,the),(the,roof),(roof,top),
1918916 [(Luxury,Apartments),(Apartments,consisting),(consisting,11),
1645751 [(Flat,available),(available,sale),(sale,Medavakkam),
1270503 [(Toddler,Pool),(Pool,with),(with,Jogging),(Jogging,Tracks),
1495638 [(near,medavakkam),(medavakkam,junction),(junction,calm),
У меня есть файл Python (Categories.py), содержащий неконтролируемую классификацию свойств / объектов Land.
category = [('Luxury Apartments', 'IN', 'Recreation_Ammenities'),
('Swimming Pool', 'IN','Recreation_Ammenities'),
('Toddler Pool', 'IN', 'Recreation_Ammenities'),
('Jogging Tracks', 'IN', 'Recreation_Ammenities')]
Recreation = [e1 for (e1, rel, e2) in category if e2=='Recreation_Ammenities']
Чтобы найти подходящие слова из списка биграмм и списка категорий:
tokens=pd.Series(df["bigram"])
Lid=pd.Series(df["Id"])
matches = tokens.apply(lambda x: pd.Series(x).str.extractall("|".join(["({})".format(cat) for cat in Categories.Recreation])))
Во время выполнения кода выше, я получаю эту ошибку:
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
Нужна помощь по этому вопросу.
Мой желаемый результат:
Id bigram Recreation_Amenities
1952043 [(Swimming,Pool),(Pool,in),(in,the),.. Swimming Pool
1918916 [(Luxury,Apartments),(Apartments,.. Luxury Apartments
1645751 [(Flat,available),(available,sale)..
1270503 [(Toddler,Pool),(Jogging,Tracks).. Toddler Pool,Jogging Tracks
1495638 [(near,medavakkam),..
2 ответа
Решение
Что-то в этом роде должно работать для вас:
def match_bigrams(row):
categories = []
for bigram in row.bigram:
joined = ' '.join(list(bigram))
if joined in Recreation:
categories.append(joined)
return categories
df['Recreation_Amenities'] = df.apply(match_bigrams, axis=1)
print(df)
Id bigram Recreation_Amenities
0 1952043 [(Swimming, Pool), (Pool, in), (in, the), (the... [Swimming Pool]
1 1918916 [(Luxury, Apartments), (Apartments, consisting... [Luxury Apartments]
2 1645751 [(Flat, available), (available, sale), (sale, ... []
3 1270503 [(Toddler, Pool), (Pool, with), (with, Jogging... [Toddler Pool, Jogging Tracks]
4 1495638 [(near, medavakkam), (medavakkam, junction), (... []
Каждый биграмм объединяется пробелом, чтобы можно было проверить, содержится ли этот биграм в вашем списке категорий (т.е. if joined in Recreation
).
Вы можете объединить кортежи по пробелам, а затем найти слова, присутствующие в программе "Отдых", используя двойное понимание списка, и применить, т.е.
df['Recreation_Amenities'] = df['bigram'].apply(lambda x : [j for j in Recreation if j in [' '.join(i) for i in x]])
Давайте посмотрим, у вас есть датафрейм
Ид биграмм 0 1270503 [(Малыш, Бассейн), (Бассейн, с), (с, Бег трусцой), (Бег, треки)] 1 1952043 [(Бассейн, бассейн), (Бассейн, в), (в, на), (на крыше), (крыша, верх)] 2 1918916 [(Luxury, Apartments), (Квартиры, состоящие), (состоящие, 11)] 3 1495638 [(рядом, медаваккам), (медаваккам, соединение), (соединение, спокойствие)] 4 1645751 [(Квартира, в наличии), (в наличии, продажа), (продажа, Медаваккам)]
И у вас есть список отдыха, т.е.
Recreation = ['Luxury Apartments', 'Swimming Pool', 'Toddler Pool', 'Jogging Tracks']
затем
df['Recreation_Amenities'] = df['bigram'].apply(lambda x : [j for j in Recreation if j in [' '.join(i) for i in x]])
Выход: df['Recreation_Amenities']
0 [Бассейн для малышей, беговые дорожки] 1 [Бассейн] 2 [Роскошные апартаменты] 3 [] 4 [] Имя: Recreation_Aferences, dtype: объект