通过使用 Python 插入代码字来修改语料库
Posted
技术标签:
【中文标题】通过使用 Python 插入代码字来修改语料库【英文标题】:Modifying corpus by inserting codewords using Python 【发布时间】:2015-06-30 15:16:04 【问题描述】:我有一个 csv 文件(或 txt 文件)中的语料库(30,000 条客户评论)。这意味着每个客户评论都是文本文件中的一行。一些例子是:
这辆自行车很棒,但是刹车很差 这个制冰机很好用,价格也很公道,有些不好 制冰机的气味 食物很棒,但是水很粗鲁我想将这些文本更改为以下内容:
这辆自行车很棒 正面,但刹车很差 负面 这台制冰机做工很好,价格也很合理 正面,制冰机发出一些不好的负面气味 食物很棒 正面,但水很粗鲁 负面我有两个单独的正面词和负面词列表(词典)。例如,一个文本文件包含这样的积极词:
太棒了 太棒了 太棒了 很酷 合理 漂亮 快 好吃 种类而且,一个文本文件包含如下否定词:
粗鲁 可怜 最糟糕的 脏 慢 不好所以,我想要读取客户评论的 Python 脚本:当找到任何正面词时,在正面词之后插入“POSITIVE”;当找到任何否定词时,在肯定词后插入“NEGATIVE”。
这是我迄今为止测试过的代码。这可行(请参阅下面代码中的我的 cmets),但它需要改进以满足我上述的需求。
具体来说,my_escaper
有效(此代码找到诸如便宜和好之类的词,并将它们替换为便宜的积极和好积极),但问题是我有两个文件(词典),每个包含大约千个正面/负面字。所以我想要的是代码从词典中读取这些单词列表,在语料库中搜索它们,并在语料库中替换这些单词(例如,从“好”到“好积极”,从“坏”到“坏”负")。
#adapted from http://***.com/questions/6116978/python-replace-multiple-strings
import re
def multiple_replacer(*key_values):
replace_dict = dict(key_values)
replacement_function = lambda match: replace_dict[match.group(0)]
pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M)
return lambda string: pattern.sub(replacement_function, string)
def multiple_replace(string, *key_values):
return multiple_replacer(*key_values)(string)
#this my_escaper works (this code finds such words as cheap and good and replace them with cheap POSITIVE and good POSITIVE), but the problem is that I have two files (lexicons), each containing about thousand positive/negative words. So what I want is that the codes read those word lists from the lexicons, search them in the corpus, and replace those words in the corpus (for example, from "good" to "good POSITIVE", from "bad" to "bad NEGATIVE")
my_escaper = multiple_replacer(('cheap','cheap POSITIVE'), ('good', 'good POSITIVE'), ('avoid', 'avoid NEGATIVE'))
d = []
with open("review.txt","r") as file:
for line in file:
review = line.strip()
d.append(review)
for line in d:
print my_escaper(line)
【问题讨论】:
您可能想尝试使它更具可读性。 它以什么方式工作,却无法满足您的需求? 我已经添加了关于什么有效以及什么需要更多的解释。希望这对你有意义。谢谢。 【参考方案1】:对此进行编码的一种简单方法是将词典中的肯定词和否定词加载到单独的集合中。然后,对于每条评论,将句子拆分为单词列表,并在情感集中查找每个单词。检查集成员资格是O(1) in the average case。将情感标签(如果有)插入单词列表,然后加入以构建最终字符串。
例子:
import re
reviews = [
"This bike is amazing, but the brake is very poor",
"This ice maker works great, the price is very reasonable, some bad smell from the ice maker",
"The food was awesome, but the water was very rude"
]
positive_words = set(['amazing', 'great', 'awesome', 'reasonable'])
negative_words = set(['poor', 'bad', 'rude'])
for sentence in reviews:
tagged = []
for word in re.split('\W+', sentence):
tagged.append(word)
if word.lower() in positive_words:
tagged.append("POSITIVE")
elif word.lower() in negative_words:
tagged.append("NEGATIVE")
print ' '.join(tagged)
虽然这种方法很简单,但也有一个缺点:由于使用了re.split()
,您会丢失标点符号。
【讨论】:
哇!在 csv 或 txt 中生成输出文件的任何建议?非常感谢您的洞察力! 要将生成的句子写入文本文件,您可以使用 print() 函数或文件对象的 write() 方法。见***.com/questions/6159900/…。【参考方案2】:如果我理解正确,你需要这样的东西:
if word in POSITIVE_LIST:
pattern.sub(replacement_function, word+" POSITIVE")
if word in NEGATIVE_LIST:
pattern.sub(replacement_function, word+" NEGATIVE")
你没事吧?
【讨论】:
以上是关于通过使用 Python 插入代码字来修改语料库的主要内容,如果未能解决你的问题,请参考以下文章
python+NLTK 自然语言学习处理四:获取文本语料和词汇资源
在 NLTK 中使用我自己的语料库而不是 movie_reviews 语料库进行分类