2

冗長なテキストをどのように削減しますか? たとえば、2 つの入力があり、それらを次の出力に減らす必要があります。

入力 1:トヨタは赤です。ホンダは赤。BMWは赤です。メルセデスは緑。

出力 1:トヨタ、ホンダ、BMW は赤ですが、メルセデスは緑です。

入力 2:トヨタは赤です。ホンダは赤。BMWは赤です。メルセデスは赤です。

出力 2:すべての車は赤です。

これはNLPの問題だと思います。私は理想的には Python でこれを行いたいと思っています (ただし、他の言語も同様に優れており、開発の単純さが優先されます)。

4

2 に答える 2

3

私があなたの質問にコメントしたように: まず、ある種の文法を定義する必要があると思います。たとえば、単純な割り当てステートメント: The <variable> is <value>.. 最初の行の小さな例を作成しました。次の行でも同じことができます。

import re

def reducer(text):  # Catch statements and add them to a dictionary
    catched = dict()
    for v, k in re.findall(r'The\s(?P<variable>\w+)\sis\s(?P<value>\w+)', text):
        try:
            catched[k].append(v)
        except KeyError:
            catched[k] = [v]
    return catched

def comma_and(ls):  # Create human-like enumeration with words
    output = [ls[0]]
    for i in xrange(1, len(ls)):
        output.append('%s%s' % (' and ' if i == len(ls) - 1 else ', ', ls[i]))
    return ''.join(output)

def rephrase(text):  # Rephrase separated statements into one sentence
    stmnts = reducer(text)
    part1 = str()
    part2 = str()
    for key in stmnts:
        if len(stmnts[key]) <= 1:
            part2 = 'but the {variable} is {value}.'.format(
                variable=stmnts[key][0], value=key)
        else:
            part1 = 'The {variables} are {value}'.format(
                variables=comma_and(stmnts[key]), value=key)
    print part1 + ' ' + part2

デモ:

rephraser('The Toyota is red. The Honda is red. The BMW is red. The Mercedes is green.')

出力は次のとおりです。

# The Toyota, Honda and BMW are red but the Mercedes is green.

次の行は次のようなものです: 辞書catchedにキーが 1 つしかないかどうかを確認し、そのキーの値がすべて車の場合、All <type> are <value>.

于 2013-05-25T23:16:14.443 に答える