Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #28253 > unrolled thread

The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'

Started byToken Type <typetoken@gmail.com>
First post2012-09-02 02:39 -0700
Last post2012-09-02 16:12 +0200
Articles 4 — 3 participants

Back to article view | Back to comp.lang.python


Contents

  The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert' Token Type <typetoken@gmail.com> - 2012-09-02 02:39 -0700
    Re: The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert' Dave Angel <d@davea.name> - 2012-09-02 07:10 -0400
    Re: Fwd: The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert' Dave Angel <d@davea.name> - 2012-09-02 09:51 -0400
    Re: The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert' Peter Otten <__peter__@web.de> - 2012-09-02 16:12 +0200

#28253 — The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'

FromToken Type <typetoken@gmail.com>
Date2012-09-02 02:39 -0700
SubjectThe method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'
Message-ID<58dd6730-9c37-4b90-9dbc-2724300ff5f4@googlegroups.com>
I wrote codes to add 'like' at the end of every 3 word in a nltk text as follows:

>>> text = nltk.corpus.brown.words(categories = 'news')
>>> def hedge(text):
	for i in range(3,len(text),4):
		new_text = text.insert(i, 'like')
	return new_text[:50]

>>> hedge(text)

Traceback (most recent call last):
  File "<pyshell#77>", line 1, in <module>
    hedge(text)
  File "<pyshell#76>", line 3, in hedge
    new_text = text.insert(i, 'like')
AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'

Isn't text in the brown corpus above a list? why doesn't it has attribute 'insert'?

Thanks much for your hints.

[toc] | [next] | [standalone]


#28263

FromDave Angel <d@davea.name>
Date2012-09-02 07:10 -0400
Message-ID<mailman.80.1346584263.27098.python-list@python.org>
In reply to#28253
On 09/02/2012 05:39 AM, Token Type wrote:
> I wrote codes to add 'like' at the end of every 3 word in a nltk text as follows:
>
>>>> text = nltk.corpus.brown.words(categories = 'news')
>>>> def hedge(text):
> 	for i in range(3,len(text),4):
> 		new_text = text.insert(i, 'like')
> 	return new_text[:50]
>
>>>> hedge(text)
> Traceback (most recent call last):
>   File "<pyshell#77>", line 1, in <module>
>     hedge(text)
>   File "<pyshell#76>", line 3, in hedge
>     new_text = text.insert(i, 'like')
> AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'
>
> Isn't text in the brown corpus above a list? why doesn't it has attribute 'insert'?
>
I tried to find online documentation for nltk, and although I found the
mention of a free online book, I didn't see it.  So, some generic comments.

The error message is telling you that the object 'text' is not a list,
but a "ConcatenatedCorpusView".  Perhaps you can look that up in your
docs for nltk.  But there's quite a bit you can do just with the
interpreter.

try   print type(text)   to see the type of text.

try   dir(text)   to see what attributes it has

try   help(text)  to see what  docstrings might be built in.

Incidentally, if you really think it's a list of words (or that it acts
like a list), then 'text' might not be the best name for it.  Any reason
you didn't just call it words ?

-- 

DaveA

[toc] | [prev] | [next] | [standalone]


#28274 — Re: Fwd: The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'

FromDave Angel <d@davea.name>
Date2012-09-02 09:51 -0400
SubjectRe: Fwd: The method of insert doesn't work with nltk texts: AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'
Message-ID<mailman.88.1346593882.27098.python-list@python.org>
In reply to#28253
On 09/02/2012 09:06 AM, John H. Li wrote:
> First, thanks very much for your kind help.
>
> 1)Further more, I test the function of insert. It did work as follows:
>
>>>> text = ['The', 'Fulton', 'County', 'Grand']
>>>> text.insert(3,'like')
>>>> text
> ['The', 'Fulton', 'County', 'like', 'Grand']
> 2) I tested the text from nltk. It is list actually. See the following:
>>>> text = nltk.corpus.brown.words(categories = 'news')
>>>> text[:10]
> ['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', 'Friday', 'an',
> 'investigation', 'of']
>
> How come python tells me that it is not a list by prompting "AttributeError:
> 'ConcatenatedCorpusView' object has no attribute 'insert'"? I am confused.
>
> Since we doubt text is not a list, I have to add one more line of code
> there as follows. Then it seems working.
>>>> text = nltk.corpus.brown.words(categories = 'news')
>>>> def hedge(text):
> text = list(text)
> for i in range(3,len(text),4):
>  text.insert(i, 'like')
> return text[:50]
>
>>>> hedge(text)
> ['The', 'Fulton', 'County', 'like', 'Grand', 'Jury', 'said', 'like',
> 'Friday', 'an', 'investigation', 'like', 'of', "Atlanta's", 'recent',
> 'like', 'primary', 'election', 'produced', 'like', '``', 'no', 'evidence',
> 'like', "''", 'that', 'any', 'like', 'irregularities', 'took', 'place',
> 'like', '.', 'The', 'jury', 'like', 'further', 'said', 'in', 'like',
> 'term-end', 'presentments', 'that', 'like', 'the', 'City', 'Executive',
> 'like', 'Committee', ',']
>
> Isn't it odd?
>
>

Without reading the documentation, or at least the help(), I can't
figure it to be odd.  If a class wants to support slicing semantics, all
it has to do is implement special methods like __getslice__ and
__setslice__.  If it doesn't document .insert(), then you shouldn't try
to call it.  Duck-typing.

What did you get when you tried type(), dir() and help() ?  Did they help.

-- 

DaveA

[toc] | [prev] | [next] | [standalone]


#28275

FromPeter Otten <__peter__@web.de>
Date2012-09-02 16:12 +0200
Message-ID<mailman.89.1346595132.27098.python-list@python.org>
In reply to#28253
Token Type wrote:

> I wrote codes to add 'like' at the end of every 3 word in a nltk text as 
follows:
> 
> >>> text = nltk.corpus.brown.words(categories = 'news')
> >>> def hedge(text):
>         for i in range(3,len(text),4):
>                 new_text = text.insert(i, 'like')
>         return new_text[:50]
> 
> >>> hedge(text)
> 
> Traceback (most recent call last):
>   File "<pyshell#77>", line 1, in <module>
>     hedge(text)
>   File "<pyshell#76>", line 3, in hedge
>     new_text = text.insert(i, 'like')
> AttributeError: 'ConcatenatedCorpusView' object has no attribute 'insert'
> 
> Isn't text in the brown corpus above a list? why doesn't it has attribute 
'insert'?
> 
> Thanks much for your hints.

The error message shows that text is not a list. It looks like a list,

>>> text = nltk.corpus.brown.words(categories="news")
>>> text
['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', ...]

but it is actually a nltk.corpus.reader.util.ConcatenatedCorpusView:

>>> type(text)
<class 'nltk.corpus.reader.util.ConcatenatedCorpusView'>

The implementer of a class is free to decide what methods he wants to 
implement. You can get a first impression of the available ones with dir():

>>> dir(text)
['_MAX_REPR_SIZE', '__add__', '__class__', '__cmp__', '__contains__', 
'__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', 
'__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', 
'__mul__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', 
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'__weakref__', '_offsets', '_open_piece', '_pieces', 'close', 'count', 
'index', 'iterate_from']

As you can see insert() is not among these methods. However, __iter__() is a 
hint that you can convert the ConcatenatedCorpusView to a list, and that 
does provide an insert() method. Let's try:

>>> text = list(text)
>>> type(text)
<type 'list'>
>>> text.insert(0, "yadda")
>>> text[:5]
['yadda', 'The', 'Fulton', 'County', 'Grand']

Note that your hedge() function may still not work as you expect:

>>> text = ["-"] * 20
>>> text
['-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', 
'-', '-', '-', '-', '-']
>>> for i in range(0, len(text), 3):
...     text.insert(i, "X")
... 
>>> text
['X', '-', '-', 'X', '-', '-', 'X', '-', '-', 'X', '-', '-', 'X', '-', '-', 
'X', '-', '-', 'X', '-', '-', '-', '-', '-', '-', '-', '-']

That is because the list is growing with every insert() call. One workaround 
is to start inserting items at the end of the list:
>>> text = ["-"] * 20
>>> for i in reversed(range(0, len(text), 3)):
...     text.insert(i, "X")
... 
>>> text
['X', '-', '-', '-', 'X', '-', '-', '-', 'X', '-', '-', '-', 'X', '-', '-', 
'-', 'X', '-', '-', '-', 'X', '-', '-', '-', 'X', '-', '-']

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web