Gensim предложения из онтологии корпус Unicode ошибка - PullRequest
0 голосов
/ 16 мая 2019

Я на Windows OS10, использую python 2.7.15 | Anaconda. Всякий раз, когда я бегу

mymodel=gensim.models.Word2Vec.load (pretrain)
mymodel.min_count = mincount
sentences =gensim.models.word2vec.LineSentence('ontology_corpus.lst')
mymodel.build_vocab(sentences, update=True) # ERROR HERE ****

Я получаю эту ошибку:

Traceback (most recent call last):
  File "runWord2Vec.py", line 23, in <module>
    mymodel.build_vocab(sentences, update=True)
  File "C:xxxx\lib\site-packages\gensim\models\ba
se_any2vec.py", line 936, in build_vocab
    sentences=sentences, corpus_file=corpus_file, progress_per=progress_per, tri
m_rule=trim_rule)
  File "C:xxxx\lib\site-packages\gensim\models\wo
rd2vec.py", line 1591, in scan_vocab
    total_words, corpus_count = self._scan_vocab(sentences, progress_per, trim_r
ule)
  File "C:xxxxx\lib\site-packages\gensim\models\wo
rd2vec.py", line 1560, in _scan_vocab
    for sentence_no, sentence in enumerate(sentences):
  File "C:xxxx\lib\site-packages\gensim\models\wo
rd2vec.py", line 1442, in __iter__
    line = utils.to_unicode(line).split()
  File "C:xxxx\lib\site-packages\gensim\utils.py"
, line 359, in any2unicode
    return unicode(text, encoding, errors=errors)
  File "C:xxxxx\lib\encodings\utf_8.py", line 16,
in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe6 in position 124: invalid
 continuation byte

Теперь это восходит к этому классу LineSentence

class LineSentence(object):

def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None):

    self.source = source
    self.max_sentence_length = max_sentence_length
    self.limit = limit

def __iter__(self):
    """Iterate through the lines in the source."""
    try:
        # Assume it is a file-like object and try treating it as such
        # Things that don't have seek will trigger an exception
        self.source.seek(0)
        for line in itertools.islice(self.source, self.limit):
            line = utils.to_unicode(line).split()
            i = 0
            while i < len(line):
                yield line[i: i + self.max_sentence_length]
                i += self.max_sentence_length
    except AttributeError:
        # If it didn't work like a file, use it as a string filename
        with utils.smart_open(self.source) as fin:
            for line in itertools.islice(fin, self.limit):
                line = utils.to_unicode(line).split() # ERROR HERE *************
                i = 0
                while i < len(line):
                    yield line[i: i + self.max_sentence_length]
                    i += self.max_sentence_length

В последнем возвращении, которое видно из ошибки, я могу просто изменить параметр ошибки на error = 'ignore' или изменить эту строку:

 utils.to_unicode(line).split()

к этому:

 line.split()

Пример файла ontology_corpus.lst:

<http://purl.obolibrary.org/obo/GO_0090141> EquivalentTo <http://purl.obolibrary.org/obo/GO_0065007> and  <http://purl.obolibrary.org/obo/RO_0002213> some <http://purl.obolibrary.org/obo/GO_0000266> 
<http://purl.obolibrary.org/obo/GO_0090141> SubClassOf <http://purl.obolibrary.org/obo/GO_0065007>

Проблема в том, что он работает, но я боюсь, что результаты будут ошибочными из-за игнорируемой ошибки кодирования! Есть ли решение для этого или мой подход будет хорошо?

1 Ответ

1 голос
/ 16 мая 2019

Вероятно, это связано с тем, что некоторые строки или строки в вашем файле содержат данные, которые не имеют надлежащей UTF8-кодировки.

Если build_vocab() в противном случае преуспеет, это может не иметь большого значения в ваших окончательных результатах, если искажение является непреднамеренным, редким или не затрагивает векторы слов, которые вас особенно интересуют. (Примеры строк не содержит повреждений UTF8 или символов, которые могут иметь проблемы с кодировкой.)

Но если это проблема, вы можете попытаться определить точную строку с проблемой, прочитав sentences, чтобы вызвать ошибку за пределами build_vocab(). Например:

for i, sentence in enumerate(sentences):
    print(i)

Где он останавливается (если это ошибка, которая завершает итерацию), или где сообщение об ошибке чередуется с номерами строк, подскажет вам строку (строки), где есть проблема. Вы можете проверить их в текстовом редакторе, чтобы увидеть, какие символы задействованы. Затем вы можете рассмотреть возможность удаления / изменения этих символов или попытки обнаружить истинную кодировку файла и перекодировать его как UTF8, используя это знание задействованных диапазонов / символов.

(Отдельное примечание о вашем кажущемся корпусе: обратите внимание, что обучение словосочетанию лучше всего, если множество альтернативных примеров одного токена распространено по всему корпусу, чередуя с контрастными примерами других токенов. Так что, если ваш корпус является дампом из какого-то другого источника, который объединяет все связанные токены, например, скажем <http://purl.obolibrary.org/obo/GO_0090141>, вы можете получить несколько улучшенных конечных векторов, если перетасуете линии перед тренировкой.)

...