我有一套我关心计数的标签。我们说它们是:
pos_tags = ["NN", "NNS", "JJ"]
我希望我的程序遍历一个可能如下所示的句子列表:
sents = ["I want to go home.", "I have five dollars.", "The grass is green and wet."]
我使用nltk.pos_tag标记每个单词,结果为:
['I', 'want', 'to', 'go', 'home', '.']
[('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('go', 'VB'), ('home', 'NN'), ('.', '.')]
['I', 'have', 'five', 'dollars', '.']
[('I', 'PRP'), ('have', 'VBP'), ('five', 'CD'), ('dollars', 'NNS'), ('.', '.')]
['The', 'grass', 'is', 'green', 'and', 'wet', '.']
[('The', 'DT'), ('grass', 'NN'), ('is', 'VBZ'), ('green', 'JJ'), ('and', 'CC'), ('wet', 'NN'), ('.', '.')]
我想检查这里是否有任何有pos_tags的词,我想我似乎已经完成了;但是,我在以我想要的形式返回结果时遇到了很多麻烦,这是一种矩阵式。
行将是句子的数量。在这种情况下,3。列将是标签的数量。在这种情况下,也是3。
最终结果如下:
[1, 0, 0
0, 1, 0
2, 0, 1]
这是我到目前为止所做的:
def tagging(sents):
matrix = []
pos_tags = ["NN", "NNS", "JJ"]
for sent in sents:
tokens = nltk.word_tokenize(sent)
tagged_tokens = nltk.pos_tag(tokens)
tagged_tokens_final = tagged_tokens
for key, val in tagged_tokens_final:
if val in common_pos_tags:
counting = val.count(val)
答案 0 :(得分:2)
Python,Libs中有各种Matrix类型,但我只列出了列表
final RecyclerView.LayoutManager mLayoutManager =new GridLayoutManager(getContext(), 1);
recyclerView_drawer.setLayoutManager(mLayoutManager);
recyclerView_drawer.setItemAnimator(new DefaultItemAnimator());
recyclerView_drawer.setAdapter(drawerAdapter);
嵌套列表理解在这里构建列表列表很好
s1 = ['I', 'want', 'to', 'go', 'home', '.']
ts1 = [('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('go', 'VB'), ('home', 'NN'), ('.', '.')]
s2 = ['I', 'have', 'five', 'dollars', '.']
ts2 = [('I', 'PRP'), ('have', 'VBP'), ('five', 'CD'), ('dollars', 'NNS'), ('.', '.')]
s3 = ['The', 'grass', 'is', 'green', 'and', 'wet', '.']
ts3 = [('The', 'DT'), ('grass', 'NN'), ('is', 'VBZ'), ('green', 'JJ'), ('and', 'CC'), ('wet', 'NN'), ('.', '.')]
pos_tags = ["NN", "NNS", "JJ"]
使元组列表变平 - 但不是最适合性能的
sum(sen,())
Mad Physicist对于快速而肮脏的上述计数标签是正确的,这些标签也是句子中的单词,尊重数据结构会更安全
答案 1 :(得分:1)
有几种不同的方法可以解决这个问题。可能最容易注意到每个句子都是独立于其他句子处理的。因此,您可以将一个句子的所有操作放在一个函数中,然后单独为每个句子运行它:
tags = ['NN', 'NNS', 'JJ']
matrix = [None] * len(sents)
for index, sent in enumerate(sents):
matrix[index] = do_counting(sent, tags)
如果您希望动态扩展矩阵而不是预先分配[None] * len(sents)
,那么您也可以这样做:
matrix = []
for sent in sents:
matrix.append(do_counting(sent, tags))
在这两种情况下,do_counting
都是一个函数,它接收一个句子字符串和一个标签列表,返回矩阵的一行。如果您决定更改您感兴趣的标签的顺序或名称,则标签是输入。输出将始终与输入列表匹配。
解析将使用nltk
完成,就像你已经想到的那样。使用collections.Counter
对象可以很容易地完成计数,这个对象几乎就是为了这个目的而制作的。它将计算每个标签的出现次数。然后,我们可以根据您传入的列表选择我们想要的标签作为第二个参数:
from collections import Counter
def do_counting(sentence, tags)
tokens = nltk.word_tokenize(sent)
tagged_tokens = nltk.pos_tag(tokens)
counts = Counter(tag for _, tag in tagged_tokens)
tag_counts = [counts[tag] for tag in tags]
return tag_counts
请注意,为了计算,我忽略了令牌。 _
是Python中的有效变量名,但通常用于指示丢弃的参数。该计数器可以写成
counts = Counter(item[0] for item in tagged_tokens)
自己进行计数而不是使用Counter
:
def do_counting(sentence, tags)
tokens = nltk.word_tokenize(sent)
tagged_tokens = nltk.pos_tag(tokens)
counts = [sum(items[1] == tag for items in tagged_tokens) for tag in tags]
return counts
希望我已经制定了一个你可以遵循的方法,但更重要的是要理解。我试图为您提供一些选项来完成一些任务,让您在自己学习更多内容时感受到可能性。