在中文自然语言处理过程中,我们会遇到很多其他语言不会有的困难,其中一个困难就是分词。首先,因为中文的词与词之间没有空格,从而产生分词歧义的难题,不过目前很多语言模型已经能很好的解决这个难题了。其次,由于中文中存在很多没有被收录在分词词表中但必须切分出来的词,包括各类专有名词(人名、地名、机构名等)、新词等等,从而产生未登录词的难题,不过目前已经广泛使用命名实体识别(NER)来识别出名、地名、机构名等专有名词,较好的解决了专有名词的识别难题,而对于新词,可以利用N-Gram+凝聚度+自由度的方法来较好的解决。接下来,我将介绍利用N-Gram+凝聚度+自由度发现新词的方法,步骤如下:
步骤一、去掉文本中各种无用的符号
定义一个remove_syb函数,输入words字符串内容,去掉各种无用的符号,输出格式化之后的字符串
def remove_syb(words):
unused_words = u" \t\r\n,。:;“‘”【】『』|=+-——()*&……%¥#@!~·《》?/?<>,.;:'\"[]{}_)(^$!`"
unused_english = u"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
for i in unused_words:
words = words.replace(i, "")
for i in unused_english:
words = words.replace(i, "")
return words
步骤二、通过N-Gram分词后统计的词频和频率来找到词的边界
N-Gram分词(也称交叉切分算法),是指拆分成n个字符算一个关键字。 比如一元,就是一个汉字当成一个词语,建立成一个索引;二元的话,就是2个字符算一个词语,把所有可能出现的2个字符组合都拿出来。