如何在 Stanford Chinese Parser 中不将英文拆分为单独的字母
How to not split English into separate letters in the Stanford Chinese Parser
我在 Python 的 http://nlp.stanford.edu/software/segmenter.shtml 使用 Stanford Segmenter。对于中文分词器,每当遇到英文单词时,它都会将单词一个一个地拆分成许多字符,但我想在分词后将字符保持在一起。
例如:
你好abc我好
目前分割后会变成这样
你好 a b c 我 好
但我希望它变成
你好 abc 我 好
有没有办法教分段器做到这一点?有这个设置吗?
我用谷歌搜索了这个但没有答案,并试图通过从文本中提取英文字符然后在分割完成后将它们放回原处来拼凑一种方法(花了 6 个小时)来做到这一点,但意识到很难以有效的方式做到这一点。如有任何帮助,我们将不胜感激。
我不知道混合语言文本中的标记化,所以我建议使用以下 hack:浏览文本,直到找到英文单词;这个词之前的所有文本都可以被 Chinese tokenizer 分词;英文单词可以附加为另一个标记;重复。下面是代码示例。
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)。
应用 Stanford 分词器后,我将简单地搜索任何模式,其中一串数字或英文字母带有 space 并以这种方式删除 space:
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'
我在 Python 的 http://nlp.stanford.edu/software/segmenter.shtml 使用 Stanford Segmenter。对于中文分词器,每当遇到英文单词时,它都会将单词一个一个地拆分成许多字符,但我想在分词后将字符保持在一起。
例如:
你好abc我好
目前分割后会变成这样
你好 a b c 我 好
但我希望它变成
你好 abc 我 好
有没有办法教分段器做到这一点?有这个设置吗?
我用谷歌搜索了这个但没有答案,并试图通过从文本中提取英文字符然后在分割完成后将它们放回原处来拼凑一种方法(花了 6 个小时)来做到这一点,但意识到很难以有效的方式做到这一点。如有任何帮助,我们将不胜感激。
我不知道混合语言文本中的标记化,所以我建议使用以下 hack:浏览文本,直到找到英文单词;这个词之前的所有文本都可以被 Chinese tokenizer 分词;英文单词可以附加为另一个标记;重复。下面是代码示例。
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)。
应用 Stanford 分词器后,我将简单地搜索任何模式,其中一串数字或英文字母带有 space 并以这种方式删除 space:
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'