执行文本预处理时出现错误

时间:2015-10-01 20:14:49

标签: python pandas nltk

我已经编写了一些函数来处理文本文档并将它们转换成文字包。在此之前,我通过删除停用词,标记化等来清理文本,并将清理后的文本文档存储为列表,我打算将其作为参数传递给另一个函数,该函数将从中创建一系列单词功能。

这是功能:

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()?

1 个答案:

答案 0 :(得分:0)

因此,这里有两个主要想法:Boolean indexingfunction application

布尔索引允许您使用true / false数组来选择Series的子集,而函数应用程序将单个函数应用于Series中的每个项目。

首先,应用0 my_program 1 foo 2 bar 确定哪些元素是浮点数,然后对系列进行切片以获取元素。

然后只需应用isinstance即可。

str