У меня есть список слов, и я хочу сделать, если заявление, ниже мой список:

list = ['camera','display','price','memory'(will have 200+ words in the list)]

Вот мой код:

def check_it(sentences):
    if 'camera' in sentences and 'display' in sentences and 'price' in sentences:
        return "Camera/Display/Price"
    if 'camera' in sentences and 'display' in sentences:
        return "Camera/Display"
    ...
    return "Others"

h.loc[:, 'Category'] = h.Mention.apply(check_it)

Для них будет слишком много комбинаций, а также я хочу, чтобы слова возвращались в отдельную строку. Кто-нибудь знает, как сделать этот образец и вернуть слово индивидуально вместо того, чтобы делать «камера / дисплей / цена»?

2
Aimee 20 Авг 2018 в 12:21

3 ответа

Лучший ответ

Используйте str.findall by regex - объединить все значения списков с помощью |, последний str.join значения /:

df = pd.DataFrame({'Mention':['camera in sentences and display in sentences',
                              'camera in sentences price']})


L = ['camera','display','price','memory']
pat = '|'.join(r"\b{}\b".format(x) for x in L)
df['Category'] = df['Mention'].str.findall(pat).str.join('/')
print (df)
                                        Mention        Category
0  camera in sentences and display in sentences  camera/display
1                     camera in sentences price    camera/price

Другое решение с пониманием списка, также для генератора использования списка с join:

df['Category1'] = [[y for y in x.split() if y in L] for x in df['Mention']]
df['Category2'] = ['/'.join(y for y in x.split() if y in L) for x in df['Mention']]
print (df)
                                        Mention          Category1  \
0  camera in sentences and display in sentences  [camera, display]   
1                     camera in sentences price    [camera, price]   

        Category2  
0  camera/display  
1    camera/price  
5
jezrael 20 Авг 2018 в 10:12

Почему бы просто не проверить слова в каждом предложении?

wordsList = ['camera','display','price','memory'(will have 200+ words in the list)]

def check_it(sentence, wordsList):
    wordString = ''
    flag = False
    counter = 0
    for word in sentence.split():
        if word in wordsList:
            if counter != 0:
                wordString = wordString + '/' + word
            else:
                wordString = word
            flag = True
            counter += 1
    if flag:
        return wordString
    elif not flag:
        return 'Others'
0
darshvader 20 Авг 2018 в 10:07
some_words = ['camera','display','price','memory']
def check_it(sentences, words):
   find_words = []
   for word in words:
      if word in sentences:
         find_words.append(word)
   return find_words
t = check_it('display has camera and price is', some_words)
print t
1
Konstantin Kozlenko 20 Авг 2018 в 09:35
51927650