处理自然语言处理问题,使用深度学习方法搭建神经网络。除去文本预处理,比如去除无关符号、停用词等,最基础的一步操作便是将文本中的词或者字映射成数字ID。下面主要用Tensorflow方法实现这种操作。
from tensorflow.contrib import learn
import numpy as np
import jieba
data = [
"自然语言处理将是人工智能发展中最瑰丽的皇冠",
"深度学习应用于工业生产将带来无限的可能",
"我爱NLP"
]
fit_data = ["谁将是自然语言处理的领头人,赋能工业"]
#自定义分词器
def tokenizer(fit_data):
tokenizer_document = []
for text in fit_data:
content = jieba.cut(text)
stopwords = [',', '。', '、']
outstr = ""
for word in content:
if word not in stopwords:
outstr += word
outstr += " "
tokenizer_document.append(outstr)
return tokenizer_document
#tf提供的工具,将数据填充为最大长度,默认0填充,其中还可以自定义分词器
vocab_processor = learn.preprocessing.VocabularyProcessor(10)
data = tokenizer(data)
x = np.array(list(vocab_processor.fit_transform(data)))
#查看建立的Tokenizer词表
vocab_dict = vocab_processor.vocabulary_._mapping
print(vocab_dict)
#{'<UNK>': 0, '自然语言': 1, '处理': 2, '将': 3, '是': 4, '人工智能': 5, '发展': 6, '中': 7, '最': 8, '瑰丽': 9, '的': 10, '皇冠': 11, '深度': 12, '学习': 13, '应用': 14, '于': 15, '工业生产': 16, '带来': 17, '无限': 18, '可能': 19, '我': 20, '爱': 21, 'NLP': 22}
#保存词表
vocab_processor.save("vocab")
#加载词表
vocab_path = "vocab"
vocab_processor = learn.preprocessing.VocabularyProcessor.restore(vocab_path)
#将新句子映射成数字ID序列,其中不在词表中会默认填充为0
x_raw = tokenizer(fit_data)
x_test = np.array(list(vocab_processor.transform(x_raw)))
print(x_test)
#[[ 0 3 4 1 2 10 0 0 0 0]]
需要注意的一点是,我们需要定义分词器,不然得到的是将整句作用一个Token。