计算Python并根据结果创建矩阵

时间:2017-02-03 03:17:34

标签: python numpy matrix nltk counting

我有一套我关心计数的标签。我们说它们是:

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)

2 个答案:

答案 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

希望我已经制定了一个你可以遵循的方法,但更重要的是要理解。我试图为您提供一些选项来完成一些任务,让您在自己学习更多内容时感受到可能性。