2016-11-21 2 views
1

Например, у меня есть приведенный ниже список строк в качестве входного корпуса (на самом деле его большой список со 100 значениями). action = ['jump', 'fly', 'run', 'swim']Как извлечь все совпадения строк из столбца с помощью ввода corpus/list в pandas?

Данные содержат столбец, называемый action_description. Как я могу извлечь все совпадения строк в action_description, используя список действий в качестве входного корпуса?

Примечание: Я уже сделал lemmitization description_action, поэтому, если в столбце есть слова, такие как прыжки или прыжки, они уже конвертированы для перехода.

вход Sample & выход

"I love to run and while my friend prefer to swim" --> "run swim" 
"Allan excels at high jump but he is not a good at running" --> "jump run" 

Примечание: я нашел ниже функции панд, но его не очень хорошо задокументирована так не мог понять, как использовать его.

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.extractall.html

Пожалуйста рекомендовать оптимальное решение, так как на входе dataframe имеют 200K строк.

РЕДАКТИРОВАТЬ Слово как перемычки & ВПП следует игнорировать алгоритм т.е. не должно быть классифицировано как прыгать & перспективы.

ответ

1

Шагов:

  1. Проводят лемматизации только глаголы, снабжая pos='v' и пусть существительных остаются, как они были раньше итерируя Копание каждого слова в этом списке получил по str.split операции.
  2. Затем возьмите все совпадения слов, присутствующих в списке поиска и лексимизированном списке, с помощью set.
  3. Наконец, присоедините их, чтобы вернуть строку в качестве выхода.

from nltk.stem.wordnet import WordNetLemmatizer 

action = ['jump','fly','run','swim']  # lookup list 
lem = WordNetLemmatizer() 
fcn = lambda x: " ".join(set([lem.lemmatize(w, 'v') for w in x]).intersection(set(action))) 
df['action_description'] = df['action_description'].str.split().apply(fcn) 
df 

enter image description here


DF Начиная используется:

df = pd.DataFrame(dict(action_description=["I love to run and while my friend prefer to swim", 
              "Allan excels at high jump but he is not a good at running"])) 

Для создания двоичных флагов (0/1), мы можем использовать str.get_dummies метода путем разделения строк на пробельном и вычислениях это переменный индикатор, как показано:

bin_flag = df['action_description'].str.get_dummies(sep=' ').add_suffix('_flag') 
pd.concat([df['action_description'], bin_flag], axis=1) 

enter image description here

+0

Почему позы = «V» т.е. глагол используется? Будет ли результат улучшаться, если 1-я позиция пометки в предложении будет идентифицирована, а затем pos-тег передается функции lemmatize()? –

+0

Лемматизатор генерирует реальные слова, но без контекстной информации он не может различать существительные и глаголы. Контекст предоставляется тегом POS (*, поскольку все слова были в их глагольной форме, используется pos = 'v' *). Да, результаты, безусловно, улучшатся, если в вашем списке поиска есть слова, отличные от глаголов, если вы можете автоматически генерировать теги POS и lemmatize w.r.t в тех частях речи. –

+0

Спасибо! Как я могу изменить свой код для преобразования слов типа «утечка» в «утечку» и т. Д., Используя леммитизацию? –

1
action=['jump','fly','run','swim'] 


str1="I love to run and while my friend prefer to swim" ##--> "run swim" 
str2="Allan excels at high jump but he is not a good at running" ##--> "jump run" 

actionDtl="" 
for word in str1.split(): 
    if word in action: 
     if actionDtl<>"": 
      actionDtl=actionDtl+" " +word 
     else: 
      actionDtl=actionDtl+word 
    else: 
     for act in action: 
      if word.find(act)>=0: 
       if actionDtl<>"": 
        actionDtl=actionDtl+" " +act 
       else: 
        actionDtl=actionDtl+act 
       break  
print actionDtl 
1

Это действительно проблема, регулярное выражение с помощью re.findall для соответствующих строк и operator.add объединить матчи

import pandas as pd 
import re 
import operator as op 


action=['jump','fly','run','swim'] 

str1="I love to run and while my friend prefer to swim" ##--> "run swim" 
str2="Allan excels at high jump but he is not a good at running" ##--> "jump run 



df=pd.DataFrame({'A':[1,2,3,4], 
        'B':['I love to run and while my friend prefer to swim', 
        'Allan excels at high jump but he is not a good at running', 
        'Ostrich can run very fast but cannot fly', 
        'The runway was wet hence the Jumper flew over it'] }) 


df['ApproxMatch']=df['B'].apply(lambda x: [reduce(op.add, re.findall(act,x)) for act in action if re.findall(act,x) <> []]) 

#using r'\b'+jump+r'\b' to match jump exactly, where \b stands for word boundaries 

df['ExactMatch']=df['B'].apply(lambda x: [reduce(op.add, re.findall(r"\b"+act+r"\b",x)) for act in action if re.findall(r"\b"+act+r"\b",x) <> []]) 

Выход:

df 

# A             B ApproxMatch \ 
#0 1 I love to run and while my friend prefer to... [run, swim] 
#1 2 Allan excels at high jump but he is not a good... [jump, run] 
#2 3   Ostrich can run very fast but cannot fly [fly, run] 
#3 4 The runway was wet hence the Jumper flew over it  [run] 
# 
# ExactMatch 
#0 [run, swim] 
#1  [jump] 
#2 [fly, run] 
#3   [] 

Обратите внимание, что с точным соответствием для строки 2, «работает» не совпадают с «запуском»

+0

Спасибо! Что, если описание содержит слова типа «ВПП» и «Перемычка»? –

+0

Добавлено точное соответствие также, соответствует ли оно вашим ожиданиям. Не могли бы вы обновить свое исходное сообщение с вводом и ожиданием вывода для «ВПП» и «Перемычки»? – OdeToMyFiddle

+0

Добавлены ожидания. Спасибо за обмен. Одна из рекомендаций - выполнять леммитизацию, так что летать и работать можно классифицировать правильно, как это сделал @ Никиль Мавели. –