我的 NLTK 代码几乎可以满足我的需求,但还不够
My NLTK code almost does what I need it to, but not quite
代码:
def add_lexical_features(fdist, feature_vector):
for word, freq in fdist.items():
fname = "unigram:{0}".format(word)
if selected_features == None or fname in selected_features:
feature_vector[fname] = 1
if selected_features == None or fname in selected_features:
feature_vector[fname] = float(freq) / fdist.N()
print(feature_vector)
if __name__ == '__main__':
file_name = "restaurant-training.data"
p = process_reviews(file_name)
for i in range(0, len(p)):
print(p[i]+ "\n")
uni_dist = nltk.FreqDist(p[0])
feature_vector = {}
x = add_lexical_features(uni_dist, feature_vector)
它试图做的是输出评论列表中单词的频率(p 是评论列表,p[0] 是字符串)。这行得通....除了它是通过字母而不是我的话来实现的。
我还是 NLTK 的新手,所以这可能很明显,但我真的无法理解。
例如,这当前会输出大量内容,例如:
{'unigram:n': 0.0783132530120482}
很好,我认为这是正确的数字(n 出现的次数超过字母总数)但我希望它是按单词而不是按字母。
现在,我也希望它通过双字母来完成,一旦我可以通过单个单词让它工作,制作双字可能会很容易,但我不太明白,所以他们的一些指导会很好。
谢谢。
nltk.FreqDist
的输入应该是 字符串列表 ,而不仅仅是一个字符串。查看区别:
>>> import nltk
>>> uni_dist = nltk.FreqDist(['the', 'dog', 'went', 'to', 'the', 'park'])
>>> uni_dist
FreqDist({'the': 2, 'went': 1, 'park': 1, 'dog': 1, 'to': 1})
>>> uni_dist2 = nltk.FreqDist('the dog went to the park')
>>> uni_dist2
FreqDist({' ': 5, 't': 4, 'e': 3, 'h': 2, 'o': 2, 'a': 1, 'd': 1, 'g': 1, 'k': 1, 'n': 1, ...})
您可以使用 split 将字符串转换为单个单词的列表。
旁注:我认为您可能希望在 p[i]
上调用 nltk.FreqDist
而不是 p[0]
。
代码:
def add_lexical_features(fdist, feature_vector):
for word, freq in fdist.items():
fname = "unigram:{0}".format(word)
if selected_features == None or fname in selected_features:
feature_vector[fname] = 1
if selected_features == None or fname in selected_features:
feature_vector[fname] = float(freq) / fdist.N()
print(feature_vector)
if __name__ == '__main__':
file_name = "restaurant-training.data"
p = process_reviews(file_name)
for i in range(0, len(p)):
print(p[i]+ "\n")
uni_dist = nltk.FreqDist(p[0])
feature_vector = {}
x = add_lexical_features(uni_dist, feature_vector)
它试图做的是输出评论列表中单词的频率(p 是评论列表,p[0] 是字符串)。这行得通....除了它是通过字母而不是我的话来实现的。
我还是 NLTK 的新手,所以这可能很明显,但我真的无法理解。
例如,这当前会输出大量内容,例如:
{'unigram:n': 0.0783132530120482}
很好,我认为这是正确的数字(n 出现的次数超过字母总数)但我希望它是按单词而不是按字母。
现在,我也希望它通过双字母来完成,一旦我可以通过单个单词让它工作,制作双字可能会很容易,但我不太明白,所以他们的一些指导会很好。
谢谢。
nltk.FreqDist
的输入应该是 字符串列表 ,而不仅仅是一个字符串。查看区别:
>>> import nltk
>>> uni_dist = nltk.FreqDist(['the', 'dog', 'went', 'to', 'the', 'park'])
>>> uni_dist
FreqDist({'the': 2, 'went': 1, 'park': 1, 'dog': 1, 'to': 1})
>>> uni_dist2 = nltk.FreqDist('the dog went to the park')
>>> uni_dist2
FreqDist({' ': 5, 't': 4, 'e': 3, 'h': 2, 'o': 2, 'a': 1, 'd': 1, 'g': 1, 'k': 1, 'n': 1, ...})
您可以使用 split 将字符串转换为单个单词的列表。
旁注:我认为您可能希望在 p[i]
上调用 nltk.FreqDist
而不是 p[0]
。