我已经编写了一些函数来处理文本文档并将它们转换成文字包。在此之前,我通过删除停用词,标记化等来清理文本,并将清理后的文本文档存储为列表,我打算将其作为参数传递给另一个函数,该函数将从中创建一系列单词功能。
这是功能:
def cleaningDocs(doc,stem): # 'S' for Stemming, 'L' for Lemmatization
"""This function cleans each doc string by doing the following:
i) Removing punctuation and other non alphabetical characters
ii) Convert to Lower case and split string into words (tokenization)
ii) Removes stop words (most frequent words)
iii) Doing Stemming and Lemmatization
"""
# Removing punctuations and other non alphabetic characters
import re
alphabets_only=re.sub(r'[^a-zA-Z]'," ",doc)
# Converting to lower case and splitting the words(tokenization)
words_lower=alphabets_only.lower().split()
# Removing stop words (Words like 'a', 'an', 'is','the' which doesn't contribute anything
from nltk.corpus import stopwords
useful_words = [w for w in words_lower if not w in set(stopwords.words("english"))]
# Doing Stemming or Lemmatization (Normalising the text)
from nltk.stem import PorterStemmer, WordNetLemmatizer
if (stem=='S'): # Choosing between Stemming ('S') and Lemmatization ('L')
stemmer=PorterStemmer()
final_words=[stemmer.stem(x) for x in useful_words]
else:
lemma=WordNetLemmatizer()
final_words=[lemma.lemmatize(x) for x in useful_words]
return(str(" ".join(final_words)))
现在这里是一个文档字符串列表。这是一个pandas Series对象。
type(docs)
Out[53]:
pandas.core.series.Series
此文档中的每个元素都是一个字符串。基本上每个元素都是一个文本文档,我想预先处理每个文本文档(去除停用词,词形还原等)并将其保存为新的处理列表。
type(docs[0])
Out[55]:
str
理想情况下,我想做这样的事情:
doc=[]
for x in docs:
doc.append(cleaningDocs(x,"L"))
因此,对于docs系列中的每个字符串文档,我们使用停用词和其他内容将其删除并将其保存回文档列表。
上面的代码给了我这个错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-56-61345bb4d581> in <module>()
1 doc=[]
2 for x in docs:
----> 3 doc.append(cleaningDocs(x,"L"))
4
<ipython-input-42-6e1c58274c3d> in cleaningDocs(doc, stem)
13 # Removing punctuations and other non alphabetic characters
14 import re
---> 15 alphabets_only=re.sub(r'[^a-zA-Z]'," ",doc)
16
17 # Converting to lower case and splitting the words(tokenization)
/Users/mtripathi/anaconda/lib/python2.7/re.pyc in sub(pattern, repl, string, count, flags)
153 a callable, it's passed the match object and must return
154 a replacement string to be used."""
--> 155 return _compile(pattern, flags).sub(repl, string, count)
156
157 def subn(pattern, repl, string, count=0, flags=0):
TypeError: expected string or buffer
然而,如果我通过向上面的for循环添加break来传递docs的第一个元素(第一个文档)来解除它的错误;它完全没问题。
doc=[]
for x in docs:
doc.append(cleaningDocs(x,"L"))
break
doc
如果您看到该功能按要求执行操作,方法是从原始文档中删除停用词并将其词形化,然后将其保存回新处理的文档列表。但是,如果我一次只发送一个文档,它就可以了。在for循环中发送所有文档时,它会抛出一个错误,为什么会这样?
编辑:
好的,我刚检查了文档中每个元素的类型,看到发生了一些问题,即有些元素在那里被转换为float。见下文:
for x in docs:
print(type(x))
<type 'str'>
<type 'str'>
<type 'str'>
<type 'float'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
所以有几件事:
1)我想在这个doc中看到那些浮动的元素。 2)。其次,如果我想将所有元素转换为字符串,我想我们可以做.astype()?
答案 0 :(得分:0)
因此,这里有两个主要想法:Boolean indexing和function application
布尔索引允许您使用true / false数组来选择Series的子集,而函数应用程序将单个函数应用于Series中的每个项目。
首先,应用0 my_program
1 foo
2 bar
确定哪些元素是浮点数,然后对系列进行切片以获取元素。
然后只需应用isinstance
即可。
str