Проблема анализа столбца документа в df с помощью spaCy nlp

#python #pandas #nlp #spacy

Вопрос:

После использования скребка отзывов amazon для создания этого фрейма данных я обратился к nlp, чтобы обозначить и создать новый столбец, содержащий обработанные отзывы как «документы».

Тем не менее, сейчас я пытаюсь создать шаблон для анализа отзывов в столбце doc, но я продолжаю узнавать совпадения, что заставляет меня думать, что я пропускаю еще один этап предварительной обработки или, возможно, не указываю сопоставителю в правильном направлении.

В то время как следующий код выполняется без каких — либо ошибок, я получаю список совпадений с 0, хотя я знаю, что слово существует в столбце doc. Документы для spaCy все еще немного тонкие, и я не слишком уверен, что matcher.add правильный, как указано в руководстве

 matcher.add("Name_of_List", None, pattern)
 

возвращает ошибку, в которой говорится, что для этого класса требуется только 2 аргумента.

Вопрос: Что мне нужно изменить, чтобы точно проанализировать столбец df doc для созданного шаблона?

Спасибо!

Полный код:

 import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

import spacy
from spacy.matcher import Matcher

nlp = spacy.load('en_core_web_md')


df = pd.read_csv('paper_towel_US.csv')

#calling on NLP to return processed doc for each review
df['doc'] = [nlp(body) for body in df.body]


# Sum the number of tokens in each Doc
df['num_tokens'] = [len(token) for token in df.doc]



#calling matcher to create pattern
matcher = Matcher(nlp.vocab)


pattern =[{"LEMMA": "love"},
          {"OP":" "}
          
          ]
matcher.add("QUALITY_PATTERN", [pattern])


def find_matches(doc):
    spans = [doc[start:end] for _, start, end in matcher(doc)]
    for span in spacy.util.filter_spans(spans):
        return ((span.start, span.end, span.text))
    
    
df['doc'].apply(find_matches)
    
 

образец df для воспроизведения через df.iloc[596:600, :].to_clipboard(sep=',')

 ,product,title,rating,body,doc,num_tokens
596,Amazon.com: Customer reviews: Bamboo Towels - Heavy Duty Machine Washable Reusable Rayon Towels - One roll replaces 6 months of towels! 1 Pack,Awesome!,5,Great towels!,Great towels!,3
597,Amazon.com: Customer reviews: Bamboo Towels - Heavy Duty Machine Washable Reusable Rayon Towels - One roll replaces 6 months of towels! 1 Pack,Good buy!,5,Love these,Love these,2
598,Amazon.com: Customer reviews: Bamboo Towels - Heavy Duty Machine Washable Reusable Rayon Towels - One roll replaces 6 months of towels! 1 Pack,Meh,3,"Does not clean countertop messes well. Towels leave a large residue. They are durable, though","Does not clean countertop messes well. Towels leave a large residue. They are durable, though",18
599,Amazon.com: Customer reviews: Bamboo Towels - Heavy Duty Machine Washable Reusable Rayon Towels - One roll replaces 6 months of towels! 1 Pack,Exactly as Described. Packaged Well and Mailed Promptly,4,Exactly as Described. Packaged Well and Mailed Promptly,Exactly as Described. Packaged Well and Mailed Promptly,9
 

Комментарии:

1. Вы пытаетесь получить совпадения из "df.doc" строки, см. doc = nlp("df.doc")

Ответ №1:

Вы пытаетесь получить совпадения из "df.doc" строки с doc = nlp("df.doc") помощью . Вместо этого вам нужно извлечь совпадения из df['doc'] столбца.

Примером решения является удаление doc = nlp("df.doc") и использование nlp = spacy.load('en_core_web_sm') :

 def find_matches(doc):
    spans = [doc[start:end] for _, start, end in matcher(doc)]
    for span in spacy.util.filter_spans(spans):
        return ((span.start, span.end, span.text))

>>> df['doc'].apply(find_matches)
0                  None
1    (0, 2, Love these)
2                  None
3                  None
Name: doc, dtype: object
 

Полный фрагмент кода:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import spacy
from spacy.matcher import Matcher

nlp = spacy.load('en_core_web_sm')


df = pd.read_csv(r'C:UsersadminDesktops.txt')

#calling on NLP to return processed doc for each review
df['doc'] = [nlp(body) for body in df.body]


# Sum the number of tokens in each Doc
df['num_tokens'] = [len(token) for token in df.doc]

#calling matcher to create pattern
matcher = Matcher(nlp.vocab)


pattern =[{"LEMMA": "love"},
          {"OP":" "}
          
          ]
matcher.add("QUALITY_PATTERN", [pattern])

#doc = nlp("df.doc")

#matches = matcher(doc)
def find_matches(doc):
    spans = [doc[start:end] for _, start, end in matcher(doc)]
    for span in spacy.util.filter_spans(spans):
        return ((span.start, span.end, span.text))

print(df['doc'].apply(find_matches))
 

Комментарии:

1. Спасибо, я последовал инструкции и заменил doc… вашей функцией, но все равно получаю 0 совпадений. Не могли бы вы немного объяснить функцию (извините, я новичок) — в частности, как это проходит в шаблоне, созданном выше, и во 2-й строке (охватывает строку с «for_»). спасибо! (код обновлен выше)