目前我使用下面的代码使用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])
我需要去掉专有名词、标点符号和停用词,但在当前代码中遇到了一些问题。我读了一些documentation和other 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。
3条答案
按热度按时间0pizxfdo1#
在我看来,你的主要问题其实很简单:
n.lemma_
返回一个字符串,而不是一个Token
对象。因此它没有is_punct
属性。我认为您在这里寻找的是n.is_punct
(无论 * 标记 * 是否为标点符号)。如果您想更优雅地执行此操作,请查看spaCy新的自定义处理管道组件(需要v2.0+)。这允许您将逻辑封装在一个函数中,当您对文本调用
nlp()
时,该函数会自动运行。您甚至可以更进一步,为Doc
添加一个自定义属性-例如,doc._.my_stripped_doc
或doc._.pd_columns
之类的。这里的优点是您可以继续使用spaCy的高性能内置数据结构,如Doc
(以及它的视图Token
和Span
)作为应用程序的“单一真实来源”。不会丢失任何信息,并且您将始终保留对原始文档的引用-这对于调试也非常有用。rn0zuynd2#
当你使用spacy时,使用这个函数来删除标点符号。
为了说服和更好地理解我张贴我的代码,我用来删除标点符号
“review”是要删除标点符号的列名。
35g0bw713#
基于@khawaja-fahad-shafi的回答,我创建了以下模式,其中
data
是一个Pandas数据框,text
是一个字符串字段。我最初将其作为评论而不是答案发布,但格式关闭。希望它对某些人有帮助。