【发布时间】:2017-07-11 18:23:08
【问题描述】:
我有一个评论数据集,我想使用 NLP 技术对其进行处理。我做了所有的预处理阶段(删除停用词、词干等)。我的问题是有些词是相互关联的,而我的函数不理解这些词。这是一个例子:
Great services. I had a nicemeal and I love it a lot.
我怎样才能将它从 nicemeal 改成 nicemeal?
【问题讨论】:
标签: python-3.x nlp tokenize
我有一个评论数据集,我想使用 NLP 技术对其进行处理。我做了所有的预处理阶段(删除停用词、词干等)。我的问题是有些词是相互关联的,而我的函数不理解这些词。这是一个例子:
Great services. I had a nicemeal and I love it a lot.
我怎样才能将它从 nicemeal 改成 nicemeal?
【问题讨论】:
标签: python-3.x nlp tokenize
Peter Norvig 可以很好地解决您遇到的分词问题。长话短说,他使用了一个包含单词(和二元组)频率的大型数据集和一些动态编程来将连接的长字符串拆分成最可能的分段。
您下载带有源代码和词频的zip file,并根据您的用例进行调整。为了完整起见,这里是相关的部分。
def memo(f):
"Memoize function f."
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
@memo
def segment(text):
"Return a list of words that is the best segmentation of text."
if not text: return []
candidates = ([first]+segment(rem) for first,rem in splits(text))
return max(candidates, key=Pwords)
def splits(text, L=20):
"Return a list of all possible (first, rem) pairs, len(first)<=L."
return [(text[:i+1], text[i+1:])
for i in range(min(len(text), L))]
def Pwords(words):
"The Naive Bayes probability of a sequence of words."
return product(Pw(w) for w in words)
#### Support functions (p. 224)
def product(nums):
"Return the product of a sequence of numbers."
return reduce(operator.mul, nums, 1)
class Pdist(dict):
"A probability distribution estimated from counts in datafile."
def __init__(self, data=[], N=None, missingfn=None):
for key,count in data:
self[key] = self.get(key, 0) + int(count)
self.N = float(N or sum(self.itervalues()))
self.missingfn = missingfn or (lambda k, N: 1./N)
def __call__(self, key):
if key in self: return self[key]/self.N
else: return self.missingfn(key, self.N)
def datafile(name, sep='\t'):
"Read key,value pairs from file."
for line in file(name):
yield line.split(sep)
def avoid_long_words(key, N):
"Estimate the probability of an unknown word."
return 10./(N * 10**len(key))
N = 1024908267229 ## Number of tokens
Pw = Pdist(datafile('count_1w.txt'), N, avoid_long_words)
您也可以使用segment2 方法,因为它使用二元组并且更准确。
【讨论】: