Как не разбивать английский язык на отдельные буквы в Stanford Chinese Parser

Я использую Stanford Segmenter по адресу http://nlp.stanford.edu/software/segmenter.shtml в Питоне. Для китайского сегментатора всякий раз, когда он встречает английское слово, он будет разбивать слово на множество символов один за другим, но я хочу сохранить символы вместе после завершения сегментации.

Например:

你好abc我好 

в настоящее время станет таким после сегментации

你好 a b c 我 好

но я хочу, чтобы это стало

你好 abc 我 好

Есть ли способ научить сегментер делать это? Есть ли для этого настройка?

Я погуглил это и не получил ответа, и попытался взломать способ (потратив на это 6 часов), чтобы сделать это, вытащив английские символы из текста, а затем вернув их после завершения сегментации, но понял, что это очень трудно сделать это эффективно. Любая помощь по этому вопросу будет принята с благодарностью.


person Kevin Zhao    schedule 24.05.2015    source источник


Ответы (2)


Я не знаю про токенизацию в смешанных текстах, поэтому предлагаю использовать следующий хак: пройтись по тексту, пока не найдете английское слово; весь текст перед этим словом может быть токенизирован китайским токенизатором; Английское слово может быть добавлено как еще одна лексема; повторение. Ниже приведен пример кода.

import re
pat = re.compile("[A-Za-z]+")
for sentence in text:
    sent_tokens = []
    prev_end = 0
    for match in re.finditer(pat, sentence):
        print match.start(0), match.end(0), match.group(0)
        chinese_part = sentence[prev_end:match.start(0)]
        sent_tokens += tokenize(chinese_part)
        sent_tokens.append(match.group(0))
        prev_end = match.end(0)
    last_chinese_part = sentence[prev_end:]
    sent_tokens += tokenize(last_chinese_part)
    print sent_tokens

Я думаю, что эффективность сравнима с одиночной токенизацией китайским токенизатором, поскольку единственные накладные расходы связаны с применением регулярных выражений, которые на самом деле являются просто автоматом с конечным состоянием и работают как O (n).

person Nikita Astrakhantsev    schedule 24.05.2015
comment
Большое спасибо! Это полностью решает мою проблему. - person Kevin Zhao; 24.05.2015
comment
Это дало мне большую часть пути к решению. Мне также пришлось добавить регулярное выражение, чтобы предотвратить разделение URL-адресов. - person Paul; 24.01.2017
comment
Меня это очень беспокоит. И теперь я думаю, что разделить его на китайскую и дополнительную часть — это действительно хорошее решение. Большое спасибо. - person 小文件; 10.02.2018

После применения Стэнфордского токенизатора я просто искал любой шаблон, в котором последовательность чисел или английских букв приправлены пробелами, и удалял пробелы следующим образом:

re.sub(r'(?<=\w)\s(?=\w)', '', u'\u5982\u4f55 \u767b\u5f55 C o n c u r \u7cfb\u7edf \uff1f\n')

Который дает:

u'\u5982\u4f55 \u767b\u5f55 Concur \u7cfb\u7edf \uff1f\n'
person Hendrik    schedule 06.07.2017