2017-09-11 3 views
0

Dataset:mot de match, quel que soit le cas

> df 
Id  Clean_Data 
1918916 Luxury Apartments consisting 11 towers Well equipped gymnasium Swimming Pool Toddler Pool Health Club Steam Room Sauna Jacuzzi Pool Table Chess Billiards room Carom Table Tennis indoor games 
1495638 near medavakkam junction calm area near global hospital 
1050651 No Pre Emi No Booking Amount No Floor Rise Charges No Processing Fee HLPROJECT HIGHLIGHTS 

est Ci-dessous le code qui revient avec succès les mots correspondants dans ngrams de la liste des valeurs dans Category.py

df['one_word_tokenized_text'] =df["Clean_Data"].str.split() 
df['bigram'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 2))) 
df['trigram'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 3))) 
df['four_words'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 4))) 
token=pd.Series(df["one_word_tokenized_text"]) 
Lid=pd.Series(df["Id"]) 
matches= token.apply(lambda x: pd.Series(x).str.extractall("|".join(["({})".format(cat) for cat in Categories.HealthCare]))) 
match_list= [[m for m in match.values.ravel() if isinstance(m, str)] for match in matches] 
match_df = pd.DataFrame({"ID":Lid,"jc1":match_list}) 


def match_word(feature, row): 
    categories = [] 

    for bigram in row.bigram: 
     joined = ' '.join(bigram) 
     if joined in feature: 
      categories.append(joined) 
    for trigram in row.trigram: 
     joined = ' '.join(trigram) 
     if joined in feature: 
      categories.append(joined) 
    for fourwords in row.four_words: 
     joined = ' '.join(fourwords) 
     if joined in feature: 
      categories.append(joined) 
    return categories 

match_df['Health1'] = df.apply(partial(match_word, HealthCare), axis=1) 
match_df['HealthCare'] = match_df[match_df.columns[[1,2]]].apply(lambda x: ','.join(x.dropna().astype(str)),axis=1) 

Catégorie.py

category = [('steam room','IN','HealthCare'), 
     ('sauna','IN','HealthCare'), 
     ('Jacuzzi','IN','HealthCare'), 
     ('Aerobics','IN','HealthCare'), 
     ('yoga room','IN','HealthCare'),] 
    HealthCare= [e1 for (e1, rel, e2) in category if e2=='HealthCare'] 

Sortie:

ID HealthCare 
1918916 Jacuzzi 
1495638 
1050651 Aerobics, Jacuzzi, yoga room 

ici si je mentionne les caractéristiques dans « la liste de la catégorie » dans le cas précis lettre comme mentionné dans l'ensemble de données, le code identifie et renvoie la valeur, sinon ça ne va pas. Donc, je veux que mon code soit insensible à la casse et même suivre "Steam Room", "Sauna" dans la catégorie de la santé. J'ai essayé avec ".lower()" fonction, mais je ne suis pas sûr de la façon de l'implémenter.

Répondre

1

modifier 2: seulement category.py est mis à jour

Category.py

category = [('steam room','IN','HealthCare'), 
     ('sauna','IN','HealthCare'), 
     ('jacuzzi','IN','HealthCare'), 
     ('aerobics','IN','HealthCare'), 
     ('Yoga room','IN','HealthCare'), 
     ('booking','IN','HealthCare'),   
     ] 
category1 = [value[0].capitalize() for index, value in enumerate(category)] 
category2 = [value[0].lower() for index, value in enumerate(category)] 

test = [] 
test2 =[] 

for index, value in enumerate(category1): 
    test.append((value, category[index][1],category[index][2])) 

for index, value in enumerate(category2): 
    test2.append((value, category[index][1],category[index][2])) 

category = category + test + test2 


HealthCare = [e1 for (e1, rel, e2) in category if e2=='HealthCare'] 

Votre jeu de données non modifié

import pandas as pd 
from nltk import ngrams, word_tokenize 
import Categories 
from Categories import * 
from functools import partial 


data = {'Clean_Data':['Luxury Apartments consisting 11 towers Well equipped gymnasium Swimming Pool Toddler Pool Health Club Steam Room Sauna Jacuzzi Pool Table Chess Billiards room Carom Table Tennis indoor games', 
        'near medavakkam junction calm area near global hospital', 
        'No Pre Emi No Booking Amount No Floor Rise Charges No Processing Fee HLPROJECT HIGHLIGHTS '], 
'Id' : [1918916, 1495638,1050651]} 

df = pd.DataFrame(data) 


df['one_word_tokenized_text'] =df["Clean_Data"].str.split() 
df['bigram'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 2))) 
df['trigram'] = df['Clean_Data']).apply(lambda row: list(ngrams(word_tokenize(row), 3))) 
df['four_words'] = df['Clean_Data'].apply(lambda row: list(ngrams(word_tokenize(row), 4))) 
token=pd.Series(df["one_word_tokenized_text"]) 
Lid=pd.Series(df["Id"]) 
matches= token.apply(lambda x: pd.Series(x).str.extractall("|".join(["({})".format(cat) for cat in Categories.HealthCare]))) 
match_list= [[m for m in match.values.ravel() if isinstance(m, str)] for match in matches] 
match_df = pd.DataFrame({"ID":Lid,"jc1":match_list}) 


def match_word(feature, row): 
    categories = [] 

    for bigram in row.bigram: 
     joined = ' '.join(bigram) 
     if joined in feature: 
      categories.append(joined) 
    for trigram in row.trigram: 
     joined = ' '.join(trigram) 
     if joined in feature: 
      categories.append(joined) 
    for fourwords in row.four_words: 
     joined = ' '.join(fourwords) 
     if joined in feature: 
      categories.append(joined) 
    return categories 

match_df['Health1'] = df.apply(partial(match_word, HealthCare), axis=1) 
match_df['HealthCare'] = match_df[match_df.columns[[1,2]]].apply(lambda x: ','.join(x.dropna().astype(str)),axis=1)enize(row), 4))) 

Sortie

print match_df 

+--------+----------------+-------------+------------------------------------+ 
|ID  |jc1    |Health1  |HealthCare       | 
+--------+----------------+-------------+------------------------------------+ 
|1918916 |[sauna, jacuzzi]|    |['sauna', 'jacuzzi'],['steam room'] | 
+--------+----------------+-------------+------------------------------------+ 
|1495638 |    |    |         | 
+--------+----------------+-------------+------------------------------------+ 
|1050651 | [Booking] |    | ['Booking'],[]     |    | 
+--------+----------------+-------------+------------------------------------+ 
+0

Non, je ne suis pas censé modifier mes valeurs de jeu de données. Je veux juste faire correspondre les mots avec les valeurs de catégorie indépendamment du cas. –

+0

bien que vous ajoutiez déjà des colonnes à votre jeu de données, je viens d'éditer ma réponse de la façon dont je le vois vous pouvez: - a) faire tout en bas/haut pour les 3 colonnes que vous créez et tester uniquement avec majuscules - b) essayez de reproduire (en utilisant le code python) tous les formats de majuscules possibles dans votre Category.py ce dernier semble être exagéré. – Pelican

+0

Désolé si ma question est confuse, je comprends votre point, mais mon souci est, mon cas de valeur de sortie finale ne devrait pas différer de ce que j'ai reçu dans l'ensemble de données. Si "Sauna", "Steam Room" ont des InitialCaps, la même chose doit être présentée en sortie. Je veux simplement dire que, si mon jeu de données contient des mots similaires à l'avenir avec des majuscules ou des minuscules, alors mon code doit être insensible à la casse pour le détecter. :) –