如何在斯坦福中文分析器中不将英语分成单独的字母

时间:2015-05-24 16:42:58

标签: python nlp stanford-nlp segment chinese-locale

我在Python中使用http://nlp.stanford.edu/software/segmenter.shtml的Stanford Segmenter。对于中文分词,每当遇到英文单词时,它会将单词逐个分成多个字符,但我想在分割完成后将字符保持在一起。

例如:

你好abc我好 

目前将在分割后成为此

你好 a b c 我 好

但我希望它成为

你好 abc 我 好

有没有办法让分段师这样做?有这个设置吗?

我对此进行了搜索并且没有回答,并试图通过从文本中提取英文字符然后在分割完成后将其重新放入,然后实现了一种方式(花费6个小时)来完成此操作以有效的方式很难做到这一点。对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我不知道混合语言文本中的标记化,所以我建议使用以下hack:浏览文本,直到找到英文单词;这个单词之前的所有文本都可以被中文标记符标记化;英语单词可以作为另一个标记追加;重复。下面是代码示例。

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)。

答案 1 :(得分:0)

在应用斯坦福标记器之后,我只是搜索任何模式,其中一系列数字或英文字母用空格填充并以这种方式删除空格:

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'