python-3.x 使用空格删除标点符号;属性错误

t1qtbnec  于 2023-03-04  发布在  Python
关注(0)|答案(3)|浏览(131)

目前我使用下面的代码使用spaCy对一些文本数据进行lemmatize和计算TF-IDF值:

lemma = []

for doc in nlp.pipe(df['col'].astype('unicode').values, batch_size=9844,
                        n_threads=3):
    if doc.is_parsed:
        lemma.append([n.lemma_ for n in doc if not n.lemma_.is_punct | n.lemma_ != "-PRON-"])
    else:
        lemma.append(None)

df['lemma_col'] = lemma

vect = sklearn.feature_extraction.text.TfidfVectorizer()
lemmas = df['lemma_col'].apply(lambda x: ' '.join(x))
vect = sklearn.feature_extraction.text.TfidfVectorizer()
features = vect.fit_transform(lemmas)

feature_names = vect.get_feature_names()
dense = features.todense()
denselist = dense.tolist()

df = pd.DataFrame(denselist, columns=feature_names)
df = pd.DataFrame(denselist, columns=feature_names)
lemmas = pd.concat([lemmas, df])
df= pd.concat([df, lemmas])

我需要去掉专有名词、标点符号和停用词,但在当前代码中遇到了一些问题。我读了一些documentationother resources,但现在遇到了一个错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-21-e924639f7822> in <module>()
      7     if doc.is_parsed:
      8         tokens.append([n.text for n in doc])
----> 9         lemma.append([n.lemma_ for n in doc if not n.lemma_.is_punct or n.lemma_ != "-PRON-"])
     10         pos.append([n.pos_ for n in doc])
     11     else:

<ipython-input-21-e924639f7822> in <listcomp>(.0)
      7     if doc.is_parsed:
      8         tokens.append([n.text for n in doc])
----> 9         lemma.append([n.lemma_ for n in doc if not n.lemma_.is_punct or n.lemma_ != "-PRON-"])
     10         pos.append([n.pos_ for n in doc])
     11     else:

AttributeError: 'str' object has no attribute 'is_punct'

有没有更简单的方法把这些东西从文本中剥离出来,而不需要彻底改变我的方法?
完整代码可用here

0pizxfdo

0pizxfdo1#

在我看来,你的主要问题其实很简单:n.lemma_返回一个字符串,而不是一个Token对象。因此它没有is_punct属性。我认为您在这里寻找的是n.is_punct(无论 * 标记 * 是否为标点符号)。
如果您想更优雅地执行此操作,请查看spaCy新的自定义处理管道组件(需要v2.0+)。这允许您将逻辑封装在一个函数中,当您对文本调用nlp()时,该函数会自动运行。您甚至可以更进一步,为Doc添加一个自定义属性-例如,doc._.my_stripped_docdoc._.pd_columns之类的。这里的优点是您可以继续使用spaCy的高性能内置数据结构,如Doc(以及它的视图TokenSpan)作为应用程序的“单一真实来源”。不会丢失任何信息,并且您将始终保留对原始文档的引用-这对于调试也非常有用。

rn0zuynd

rn0zuynd2#

当你使用spacy时,使用这个函数来删除标点符号。

df["newcolname"] = df.column name(onwhich yoy want to remove stopword).apply(lambda text: 
                                      " ".join(token.lemma_ for token in nlp(text) 
                                               if not token.is_punct)
df["puncfree"] = df.review.apply(lambda text: 
                                      " ".join(token.lemma_ for token in nlp(text) 
                                               if not token.is_punct))

为了说服和更好地理解我张贴我的代码,我用来删除标点符号
“review”是要删除标点符号的列名。

35g0bw71

35g0bw713#

基于@khawaja-fahad-shafi的回答,我创建了以下模式,其中data是一个Pandas数据框,text是一个字符串字段。我最初将其作为评论而不是答案发布,但格式关闭。希望它对某些人有帮助。

import pandas
import spacy
nlp = spacy.load("en_core_web_md")

(data["text"]
 .apply(lambda text: " "
        .join(token.lemma_ for token in nlp(text) if
              not token.is_punct
              and not token.is_currency
              and not token.is_digit
              and not token.is_oov
              and not token.is_space
              and not token.is_stop
              and not token.like_num
              and not token.pos_ == "PROPN")))

相关问题