2017-06-15 95 views
1

有人可以帮助我吗?我有这个错误。我想循环并将wordnet中的所有数据插入到excel的不同列中。它将首先读取一列的Excel文件。然后,它将创建其他excel并为每个单词生成一行和不同列的同义词。TypeError:'set'对象不支持Excel中的索引

此代码生成同义词都在一列:

import nltk 
import xlrd 
import csv 
import xlwt 
import xlsxwriter 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
from nltk.corpus import wordnet 

workbook = xlrd.open_workbook('C:\\Users\\runeza\Desktop\database.xlsx') 
sheet_names = workbook.sheet_names() 
sheet = workbook.sheet_by_name(sheet_names[0]) 

wb = xlwt.Workbook() 
ws = wb.add_sheet("test") 
for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 
     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       #print(l.name()) 
       synonyms.append(l.name()) 
       a = set(synonyms) 
     #print (a) 
     ws.write(row_idx, col_idx,",".join(a)) 

wb.save("sample.xls") 

我已经修改了代码,以正确放置的话在不同的列:

import nltk 
import xlrd 
import csv 
import xlwt 
import xlsxwriter 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
from nltk.corpus import wordnet 

workbook = xlrd.open_workbook('C:\\Users\\runeza\Desktop\database.xlsx') 
sheet_names = workbook.sheet_names() 
sheet = workbook.sheet_by_name(sheet_names[0]) 

wb = xlwt.Workbook() 
ws = wb.add_sheet("test") 

for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 

     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       synonyms.append(l.name()) 
       a = set(synonyms) 
     #print (a) 

     for col_idx in range(len(a)): 
      for row_idx in range(len(a[col_idx])): 
       ws.write(col_idx, row_idx, a[col_idx][row_idx]) 

wb.save("sample.xls") 

但它给这个错误:

Traceback (most recent call last): 
    File "C:\Users\runeza\Documents\PythonCode\outputfile.py", line 29, in <module> 
    for row_idx in range(len(a[col_idx])): 
TypeError: 'set' object does not support indexing 

这就是我的(C:\ Users \ runeza \ Desktop \ database.xlsx)的样子:

existing sheet

这是我期望的结果:

enter image description here

+0

我真的不能帮你,除非我能看到的文件,我不能告诉你有什么去做。显然,从你的错误错误,首先你在'col_idx'的两个不同循环中使用相同的变量,其次对象不支持索引意味着你不能通过索引访问它。 –

+0

请粘贴“C:\\ Users \\ runeza \ Desktop \ database.xlsx”文件以查看问题。 – saul

+0

我已编辑问题并插入文档的外观。 @ElvirMuslic – runeza

回答

0

您的需求,我认为list将是一个更好的选择。 set对象不支持索引(如[0])。

假设同义词是被添加到rightside细胞,你可以这样做:

for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 

     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       synonyms.append(l.name()) 

     # Making the list elements distinct. 
     synonyms = list(set(synonyms)) 

     for i in range(len(a)): 
      ws.write(row_idx, col_idx+i, synonyms[i]) # Made an edit here. 

wb.save("sample.xls") 
+0

我已经编辑了你的代码“ws.write(row_idx,col_idx + i,synonyms同义词[i]”,它的工作就像我期待的那样,然而,我使用的同义词来自wordnet,如果我重复相同的单词'我没有使用集 – runeza

+0

我已经编辑我的问题,并显示我期待的结果。现在唯一的问题是从wordnet提供的同义词是不断重复,我不知道如何解决它,而不是使用集 – runeza

+0

@runeza列表元素可以通过将其转换为集合然后返回列表来区分。我已经将它添加到答案中。 – akhilsp