从python 3中的用户输入计算bigrams?

Jef*_*ton 3 python python-3.x

我被困住了,需要一点指导.我正在努力使用Grok Learning自己学习Python.下面是问题和示例输出以及我在代码中的位置.我感谢任何有助于我解决此问题的提示.

在语言学中,二元组是句子中的一对相邻单词.句子" 大红球 "有三首大佬:大红色,大红色和红色球.

编写一个程序来读取来自用户的多行输入,其中每一行是一个以空格分隔的单词.然后,您的程序应该计算所有输入句子中每个双字母组合出现的次数.应通过将输入行转换为小写来以不区分大小写的方式处理双字母组.一旦用户停止输入输入,您的程序应打印出多次出现的每个双字母组及其相应的频率.例如:

Line: The big red ball
Line: The big red ball is near the big red box
Line: I am near the box
Line: 
near the: 2
red ball: 2
the big: 3
big red: 3
Run Code Online (Sandbox Code Playgroud)

我的代码并没有走得太远,我真的陷入困境.但这就是我的位置:

words = set()
line = input("Line: ")
while line != '':
  words.add(line)
  line = input("Line: ")
Run Code Online (Sandbox Code Playgroud)

我甚至这样做了吗?尽量不要导入任何模块,只需使用内置功能.

谢谢,杰夫

ran*_*mir 6

让我们从接收句子(带标点符号)的函数开始,并返回找到的所有小写双字母组的列表.

因此,我们首先需要从句子中删除所有非字母数字,将所有字母转换为小写对应字符,然后将空格分隔为单词列表:

import re

def bigrams(sentence):
    text = re.sub('\W', ' ', sentence.lower())
    words = text.split()
    return zip(words, words[1:])
Run Code Online (Sandbox Code Playgroud)

我们将使用标准(内置)re包进行基于正则表达式的非字母数字替换空格,以及内置zip函数来配置连续单词.(我们将单词列表与相同的列表配对,但是移动了一个元素.)

现在我们可以测试一下:

>>> bigrams("The big red ball")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
>>> bigrams("THE big, red, ball.")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
>>> bigrams(" THE  big,red,ball!!?")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
Run Code Online (Sandbox Code Playgroud)

接下来,为了计算每个句子中的bigrams,你可以使用collections.Counter.

例如,像这样:

from collections import Counter

counts = Counter()
for line in ["The big red ball", "The big red ball is near the big red box", "I am near the box"]:
    counts.update(bigrams(line))
Run Code Online (Sandbox Code Playgroud)

我们得到:

>>> Counter({('the', 'big'): 3, ('big', 'red'): 3, ('red', 'ball'): 2, ('near', 'the'): 2, ('red', 'box'): 1, ('i', 'am'): 1, ('the', 'box'): 1, ('ball', 'is'): 1, ('am', 'near'): 1, ('is', 'near'): 1})
Run Code Online (Sandbox Code Playgroud)

现在我们只需要打印出现不止一次的那些:

for bigr, cnt in counts.items():
    if cnt > 1:
        print("{0[0]} {0[1]}: {1}".format(bigr, cnt))
Run Code Online (Sandbox Code Playgroud)

全部放在一起,带有一个用户输入循环,而不是固定列表:

import re
from collections import Counter

def bigrams(sentence):
    text = re.sub('\W', ' ', sentence.lower())
    words = text.split()
    return zip(words, words[1:])

counts = Counter()
while True:
    line = input("Line: ")
    if not line:
        break
    counts.update(bigrams(line))

for bigr, cnt in counts.items():
    if cnt > 1:
        print("{0[0]} {0[1]}: {1}".format(bigr, cnt))
Run Code Online (Sandbox Code Playgroud)

输出:

Line: The big red ball
Line: The big red ball is near the big red box
Line: I am near the box
Line: 
near the: 2
red ball: 2
big red: 3
the big: 3
Run Code Online (Sandbox Code Playgroud)