首先,我想说,我对编码非常陌生,而且对最基本的知识也知之甚少。
我的任务是从facebook上抓取数据,并对其进行情绪分析。我使用scraping-bot.io获取数据,并将其放在json文件中,格式如下
{
"owner_url": "https://www.facebook.com/########",
"url": "https://www.facebook.com/post",
"name": "Page name",
"date": "date",
"post_text": "Post title",
"media_url": "media url attached",
"likes": ###,
"shares": ###,
"num_comments": ###,
"scrape_time": "date",
"comments": [
{
"author_name": "Name",
"text": "Comment text",
"created": "Date"
},这些帖子是西班牙语的,所以我查找了一个库来进行分析。我选择了https://pypi.org/project/sentiment-analysis-spanish/ (不确定它是否是最好的,所以我也愿意接受这方面的建议)
理想情况下,我希望能够打开json文件,对"text“进行情感分析,然后将数据保存到相同或新的文件中,以便在另一个程序中可视化。
到目前为止,这就是我所拥有的
from sentiment_analysis_spanish import sentiment_analysis
sentiment = sentiment_analysis.SentimentAnalysisSpanish()
f = open('C:/Users/vnare/Documents/WebScraping.json', encoding='utf-8-sig')
data = json.load(f)
for i in range(len('text')):
print(sentiment.sentiment(i))目前,它给出了以下错误AttributeError:'int‘对象没有属性’far‘,但我确信还有更多的错误在那里。我感谢你提供的任何帮助
发布于 2022-04-12 02:32:03
AttributeError:'int‘对象没有属性'lower’意味着整数不能被小写。这意味着在代码中的某个地方,您试图调用整数上的lower() string方法。
如果您查看您提供的情感分析文档,您将看到print(sentiment.sentiment("something"))将评估“某某物”的情绪,并给出1到0之间的分数。
我的猜测是,当您调用sentiment.sentiment("some text")时,它将使用lower()将传递给所有小写的文本进行转换。如果您要传递一个字符串,这会很好,但是您目前正在传递一个整数!
通过使用for i in range(),您将表示希望从0到结尾的数字范围。这意味着你的i将永远是一个整数!
您需要循环使用JSON数据来访问键/值对。“文本”不能像上面那样直接访问,但是在JSON数据中,它可以是!https://www.geeksforgeeks.org/json-with-python/
要查看的重要内容是您要访问的JSON数据的格式。首先,您需要访问一个名为“注释”的字典键。然而,“评论”里面是什么呢?
[{'author_name': 'Name', 'text': 'Comment text', 'created': 'Date'}]
它实际上是列表中另一个键值对的字典。假设列表索引从0开始,并且在您的示例中只有一个列表元素(字典),那么接下来我们需要使用索引0来访问字典。现在,我们将寻找关键的‘文本’,如你最初。
在学习python时,我强烈建议在尝试调试时使用大量的print语句!这可以帮助您查看程序所看到的内容,从而知道错误在哪里。
import json
from sentiment_analysis_spanish import sentiment_analysis
sentiment = sentiment_analysis.SentimentAnalysisSpanish()
f = open('WebScraping.json', encoding='utf-8-sig')
data = json.load(f)
print(data)
comments = data['comments']
print(comments)
text = comments[0]['text']
print(text)
sentimentScore = sentiment.sentiment(text)
print(sentimentScore)当您运行此程序时,输出将显示“数据”中的内容、“评论”中的内容、“文本”中的内容以及情感得分。
{'owner_url': 'https://www.facebook.com/########', 'url': 'https://www.facebook.com/post', 'name': 'Page name', 'date': 'date', 'post_text': 'Post title', 'media_url': 'media url attached', 'likes': 234, 'shares': 500, 'num_comments': 100, 'scrape_time': 'date', 'comments': [{'author_name': 'Name', 'text': 'Comment text', 'created': 'Date'}]}
[{'author_name': 'Name', 'text': 'Comment text', 'created': 'Date'}]
Comment text
0.49789225920557484这就是我所看到的“注释”里面是一个列表中的字典。
现在您已经了解了它是如何工作的,下面是一种更有效的方法来运行代码,而不需要所有额外的打印!您可以看到,我现在正在实现前面使用的for循环,因为在现实场景中可能有多个注释。
import json
from sentiment_analysis_spanish import sentiment_analysis
sentiment = sentiment_analysis.SentimentAnalysisSpanish()
f = open('WebScraping.json', encoding='utf-8-sig')
data = json.load(f)
comments = data['comments']
i = 0
for i in range (len(comments)):
comment = comments[i]['text']
sentimentScore = sentiment.sentiment(comment)
print(f"The sentiment score of this comment is {sentimentScore}.")
print(f"The comment was: '{comment}'.")这将导致以下输出。
The sentiment score of this comment is 0.49789225920557484.
The comment was: 'Comment 1'.
The sentiment score of this comment is 0.49789225920557484.
The comment was: 'Comment 2'.这是我用来参考的文件。
{
"owner_url": "https://www.facebook.com/########",
"url": "https://www.facebook.com/post",
"name": "Page name",
"date": "date",
"post_text": "Post title",
"media_url": "media url attached",
"likes": 234,
"shares": 500,
"num_comments": 100,
"scrape_time": "date",
"comments": [
{
"author_name": "Name",
"text": "Comment 1",
"created": "Date"
},
{
"author_name": "Name",
"text": "Comment 2",
"created": "Date"
}
]
}https://stackoverflow.com/questions/71836214
复制相似问题