Python NLTK, analiză de text
Nov. 11, 2016, 12:40 p.m. TestCat python NLP
Primele încercări cu python și NLTK pentru analize de text în limba română. Prima chestie este că spre deosebire de limba engleză trebuie să avem grijă la translatarea utf8 unicode text.
(nltk)MBP:nltk je$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk.tokenize import sent_tokenize
>>> text = "Acesta este un paragraf cu propoziții și diacritice. Aici e propoziția 2, apoi o să mai vedem. Este asta propoziția 3? Propoziția 4 e cea mai tare! Acum să vedem dacă merge."
>>> sent_tokenize_list = sent_tokenize(text)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/__init__.py", line 91, in sent_tokenize
return tokenizer.tokenize(text)
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1226, in tokenize
return list(self.sentences_from_text(text, realign_boundaries))
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1274, in sentences_from_text
return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1265, in span_tokenize
return [(sl.start, sl.stop) for sl in slices]
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1304, in _realign_boundaries
for sl1, sl2 in _pair_iter(slices):
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 311, in _pair_iter
for el in it:
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1280, in _slices_from_text
if self.text_contains_sentbreak(context):
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1325, in text_contains_sentbreak
for t in self._annotate_tokens(self._tokenize_words(text)):
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 1460, in _annotate_second_pass
for t1, t2 in _pair_iter(tokens):
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 310, in _pair_iter
prev = next(it)
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 577, in _annotate_first_pass
for aug_tok in tokens:
File "/Users/je/nltk/lib/python2.7/site-packages/nltk/tokenize/punkt.py", line 542, in _tokenize_words
for line in plaintext.split('\n'):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc8 in position 10: ordinal not in range(128)
>>> sent_tokenize_list = sent_tokenize(text.decode("utf8"))
>>> len(sent_tokenize_list)
5
>>> sent_tokenize_list
[u'Acesta este un paragraf cu propozi\xc8\x9bii \xc8\x99i diacritice.', u'Aici e propozi\u021bia 2, apoi o s\u0103 mai vedem.', u'Este asta propozi\u021bia 3?', u'Propozi\u021bia 4 e cea mai tare!', u'Acum s\u0103 vedem dac\u0103 merge.']
>>> [x.encode("utf8") for x in sent_tokenize_list]
['Acesta este un paragraf cu propozi\xc8\x9bii \xc8\x99i diacritice.', 'Aici e propozi\xc8\x9bia 2, apoi o s\xc4\x83 mai vedem.', 'Este asta propozi\xc8\x9bia 3?', 'Propozi\xc8\x9bia 4 e cea mai tare!', 'Acum s\xc4\x83 vedem dac\xc4\x83 merge.']
>>> for x in sent_tokenize_list:
... print x
...
Acesta este un paragraf cu propoziții și diacritice.
Aici e propoziția 2, apoi o să mai vedem.
Este asta propoziția 3?
Propoziția 4 e cea mai tare!
Acum să vedem dacă merge.