NLP中的文本分析和特征工程( 四 )

NLP中的文本分析和特征工程

文章插图
 
类别和情绪之间是否存在某种模式?
 
NLP中的文本分析和特征工程

文章插图
 
除了政治新闻偏于负面,科技新闻偏于正面,大多数新闻标题的情绪都是中性的 。
命名实体识别NER (named -entity recognition)是将非结构化文本中提到的命名实体用预定义的类别(如人名、组织、位置、时间表达式、数量等)标记的过程 。
训练一个NER模型是非常耗时的,因为它需要一个非常丰富的数据集 。幸运的是已经有人替我们做了这项工作 。最好的开源NER工具之一是SpaCy 。它提供了能够识别几种实体类别的不同NLP模型 。
 
NLP中的文本分析和特征工程

文章插图
 
我将用SpaCy模型encoreweb_lg(训练于web数据的英语大模型)来举例说明我们通常的标题(原始文本,非预处理):
## call modelner = spacy.load("en_core_web_lg")## tag text txt = dtf["text"].iloc[0] doc = ner(txt)## display result spacy.displacy.render(doc, style="ent")
NLP中的文本分析和特征工程

文章插图
 
但是我们如何把它变成一个有用的特性呢?这就是我要做的:
对数据集中的每个文本观察运行NER模型,就像我在上一个示例中所做的那样 。
对于每个新闻标题,我将把所有已识别的实体放在一个新列(名为“tags”)中,并将同一实体在文本中出现的次数一并列出 。在本例中,将是
{ (‘Will Smith’, ‘PERSON’):1,
(‘Diplo’, ‘PERSON’):1,
(‘Nicky Jam’, ‘PERSON’):1,
(“The 2018 World Cup’s”, ‘EVENT’):1 }
然后我将为每个标签类别(Person, Org, Event,…)创建一个新列,并计算每个标签类别中发现的实体的数量 。在上面的例子中,特性是
tags_PERSON = 3
tags_EVENT = 1
## tag text and exctract tags into a listdtf["tags"] = dtf["text"].apply(lambda x: [(tag.text, tag.label_)                                  for tag in ner(x).ents] )## utils function to count the element of a list def utils_lst_count(lst):     dic_counter = collections.Counter()     for x in lst:         dic_counter[x] += 1     dic_counter = collections.OrderedDict(                       sorted(dic_counter.items(),                       key=lambda x: x[1], reverse=True))     lst_count = [ {key:value} for key,value in dic_counter.items() ]     return lst_count ## count tags dtf["tags"] = dtf["tags"].apply(lambda x: utils_lst_count(x)) ## utils function create new column for each tag category def utils_ner_features(lst_dics_tuples, tag):     if len(lst_dics_tuples) > 0:         tag_type = []         for dic_tuples in lst_dics_tuples:             for tuple in dic_tuples:                 type, n = tuple[1], dic_tuples[tuple]                 tag_type = tag_type + [type]*n                 dic_counter = collections.Counter()                 for x in tag_type:                     dic_counter[x] += 1         return dic_counter[tag]     else:         return 0 ## extract features tags_set = [] for lst in dtf["tags"].tolist():      for dic in lst:           for k in dic.keys():               tags_set.append(k[1]) tags_set = list(set(tags_set)) for feature in tags_set:      dtf["tags_"+feature] = dtf["tags"].apply(lambda x:                               utils_ner_features(x, feature)) ## print result dtf.head()


推荐阅读