Blog Post

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  mai vedem.
Este asta propoziția 3?
Propoziția 4 e cea mai tare!
Acum  vedem dacă merge.