文字清理和停用词

时间:2018-12-12 20:43:14

标签: python machine-learning text

我正在尝试完成机器学习课程的文本学习项目。我的老师为我提供了以下功能,但我不明白为什么会遇到错误。该函数应该使用一个字符串,删除标点和停用词,然后返回新字符串。

def review_to_words( raw_review ):
    # Function to convert a raw review to a string of words
    # The input is a single string (a raw movie review), and 
    # the output is a single string (a preprocessed movie review)
    #
    # 1. Remove HTML
    review_text = BeautifulSoup(raw_review).get_text() 
    #
    # 2. Remove non-letters (punctuation)       
    letters_only = re.sub("[^a-zA-Z]", " ", review_text) 
    #
    # 3. Convert to lower case, split into individual words
    words = letters_only.lower().split()                             
    #
    # 4. In Python, searching a set is much faster than searching
    #   a list, so convert the stop words to a set
    stops = set(stopwords.words("english"))                  
    # 
    # 5. Remove stop words
    meaningful_words = [w for w in words if not w in stops]   
    #
    # 6. Join the words back into one string separated by space, 
    # and return the result.
    return( " ".join( meaningful_words ))

clean_review = review_to_words(first1000["review"][0] )

它说在下面的行中有一个'review'的关键错误:

clean_review = review_to_words(first1000["review"][0] )

first1000是设置为:

的变量
first1000 = data["review"][0:1000]

我的数据集是一个.tsv文件,其中包含来自imdb的数千条电影评论。变量“评论”只是该数据集中的一个评论。

同样,该函数应该采用一个字符串,删除标点和停用词,然后返回新字符串。我不确定发生了什么,因为我查看了代码,对我来说看起来不错。

编辑:到目前为止,我从答复中听到的是,我的数据是列表的字典。听起来很正确。每个评论都是单词列表,而整个数据集都是评论列表。但是现在我需要找到一种方法来计算字典中列表的数量。我目前拥有的是:

num_reviews = count(train_reviews["reviews"])
print(num_reviews)

其中train_reviews [“ reviews”]是我的数据的子集。它仍然是列表的字典。我需要计算一下train_reviews中有多少个列表。这段代码没有出现错误,但是也没有任何输出。我肯定知道它应该已经从print命令产生了一些输出,这就是为什么我感到困惑。

P.S。如果我想提出一个全新的问题以便发布具有相同代码的新问题,请告诉我,以后我会记得的。

2 个答案:

答案 0 :(得分:1)

看来您有一个字典data,其中包含各种数据条目,其中之一在键"review"下。这些数据条目是某种序列,也许是行(字符串)列表。

您将前1000行扫入了一个新列表first1000。这是list,而不是dict-它没有任何键。您在此变量中有1000个字符串的序列-没有“审阅”条目。

从通话中删除["review"]元素,然后看看会得到什么。更好的是,学习一些基本的调试:打印出您正在使用的值,以确保它们与您所认为的保持一致。

请参阅这个可爱的debug博客以获取帮助。

答案 1 :(得分:0)

您可能会收到此错误,因为data["review"][0:1000]可能是list(或一些可迭代的),而不是字典。如果是这样,要解决此问题,只需执行first1000[0]。不过,由于您尚未提供MVCE,因此无法告诉您。

这是一个(较小的)示例:

In [4]: data = {'review': list(range(10000))}

In [5]: data['review'][0:10]
Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [6]: first10 = data['review'][0:10]

In [7]: first10[0]
Out[7]: 0

因此,当您使用给定的键访问字典项时,您会得到该键所指向的所有内容指向,而不是该键本身。由于它只是list,如果尝试使用密钥'review',则会出现密钥错误,因为list只能接受整数索引:

In [8]: first10['review'][0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-61dfa9e84754> in <module>()
----> 1 first10['review'][0]

TypeError: list indices must be integers or slices, not str

HTH。